Introduce readonly variant of idx
[hiphop-php.git] / hphp / hack / src / naming / naming_special_names.ml
blob291fd3231d8e8e7850c32166b430e0b044c52b74
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 (** Module consisting of the special names known to the typechecker *)
14 module Classes = struct
15 let cParent = "parent"
17 let cStatic = "static"
19 let cSelf = "self"
21 let cUnknown = "\\*Unknown*"
23 (* Used for dynamic classnames, e.g. new $foo(); *)
25 let cAwaitable = "\\HH\\Awaitable"
27 let cGenerator = "\\Generator"
29 let cAsyncGenerator = "\\HH\\AsyncGenerator"
31 let cHHFormatString = "\\HH\\FormatString"
33 let is_format_string x = String.equal x cHHFormatString
35 let cHH_BuiltinEnum = "\\HH\\BuiltinEnum"
37 let cHH_BuiltinEnumClass = "\\HH\\BuiltinEnumClass"
39 let cHH_BuiltinAbstractEnumClass = "\\HH\\BuiltinAbstractEnumClass"
41 let cThrowable = "\\Throwable"
43 let cStdClass = "\\stdClass"
45 let cDateTime = "\\DateTime"
47 let cDateTimeImmutable = "\\DateTimeImmutable"
49 let cAsyncIterator = "\\HH\\AsyncIterator"
51 let cAsyncKeyedIterator = "\\HH\\AsyncKeyedIterator"
53 let cStringish = "\\Stringish"
55 let cStringishObject = "\\StringishObject"
57 let cXHPChild = "\\XHPChild"
59 let cIMemoizeParam = "\\HH\\IMemoizeParam"
61 let cUNSAFESingletonMemoizeParam = "\\HH\\UNSAFESingletonMemoizeParam"
63 let cClassname = "\\HH\\classname"
65 let cTypename = "\\HH\\typename"
67 let cIDisposable = "\\IDisposable"
69 let cIAsyncDisposable = "\\IAsyncDisposable"
71 let cMemberOf = "\\HH\\MemberOf"
73 let cEnumClassLabel = "\\HH\\EnumClass\\Label"
75 (* Classes that can be spliced into ExpressionTrees *)
76 let cSpliceable = "\\Spliceable"
77 end
79 module Collections = struct
80 (* concrete classes *)
81 let cVector = "\\HH\\Vector"
83 let cMutableVector = "\\MutableVector"
85 let cImmVector = "\\HH\\ImmVector"
87 let cSet = "\\HH\\Set"
89 let cConstSet = "\\ConstSet"
91 let cMutableSet = "\\MutableSet"
93 let cImmSet = "\\HH\\ImmSet"
95 let cMap = "\\HH\\Map"
97 let cMutableMap = "\\MutableMap"
99 let cImmMap = "\\HH\\ImmMap"
101 let cPair = "\\HH\\Pair"
103 (* interfaces *)
104 let cContainer = "\\HH\\Container"
106 let cKeyedContainer = "\\HH\\KeyedContainer"
108 let cTraversable = "\\HH\\Traversable"
110 let cKeyedTraversable = "\\HH\\KeyedTraversable"
112 let cCollection = "\\Collection"
114 let cConstVector = "\\ConstVector"
116 let cConstMap = "\\ConstMap"
118 let cConstCollection = "\\ConstCollection"
120 let cAnyArray = "\\HH\\AnyArray"
122 let cDict = "\\HH\\dict"
124 let cVec = "\\HH\\vec"
126 let cKeyset = "\\HH\\keyset"
129 module Members = struct
130 let mGetInstanceKey = "getInstanceKey"
132 let mClass = "class"
134 let __construct = "__construct"
136 let __destruct = "__destruct"
138 let __call = "__call"
140 let __callStatic = "__callStatic"
142 let __clone = "__clone"
144 let __debugInfo = "__debugInfo"
146 let __dispose = "__dispose"
148 let __disposeAsync = "__disposeAsync"
150 let __get = "__get"
152 let __invoke = "__invoke"
154 let __isset = "__isset"
156 let __set = "__set"
158 let __set_state = "__set_state"
160 let __sleep = "__sleep"
162 let __toString = "__toString"
164 let __unset = "__unset"
166 let __wakeup = "__wakeup"
168 let as_set =
169 List.fold_right
170 ~f:SSet.add
171 ~init:SSet.empty
173 __construct;
174 __destruct;
175 __call;
176 __callStatic;
177 __clone;
178 __debugInfo;
179 __dispose;
180 __disposeAsync;
181 __get;
182 __invoke;
183 __isset;
184 __set;
185 __set_state;
186 __sleep;
187 __toString;
188 __unset;
189 __wakeup;
192 let as_lowercase_set = SSet.map String.lowercase as_set
194 (* Any data- or aria- attribute is always valid, even if it is not declared
195 * for a given XHP element *)
196 let is_special_xhp_attribute s =
197 String_utils.string_starts_with s ":data-"
198 || String_utils.string_starts_with s ":aria-"
201 module AttributeKinds = struct
202 let cls = "\\HH\\ClassAttribute"
204 let enum = "\\HH\\EnumAttribute"
206 let typealias = "\\HH\\TypeAliasAttribute"
208 let fn = "\\HH\\FunctionAttribute"
210 let mthd = "\\HH\\MethodAttribute"
212 let instProperty = "\\HH\\InstancePropertyAttribute"
214 let staticProperty = "\\HH\\StaticPropertyAttribute"
216 let parameter = "\\HH\\ParameterAttribute"
218 let typeparam = "\\HH\\TypeParameterAttribute"
220 let file = "\\HH\\FileAttribute"
222 let typeconst = "\\HH\\TypeConstantAttribute"
224 let lambda = "\\HH\\LambdaAttribute"
226 let enumcls = "\\HH\\EnumClassAttribute"
228 let plain_english_map =
229 List.fold_left
230 ~init:SMap.empty
231 ~f:(fun acc (k, v) -> SMap.add k v acc)
233 (cls, "a class");
234 (enum, "an enum");
235 (typealias, "a typealias");
236 (fn, "a function");
237 (mthd, "a method");
238 (instProperty, "an instance property");
239 (staticProperty, "a static property");
240 (parameter, "a parameter");
241 (typeparam, "a type parameter");
242 (file, "a file");
243 (typeconst, "a type constant");
244 (lambda, "a lambda expression");
245 (enumcls, "an enum class");
249 module UserAttributes = struct
250 let uaOverride = "__Override"
252 let uaConsistentConstruct = "__ConsistentConstruct"
254 let uaConst = "__Const"
256 let uaDeprecated = "__Deprecated"
258 let uaEntryPoint = "__EntryPoint"
260 let uaMemoize = "__Memoize"
262 let uaMemoizeLSB = "__MemoizeLSB"
264 let uaPolicyShardedMemoize = "__PolicyShardedMemoize"
266 let uaPolicyShardedMemoizeLSB = "__PolicyShardedMemoizeLSB"
268 let uaPHPStdLib = "__PHPStdLib"
270 let uaAcceptDisposable = "__AcceptDisposable"
272 let uaReturnDisposable = "__ReturnDisposable"
274 let uaLSB = "__LSB"
276 let uaSealed = "__Sealed"
278 let uaLateInit = "__LateInit"
280 let uaNewable = "__Newable"
282 let uaEnforceable = "__Enforceable"
284 let uaExplicit = "__Explicit"
286 let uaNonDisjoint = "__NonDisjoint"
288 let uaSoft = "__Soft"
290 let uaWarn = "__Warn"
292 let uaMockClass = "__MockClass"
294 let uaProvenanceSkipFrame = "__ProvenanceSkipFrame"
296 let uaDynamicallyCallable = "__DynamicallyCallable"
298 let uaDynamicallyConstructible = "__DynamicallyConstructible"
300 let uaReifiable = "__Reifiable"
302 let uaNeverInline = "__NEVER_INLINE"
304 let uaDisableTypecheckerInternal = "__DisableTypecheckerInternal"
306 let uaHasTopLevelCode = "__HasTopLevelCode"
308 let uaIsFoldable = "__IsFoldable"
310 let uaNative = "__Native"
312 let uaOutOnly = "__OutOnly"
314 let uaAlwaysInline = "__ALWAYS_INLINE"
316 let uaEnableUnstableFeatures = "__EnableUnstableFeatures"
318 let uaEnumClass = "__EnumClass"
320 let uaPolicied = "__Policied"
322 let uaInferFlows = "__InferFlows"
324 let uaExternal = "__External"
326 let uaCanCall = "__CanCall"
328 let uaViaLabel = "__ViaLabel"
330 let uaSupportDynamicType = "__SupportDynamicType"
332 let uaRequireDynamic = "__RequireDynamic"
334 let uaModule = "__Module"
336 let uaInternal = "__Internal"
338 let uaEnableMethodTraitDiamond = "__EnableMethodTraitDiamond"
340 let as_map =
341 AttributeKinds.(
342 SMap.of_list
344 (uaOverride, [mthd]);
345 (uaConsistentConstruct, [cls]);
346 (uaConst, [cls; instProperty; parameter; staticProperty]);
347 (uaDeprecated, [fn; mthd]);
348 (uaEntryPoint, [fn]);
349 (uaMemoize, [fn; mthd]);
350 (uaMemoizeLSB, [mthd]);
351 (uaPolicyShardedMemoize, [fn; mthd]);
352 (uaPolicyShardedMemoizeLSB, [mthd]);
353 (uaPHPStdLib, [cls; fn; mthd]);
354 (uaAcceptDisposable, [parameter]);
355 (uaReturnDisposable, [fn; mthd; lambda]);
356 (uaLSB, [staticProperty]);
357 (uaSealed, [cls; enumcls; enum]);
358 (uaLateInit, [instProperty; staticProperty]);
359 (uaNewable, [typeparam]);
360 (uaEnforceable, [typeconst; typeparam]);
361 (uaExplicit, [typeparam]);
362 (uaNonDisjoint, [typeparam]);
363 (uaSoft, [instProperty; parameter; staticProperty; typeparam]);
364 (uaWarn, [typeparam]);
365 (uaMockClass, [cls]);
366 (uaProvenanceSkipFrame, [fn; mthd; lambda]);
367 (uaDynamicallyCallable, [fn; mthd]);
368 (uaDynamicallyConstructible, [cls]);
369 (uaReifiable, [typeconst]);
370 (uaNeverInline, [fn; mthd]);
371 (uaDisableTypecheckerInternal, [fn; mthd]);
372 (uaEnableUnstableFeatures, [file]);
373 (uaEnumClass, [cls; enumcls]);
374 (uaPolicied, [fn; mthd; instProperty; parameter]);
375 (uaInferFlows, [fn; mthd]);
376 (uaExternal, [parameter]);
377 (uaCanCall, [parameter]);
378 (uaViaLabel, [parameter]);
379 (uaSupportDynamicType, [fn; cls; mthd]);
380 (uaRequireDynamic, [typeparam]);
381 (uaModule, [fn; cls; file; typealias; enum; enumcls]);
382 ( uaInternal,
385 mthd;
386 cls;
387 instProperty;
388 staticProperty;
389 typealias;
390 enum;
391 enumcls;
392 ] );
393 (uaEnableMethodTraitDiamond, [cls]);
396 (* These are names which are allowed in the systemlib but not in normal programs *)
397 let systemlib_map =
398 AttributeKinds.(
399 SMap.of_list
401 (uaAlwaysInline, [fn; mthd]);
402 (uaIsFoldable, [fn; mthd]);
403 (uaNative, [fn; mthd]);
404 (uaOutOnly, [parameter]);
407 let is_reserved name = String.is_prefix name ~prefix:"__"
410 (* Tested before \\-prepending name-canonicalization *)
411 module SpecialFunctions = struct
412 let echo = "echo" (* pseudo-function *)
414 let hhas_adata = "__hhas_adata"
416 let is_special_function =
417 let all_special_functions = HashSet.of_list [echo; hhas_adata] in
418 (fun x -> HashSet.mem all_special_functions x)
421 (* There are a number of functions that are automatically imported into the
422 * namespace. The full list can be found in hh_autoimport.ml.
424 module AutoimportedFunctions = struct
425 let invariant_violation = "\\HH\\invariant_violation"
427 let invariant = "\\HH\\invariant"
429 let fun_ = "\\HH\\fun"
431 let inst_meth = "\\HH\\inst_meth"
433 let class_meth = "\\HH\\class_meth"
435 let meth_caller = "\\HH\\meth_caller"
438 module SpecialIdents = struct
439 let this = "$this"
441 let placeholder = "$_"
443 let dollardollar = "$$"
445 (* Intentionally using an invalid variable name to ensure it's translated *)
446 let tmp_var_prefix = "__tmp$"
448 let is_tmp_var name =
449 String.length name > 6 && String.(sub name ~pos:0 ~len:6 = tmp_var_prefix)
451 let assert_tmp_var name = assert (is_tmp_var name)
454 (* PseudoFunctions are functions (or items that are parsed like functions)
455 * that are treated like builtins that do not have a public HHI or interface.
457 module PseudoFunctions = struct
458 let isset = "\\isset"
460 let unset = "\\unset"
462 let hh_show = "\\hh_show"
464 let hh_show_env = "\\hh_show_env"
466 let hh_log_level = "\\hh_log_level"
468 let hh_force_solve = "\\hh_force_solve"
470 let hh_loop_forever = "\\hh_loop_forever"
472 let echo = "\\echo"
474 let empty = "\\empty"
476 let exit = "\\exit"
478 let die = "\\die"
480 let unsafe_cast = "\\HH\\FIXME\\UNSAFE_CAST"
482 let enforced_cast = "\\HH\\FIXME\\ENFORCED_CAST"
484 let all_pseudo_functions =
485 HashSet.of_list
487 isset;
488 unset;
489 hh_show;
490 hh_show_env;
491 hh_log_level;
492 hh_force_solve;
493 hh_loop_forever;
494 echo;
495 empty;
496 exit;
497 die;
498 unsafe_cast;
501 let is_pseudo_function x = HashSet.mem all_pseudo_functions x
504 module StdlibFunctions = struct
505 let is_null = "\\is_null"
507 let get_class = "\\get_class"
509 let call_user_func = "\\call_user_func"
511 let type_structure = "\\HH\\type_structure"
513 let array_mark_legacy = "\\HH\\array_mark_legacy"
515 let array_unmark_legacy = "\\HH\\array_unmark_legacy"
517 let is_php_array = "\\HH\\is_php_array"
519 let is_any_array = "\\HH\\is_any_array"
521 let is_dict_or_darray = "\\HH\\is_dict_or_darray"
523 let is_vec_or_varray = "\\HH\\is_vec_or_varray"
525 (* All Id funcions that Typing.dispatch_call handles specially *)
526 let special_dispatch =
527 String.Hash_set.of_list
528 ~growth_allowed:false
530 SpecialFunctions.echo;
531 PseudoFunctions.isset;
532 PseudoFunctions.unset;
533 type_structure;
534 PseudoFunctions.unsafe_cast;
537 let needs_special_dispatch x = Hash_set.mem special_dispatch x
540 module Typehints = struct
541 let null = "null"
543 let void = "void"
545 let resource = "resource"
547 let num = "num"
549 let arraykey = "arraykey"
551 let noreturn = "noreturn"
553 let mixed = "mixed"
555 let nonnull = "nonnull"
557 let this = "this"
559 let dynamic = "dynamic"
561 let supportdynamic = "supportdynamic"
563 let nothing = "nothing"
565 let int = "int"
567 let bool = "bool"
569 let float = "float"
571 let string = "string"
573 let darray = "darray"
575 let varray = "varray"
577 let varray_or_darray = "varray_or_darray"
579 let vec_or_dict = "vec_or_dict"
581 let callable = "callable"
583 let wildcard = "_"
585 let is_reserved_type_hint =
586 let reserved_typehints =
587 HashSet.of_list
589 null;
590 void;
591 resource;
592 num;
593 arraykey;
594 noreturn;
595 mixed;
596 nonnull;
597 this;
598 dynamic;
599 supportdynamic;
600 nothing;
601 int;
602 bool;
603 float;
604 string;
605 darray;
606 varray;
607 varray_or_darray;
608 vec_or_dict;
609 callable;
610 wildcard;
613 (fun x -> HashSet.mem reserved_typehints x)
615 let is_reserved_global_name x =
616 String.equal x callable
617 || String.equal x Classes.cSelf
618 || String.equal x Classes.cParent
620 let is_reserved_hh_name x =
621 String.equal x void
622 || String.equal x noreturn
623 || String.equal x int
624 || String.equal x bool
625 || String.equal x float
626 || String.equal x num
627 || String.equal x string
628 || String.equal x resource
629 || String.equal x mixed
630 || String.equal x arraykey
631 || String.equal x dynamic
632 || String.equal x supportdynamic
633 || String.equal x wildcard
634 || String.equal x null
635 || String.equal x nonnull
636 || String.equal x nothing
637 || String.equal x this
639 let is_namespace_with_reserved_hh_name x =
640 let unqualify qualified_name =
641 let as_list = Str.split (Str.regexp "\\") qualified_name in
642 let as_list = List.filter as_list ~f:(fun s -> not (String.equal s "")) in
643 match List.rev as_list with
644 | name :: qualifiers -> (List.rev qualifiers, name)
645 | [] -> ([], qualified_name)
647 let is_HH qualifier =
648 match qualifier with
649 | [qual] -> String.equal qual "HH"
650 | _ -> false
652 let (qualifier, name) = unqualify x in
653 name |> is_reserved_hh_name
654 && (not (List.is_empty qualifier))
655 && not (qualifier |> is_HH)
658 module PseudoConsts = struct
659 let g__LINE__ = "\\__LINE__"
661 let g__CLASS__ = "\\__CLASS__"
663 let g__TRAIT__ = "\\__TRAIT__"
665 let g__FILE__ = "\\__FILE__"
667 let g__DIR__ = "\\__DIR__"
669 let g__FUNCTION__ = "\\__FUNCTION__"
671 let g__METHOD__ = "\\__METHOD__"
673 let g__NAMESPACE__ = "\\__NAMESPACE__"
675 let g__COMPILER_FRONTEND__ = "\\__COMPILER_FRONTEND__"
677 let g__FUNCTION_CREDENTIAL__ = "\\__FUNCTION_CREDENTIAL__"
679 (* exit and die are not pseudo consts, but they are currently parsed as such.
680 * Would be more correct to parse them as special statements like return
682 let exit = "\\exit"
684 let die = "\\die"
686 let all_pseudo_consts =
687 HashSet.of_list
689 g__LINE__;
690 g__CLASS__;
691 g__TRAIT__;
692 g__FILE__;
693 g__DIR__;
694 g__FUNCTION__;
695 g__METHOD__;
696 g__NAMESPACE__;
697 g__COMPILER_FRONTEND__;
698 g__FUNCTION_CREDENTIAL__;
699 exit;
700 die;
703 let is_pseudo_const x = HashSet.mem all_pseudo_consts x
706 module FB = struct
707 let cEnum = "\\Enum"
709 let tInner = "TInner"
711 let idx = "\\HH\\idx"
713 let cTypeStructure = "\\HH\\TypeStructure"
715 let cIncorrectType = "\\HH\\INCORRECT_TYPE"
718 module HH = struct
719 let contains = "\\HH\\Lib\\C\\contains"
721 let contains_key = "\\HH\\Lib\\C\\contains_key"
724 module Shapes = struct
725 let cShapes = "\\HH\\Shapes"
727 let idx = "idx"
729 let at = "at"
731 let keyExists = "keyExists"
733 let removeKey = "removeKey"
735 let toArray = "toArray"
737 let toDict = "toDict"
740 module Superglobals = struct
741 let globals = "$GLOBALS"
743 let is_superglobal =
744 let superglobals =
745 HashSet.of_list
747 "$_SERVER";
748 "$_GET";
749 "$_POST";
750 "$_FILES";
751 "$_COOKIE";
752 "$_REQUEST";
753 "$_ENV";
756 (fun x -> HashSet.mem superglobals x)
759 module Regex = struct
760 let tPattern = "\\HH\\Lib\\Regex\\Pattern"
763 (* These are functions treated by the emitter specially. They are not
764 * autoimported (see hh_autoimport.ml) nor are they consider PseudoFunctions
765 * so they can be overridden by namespacing (at least currently)
767 module EmitterSpecialFunctions = struct
768 let eval = "\\eval"
770 let set_frame_metadata = "\\HH\\set_frame_metadata"
772 let systemlib_reified_generics = "\\__systemlib_reified_generics"
775 module XHP = struct
776 let pcdata = "pcdata"
778 let any = "any"
780 let empty = "empty"
782 let is_reserved name =
783 String.equal name pcdata || String.equal name any || String.equal name empty
785 let is_xhp_category name = String_utils.string_starts_with name "%"
788 (* This should be a subset of rust_parser_errors::UnstableFeatures that is relevant
789 * to the typechecker *)
790 module UnstableFeatures = struct
791 let coeffects_provisional = "coeffects_provisional"
793 let ifc = "ifc"
795 let readonly = "readonly"
797 let expression_trees = "expression_trees"
799 let modules = "modules"
802 module Coeffects = struct
803 let capability = "$#capability"
805 let local_capability = "$#local_capability"
807 let contexts = "\\HH\\Contexts"
809 let unsafe_contexts = contexts ^ "\\Unsafe"
811 let generated_generic_prefix = "T/"
813 let is_generated_generic = String.is_prefix ~prefix:generated_generic_prefix
816 module Readonly = struct
817 let prefix = "\\HH\\Readonly\\"
819 let idx = "\\HH\\idx_readonly"
821 let as_mut = prefix ^ "as_mut"
824 module Capabilities = struct
825 let defaults = Coeffects.contexts ^ "\\defaults"
827 let write_props = Coeffects.contexts ^ "\\write_props"
829 let prefix = "\\HH\\Capabilities\\"
831 let writeProperty = prefix ^ "WriteProperty"
833 let accessGlobals = prefix ^ "AccessGlobals"
835 let readGlobals = prefix ^ "ReadGlobals"
837 let system = prefix ^ "System"
839 let implicitPolicy = prefix ^ "ImplicitPolicy"
841 let implicitPolicyLocal = prefix ^ "ImplicitPolicyLocal"
843 let io = prefix ^ "IO"
845 let rx = prefix ^ "Rx"
847 let rxLocal = rx ^ "Local"
849 let codegen = prefix ^ "Codegen"
852 module ExpressionTrees = struct
853 let makeTree = "makeTree"
855 let intType = "intType"
857 let floatType = "floatType"
859 let boolType = "boolType"
861 let stringType = "stringType"
863 let nullType = "nullType"
865 let voidType = "voidType"
867 let symbolType = "symbolType"
869 let visitInt = "visitInt"
871 let visitFloat = "visitFloat"
873 let visitBool = "visitBool"
875 let visitString = "visitString"
877 let visitNull = "visitNull"
879 let visitBinop = "visitBinop"
881 let visitUnop = "visitUnop"
883 let visitLocal = "visitLocal"
885 let visitLambda = "visitLambda"
887 let visitGlobalFunction = "visitGlobalFunction"
889 let visitStaticMethod = "visitStaticMethod"
891 let visitCall = "visitCall"
893 let visitAssign = "visitAssign"
895 let visitTernary = "visitTernary"
897 let visitIf = "visitIf"
899 let visitWhile = "visitWhile"
901 let visitReturn = "visitReturn"
903 let visitFor = "visitFor"
905 let visitBreak = "visitBreak"
907 let visitContinue = "visitContinue"
909 let splice = "splice"