Add readonly to decl and function types
[hiphop-php.git] / hphp / hack / src / typing / typing_defs_flags.ml
blob64937f3445a58969927e5db56a80764e7e35b9ca
1 (*
2 * Copyright (c) 2015, Facebook, Inc.
3 * All rights reserved.
5 * This source code is licensed under the MIT license found in the
6 * LICENSE file in the "hack" directory of this source tree.
8 *)
10 open Hh_prelude
12 type fun_type_flags = int
14 type fun_param_flags = int
16 (* Is this bit set in the flags? *)
17 let is_set bit flags = not (Int.equal 0 (Int.bit_and bit flags))
19 (* Set a single bit to a boolean value *)
20 let set_bit bit value flags =
21 if value then
22 Int.bit_or bit flags
23 else
24 Int.bit_and (Int.bit_not bit) flags
26 [@@@ocamlformat "disable"]
28 (* NB: Keep the values of these flags in sync with typing_defs_flags.rs. *)
30 (* Function type flags *)
31 let ft_flags_return_disposable = 1 lsl 0
33 let ft_flags_returns_mutable = 1 lsl 1
35 let ft_flags_returns_void_to_rx = 1 lsl 2
37 let ft_flags_is_coroutine = 1 lsl 3
39 let ft_flags_async = 1 lsl 4
41 let ft_flags_generator = 1 lsl 5
43 (* These flags are used for the self type on FunType and the parameter type on FunParam *)
44 let mutable_flags_owned = 1 lsl 6
46 let mutable_flags_borrowed = 1 lsl 7
48 let mutable_flags_maybe = Int.bit_or mutable_flags_owned mutable_flags_borrowed
50 let mutable_flags_mask = Int.bit_or mutable_flags_owned mutable_flags_borrowed
52 let ft_flags_instantiated_targs = 1 lsl 8
54 let ft_flags_is_function_pointer = 1 lsl 9
56 let ft_flags_returns_readonly = 1 lsl 10
58 let ft_flags_readonly_this = 1 lsl 11
60 (* Class element flags *)
61 let ce_flags_abstract = 1 lsl 0
63 let ce_flags_final = 1 lsl 1
65 let ce_flags_override = 1 lsl 2
67 let ce_flags_lsb = 1 lsl 3
69 let ce_flags_synthesized = 1 lsl 5
71 let ce_flags_const = 1 lsl 6
73 let ce_flags_lateinit = 1 lsl 7
75 let ce_flags_dynamicallycallable = 1 lsl 8
77 (* Three bits used to encode optional XHP attr.
78 * Set 1<<10 (0x400) if xa_has_default=true
79 * Then encode xa_tag as follows:
80 * Some Required: 1<<11 (0x0800)
81 * Some lateinit: 1<<12 (0x1000)
82 * None: 1<<11 | 1<<12 (0x1800)
83 * If attr is not present at all, then masking with 0x1800 will produce zero.
85 let ce_flags_xa_has_default = 1 lsl 10
87 let ce_flags_xa_tag_required = 1 lsl 11
89 let ce_flags_xa_tag_lateinit = 1 lsl 12
91 let ce_flags_xa_tag_none = Int.bit_or ce_flags_xa_tag_required ce_flags_xa_tag_lateinit
93 let ce_flags_xa_tag_mask = Int.bit_or ce_flags_xa_tag_required ce_flags_xa_tag_lateinit
95 let ce_flags_readonly_prop = 1 lsl 13
97 (* fun_param flags *)
98 let fp_flags_accept_disposable = 1 lsl 0
100 let fp_flags_inout = 1 lsl 1
102 let fp_flags_has_default = 1 lsl 2
104 let fp_flags_ifc_external = 1 lsl 3
106 let fp_flags_ifc_can_call = 1 lsl 4
108 let fp_flags_atom = 1 lsl 5
110 (* 6 and 7 are taken by mutability parameters above *)
111 let fp_flags_readonly = 1 lsl 8