From 388dcbb98c762d1d167a09e1939a721ed0862275 Mon Sep 17 00:00:00 2001 From: Vassil Mladenov Date: Tue, 26 Jan 2021 10:47:05 -0800 Subject: [PATCH] Array unification switch Summary: Adds a flag `--array-unification` to hh_single_type_check and `array_unification` to .hhconfig. Naming and typing changes moved to a follow up diff Differential Revision: D26002007 fbshipit-source-id: 1d7ef98173111ae5893b0a283cd8d468c35ca809 --- hphp/hack/src/decl/direct_decl_parser.ml | 12 +++++++++--- hphp/hack/src/decl/direct_decl_parser.mli | 5 +++-- hphp/hack/src/decl/direct_decl_parser.rs | 4 ++++ hphp/hack/src/decl/direct_decl_smart_constructors.rs | 3 +++ hphp/hack/src/decl/rust_decl_ffi.rs | 17 ++++++----------- hphp/hack/src/hh_single_decl.ml | 19 +++++++++++++++++-- hphp/hack/src/hh_single_type_check.ml | 5 +++++ hphp/hack/src/options/globalOptions.ml | 6 ++++++ hphp/hack/src/options/globalOptions.mli | 5 +++++ hphp/hack/src/options/parserOptions.ml | 13 +++++++++++-- hphp/hack/src/options/typecheckerOptions.ml | 2 ++ .../hack/src/oxidized/gen/full_fidelity_parser_env.rs | 3 ++- hphp/hack/src/oxidized/gen/global_options.rs | 3 ++- hphp/hack/src/oxidized/gen/parser_options.rs | 3 ++- hphp/hack/src/oxidized/manual/global_options_impl.rs | 1 + hphp/hack/src/oxidized_by_ref/gen/global_options.rs | 3 ++- .../src/oxidized_by_ref/manual/global_options_impl.rs | 1 + hphp/hack/src/parser/aast_parser.rs | 1 + hphp/hack/src/parser/api/direct_decl_parser.rs | 1 + hphp/hack/src/parser/full_fidelity_parser_env.ml | 6 ++++++ hphp/hack/src/parser/parser_env.rs | 2 ++ hphp/hack/src/providers/decl_service_client.ml | 4 ++++ hphp/hack/src/providers/decl_service_client.mli | 6 +++++- hphp/hack/src/providers/direct_decl_utils.ml | 3 ++- hphp/hack/src/server/serverConfig.ml | 1 + 25 files changed, 103 insertions(+), 26 deletions(-) diff --git a/hphp/hack/src/decl/direct_decl_parser.ml b/hphp/hack/src/decl/direct_decl_parser.ml index 290c5785e9e..a643e70323d 100644 --- a/hphp/hack/src/decl/direct_decl_parser.ml +++ b/hphp/hack/src/decl/direct_decl_parser.ml @@ -10,8 +10,8 @@ type decls = (string * Shallow_decl_defs.decl) list [@@deriving show] type ns_map = (string * string) list external parse_decls_and_mode_ffi : - (* disable_xhp_element_mangling *) - bool -> + (* (disable_xhp_element_mangling, array_unification) *) + bool * bool -> Relative_path.t -> string -> ns_map -> @@ -22,10 +22,16 @@ external decls_hash : decls -> Int64.t = "decls_hash" let parse_decls_ffi (disable_xhp_element_mangling : bool) + (array_unification : bool) (path : Relative_path.t) (text : string) (ns_map : ns_map) : decls = let (decls, _, _) = - parse_decls_and_mode_ffi disable_xhp_element_mangling path text ns_map false + parse_decls_and_mode_ffi + (disable_xhp_element_mangling, array_unification) + path + text + ns_map + false in decls diff --git a/hphp/hack/src/decl/direct_decl_parser.mli b/hphp/hack/src/decl/direct_decl_parser.mli index acafdce1f77..95c6e037e89 100644 --- a/hphp/hack/src/decl/direct_decl_parser.mli +++ b/hphp/hack/src/decl/direct_decl_parser.mli @@ -10,12 +10,13 @@ type decls = (string * Shallow_decl_defs.decl) list [@@deriving show] type ns_map = (string * string) list -val parse_decls_ffi : bool -> Relative_path.t -> string -> ns_map -> decls +val parse_decls_ffi : + bool -> bool -> Relative_path.t -> string -> ns_map -> decls val decls_hash : decls -> Int64.t val parse_decls_and_mode_ffi : - bool -> + bool * bool -> Relative_path.t -> string -> ns_map -> diff --git a/hphp/hack/src/decl/direct_decl_parser.rs b/hphp/hack/src/decl/direct_decl_parser.rs index 3f53c496c24..aefe971fd58 100644 --- a/hphp/hack/src/decl/direct_decl_parser.rs +++ b/hphp/hack/src/decl/direct_decl_parser.rs @@ -16,6 +16,7 @@ use stack_limit::StackLimit; pub fn parse_decls_and_mode<'a>( disable_xhp_element_mangling: bool, + array_unification: bool, filename: RelativePath, text: &'a [u8], auto_namespace_map: &'a BTreeMap, @@ -25,6 +26,7 @@ pub fn parse_decls_and_mode<'a>( let text = SourceText::make(RcOc::new(filename), text); let mut parser_env = ParserEnv::default(); parser_env.disable_xhp_element_mangling = disable_xhp_element_mangling; + parser_env.array_unification = array_unification; let (_, _errors, state, mode) = direct_decl_parser::parse_script(&text, parser_env, auto_namespace_map, arena, stack_limit); (state.decls, mode) @@ -32,6 +34,7 @@ pub fn parse_decls_and_mode<'a>( pub fn parse_decls<'a>( disable_xhp_element_mangling: bool, + array_unification: bool, filename: RelativePath, text: &'a [u8], auto_namespace_map: &'a BTreeMap, @@ -40,6 +43,7 @@ pub fn parse_decls<'a>( ) -> Decls<'a> { parse_decls_and_mode( disable_xhp_element_mangling, + array_unification, filename, text, auto_namespace_map, diff --git a/hphp/hack/src/decl/direct_decl_smart_constructors.rs b/hphp/hack/src/decl/direct_decl_smart_constructors.rs index 2858e29ced6..9c3106544a7 100644 --- a/hphp/hack/src/decl/direct_decl_smart_constructors.rs +++ b/hphp/hack/src/decl/direct_decl_smart_constructors.rs @@ -66,6 +66,7 @@ pub struct DirectDeclSmartConstructors<'a> { pub arena: &'a bumpalo::Bump, pub decls: Decls<'a>, pub disable_xhp_element_mangling: bool, + pub array_unification: bool, filename: &'a RelativePath<'a>, file_mode: Mode, namespace_builder: Rc>, @@ -80,6 +81,7 @@ impl<'a> DirectDeclSmartConstructors<'a> { src: &SourceText<'a>, file_mode: Mode, disable_xhp_element_mangling: bool, + array_unification: bool, auto_namespace_map: &'a NamespaceMap, arena: &'a Bump, ) -> Self { @@ -96,6 +98,7 @@ impl<'a> DirectDeclSmartConstructors<'a> { filename: arena.alloc(filename), file_mode, disable_xhp_element_mangling, + array_unification, decls: Decls::empty(), namespace_builder: Rc::new(NamespaceBuilder::new_in( auto_namespace_map, diff --git a/hphp/hack/src/decl/rust_decl_ffi.rs b/hphp/hack/src/decl/rust_decl_ffi.rs index 7b863c338f7..e8cb032fe58 100644 --- a/hphp/hack/src/decl/rust_decl_ffi.rs +++ b/hphp/hack/src/decl/rust_decl_ffi.rs @@ -19,14 +19,14 @@ use stack_limit::{StackLimit, KI, MI, STACK_SLACK_1K}; #[no_mangle] pub unsafe extern "C" fn hh_parse_decls_and_mode_ffi( - disable_xhp_element_mangling: usize, + bool_opts: usize, filename_ptr: usize, text_ptr: usize, ns_map_ptr: usize, include_hash: usize, ) -> usize { fn inner( - disable_xhp_element_mangling: usize, + bool_opts: usize, filename_ptr: usize, text_ptr: usize, ns_map_ptr: usize, @@ -36,8 +36,8 @@ pub unsafe extern "C" fn hh_parse_decls_and_mode_ffi( let include_hash = unsafe { bool::from_ocaml(include_hash).unwrap() }; // SAFETY: We trust we've been handed a valid, immutable OCaml value - let disable_xhp_element_mangling = - unsafe { bool::from_ocaml(disable_xhp_element_mangling).unwrap() }; + let (disable_xhp_element_mangling, array_unification) = + unsafe { <(bool, bool)>::from_ocaml(bool_opts).unwrap() }; let make_retryable = move || { move |stack_limit: &StackLimit, _nonmain_stack_size: Option| { @@ -58,6 +58,7 @@ pub unsafe extern "C" fn hh_parse_decls_and_mode_ffi( let (decls, mode) = parse_decls_and_mode( disable_xhp_element_mangling, + array_unification, filename, &text, &ns_map, @@ -113,13 +114,7 @@ pub unsafe extern "C" fn hh_parse_decls_and_mode_ffi( } } ocamlrep_ocamlpool::catch_unwind(|| { - inner( - disable_xhp_element_mangling, - filename_ptr, - text_ptr, - ns_map_ptr, - include_hash, - ) + inner(bool_opts, filename_ptr, text_ptr, ns_map_ptr, include_hash) }) } diff --git a/hphp/hack/src/hh_single_decl.ml b/hphp/hack/src/hh_single_decl.ml index 78236f8da71..96e50a1353b 100644 --- a/hphp/hack/src/hh_single_decl.ml +++ b/hphp/hack/src/hh_single_decl.ml @@ -13,7 +13,8 @@ let popt ~auto_namespace_map ~enable_xhp_class_modifier ~disable_xhp_element_mangling - ~enable_enum_classes = + ~enable_enum_classes + ~array_unification = let po = ParserOptions.default in let po = ParserOptions.with_disable_xhp_element_mangling @@ -25,6 +26,7 @@ let popt ParserOptions.with_enable_xhp_class_modifier po enable_xhp_class_modifier in let po = ParserOptions.with_enable_enum_classes po enable_enum_classes in + let po = ParserOptions.with_array_unification po array_unification in po let init root popt : Provider_context.t = @@ -96,8 +98,14 @@ let compare_decls ctx fn text = let disable_xhp_element_mangling = ParserOptions.disable_xhp_element_mangling popt in + let array_unification = ParserOptions.array_unification popt in let decls = - parse_decls_ffi disable_xhp_element_mangling fn text auto_namespace_map + parse_decls_ffi + disable_xhp_element_mangling + array_unification + fn + text + auto_namespace_map in let decls_str = show_decls (List.rev decls) ^ "\n" in let matched = String.equal decls_str legacy_decls_str in @@ -148,6 +156,7 @@ let () = let enable_xhp_class_modifier = ref false in let disable_xhp_element_mangling = ref false in let enable_enum_classes = ref false in + let array_unification = ref false in let ignored_flag flag = (flag, Arg.Unit (fun _ -> ()), "(ignored)") in let ignored_arg flag = (flag, Arg.String (fun _ -> ()), "(ignored)") in Arg.parse @@ -178,6 +187,10 @@ let () = ( "--enable-enum-classes", Arg.Set enable_enum_classes, "Enable the enum classes extension." ); + ( "--array-unification", + Arg.Set array_unification, + "Treat varray as vec, darray as dict, TODO varray_or_darray as vec_or_dict" + ); (* The following options do not affect the direct decl parser and can be ignored (they are used by hh_single_type_check, and we run hh_single_decl over all of the typecheck test cases). *) @@ -245,12 +258,14 @@ let () = let enable_xhp_class_modifier = !enable_xhp_class_modifier in let disable_xhp_element_mangling = !disable_xhp_element_mangling in let enable_enum_classes = !enable_enum_classes in + let array_unification = !array_unification in let popt = popt ~auto_namespace_map ~enable_xhp_class_modifier ~disable_xhp_element_mangling ~enable_enum_classes + ~array_unification in let ctx = init (Path.dirname file) popt in let file = Relative_path.(create Root (Path.to_string file)) in diff --git a/hphp/hack/src/hh_single_type_check.ml b/hphp/hack/src/hh_single_type_check.ml index 8f256167137..487d9a349c0 100644 --- a/hphp/hack/src/hh_single_type_check.ml +++ b/hphp/hack/src/hh_single_type_check.ml @@ -277,6 +277,7 @@ let parse_options () = let use_direct_decl_parser = ref false in let enable_enum_classes = ref false in let enable_enum_supertyping = ref false in + let array_unification = ref false in let naming_table = ref None in let root = ref None in let sharedmem_config = ref SharedMem.default_config in @@ -640,6 +641,9 @@ let parse_options () = ( "--enable-enum-supertyping", Arg.Set enable_enum_supertyping, "Enable the enum supertyping extension." ); + ( "--array-unification", + Arg.Set array_unification, + "Varray and darray become vec and dict." ); ] in let options = Arg.align ~limit:25 options in @@ -773,6 +777,7 @@ let parse_options () = ~tco_use_direct_decl_parser:!use_direct_decl_parser ~po_enable_enum_classes:!enable_enum_classes ~po_enable_enum_supertyping:!enable_enum_supertyping + ~po_array_unification:!array_unification () in Errors.allowed_fixme_codes_strict := diff --git a/hphp/hack/src/options/globalOptions.ml b/hphp/hack/src/options/globalOptions.ml index 9a04aa5847c..59f70f72815 100644 --- a/hphp/hack/src/options/globalOptions.ml +++ b/hphp/hack/src/options/globalOptions.ml @@ -119,6 +119,7 @@ type t = { tco_use_direct_decl_parser: bool; tco_ifc_enabled: string list; po_enable_enum_supertyping: bool; + po_array_unification: bool; } [@@deriving eq, show] @@ -299,6 +300,7 @@ let default = tco_use_direct_decl_parser = false; tco_ifc_enabled = []; po_enable_enum_supertyping = false; + po_array_unification = false; } let make @@ -431,6 +433,7 @@ let make ?(tco_use_direct_decl_parser = default.tco_use_direct_decl_parser) ?(tco_ifc_enabled = default.tco_ifc_enabled) ?(po_enable_enum_supertyping = default.po_enable_enum_supertyping) + ?(po_array_unification = default.po_array_unification) () = { tco_experimental_features; @@ -544,6 +547,7 @@ let make tco_use_direct_decl_parser; tco_ifc_enabled; po_enable_enum_supertyping; + po_array_unification; } let tco_experimental_feature_enabled t s = @@ -791,3 +795,5 @@ let po_disallow_fun_and_cls_meth_pseudo_funcs t = let tco_use_direct_decl_parser t = t.tco_use_direct_decl_parser let po_enable_enum_supertyping t = t.po_enable_enum_supertyping + +let po_array_unification t = t.po_array_unification diff --git a/hphp/hack/src/options/globalOptions.mli b/hphp/hack/src/options/globalOptions.mli index 118f983e922..5f82446cc9e 100644 --- a/hphp/hack/src/options/globalOptions.mli +++ b/hphp/hack/src/options/globalOptions.mli @@ -295,6 +295,8 @@ type t = { tco_ifc_enabled: string list; (* Enables the enum supertyping extension *) po_enable_enum_supertyping: bool; + (* Treat varray as vec, dict as dict, TODO varray_or_darray as vec_or_dict *) + po_array_unification: bool; } [@@deriving eq, show] @@ -409,6 +411,7 @@ val make : ?tco_use_direct_decl_parser:bool -> ?tco_ifc_enabled:string list -> ?po_enable_enum_supertyping:bool -> + ?po_array_unification:bool -> unit -> t @@ -661,3 +664,5 @@ val po_disallow_fun_and_cls_meth_pseudo_funcs : t -> bool val tco_use_direct_decl_parser : t -> bool val po_enable_enum_supertyping : t -> bool + +val po_array_unification : t -> bool diff --git a/hphp/hack/src/options/parserOptions.ml b/hphp/hack/src/options/parserOptions.ml index 2f683c8ff9d..7476cbec7e2 100644 --- a/hphp/hack/src/options/parserOptions.ml +++ b/hphp/hack/src/options/parserOptions.ml @@ -137,6 +137,11 @@ let disallow_fun_and_cls_meth_pseudo_funcs = let with_disallow_fun_and_cls_meth_pseudo_funcs po b = { po with GlobalOptions.po_disallow_fun_and_cls_meth_pseudo_funcs = b } +let array_unification = GlobalOptions.po_array_unification + +let with_array_unification po b = + { po with GlobalOptions.po_array_unification = b } + let make ~auto_namespace_map ~codegen @@ -164,7 +169,8 @@ let make ~disable_array ~disable_array_typehint ~disallow_hash_comments - ~disallow_fun_and_cls_meth_pseudo_funcs = + ~disallow_fun_and_cls_meth_pseudo_funcs + ~array_unification = GlobalOptions. { default with @@ -196,6 +202,7 @@ let make po_disallow_hash_comments = disallow_hash_comments; po_disallow_fun_and_cls_meth_pseudo_funcs = disallow_fun_and_cls_meth_pseudo_funcs; + po_array_unification = array_unification; } (* Changes here need to be synchronized with rust_parser_errors_ffi.rs *) @@ -221,6 +228,7 @@ type ffi_t = * bool * bool * bool + * bool let to_rust_ffi_t po ~hhvm_compat_mode ~hhi_mode ~codegen = ( hhvm_compat_mode, @@ -243,4 +251,5 @@ let to_rust_ffi_t po ~hhvm_compat_mode ~hhi_mode ~codegen = disable_array_typehint po, allow_unstable_features po, disallow_hash_comments po, - disallow_fun_and_cls_meth_pseudo_funcs po ) + disallow_fun_and_cls_meth_pseudo_funcs po, + array_unification po ) diff --git a/hphp/hack/src/options/typecheckerOptions.ml b/hphp/hack/src/options/typecheckerOptions.ml index 25c1c3cf147..62221ef6c14 100644 --- a/hphp/hack/src/options/typecheckerOptions.ml +++ b/hphp/hack/src/options/typecheckerOptions.ml @@ -168,3 +168,5 @@ let report_pos_from_reason = GlobalOptions.tco_report_pos_from_reason let enable_sound_dynamic = GlobalOptions.tco_enable_sound_dynamic let use_direct_decl_parser = GlobalOptions.tco_use_direct_decl_parser + +let array_unification = GlobalOptions.po_array_unification diff --git a/hphp/hack/src/oxidized/gen/full_fidelity_parser_env.rs b/hphp/hack/src/oxidized/gen/full_fidelity_parser_env.rs index ad22888f4a0..b30d63d41ef 100644 --- a/hphp/hack/src/oxidized/gen/full_fidelity_parser_env.rs +++ b/hphp/hack/src/oxidized/gen/full_fidelity_parser_env.rs @@ -3,7 +3,7 @@ // This source code is licensed under the MIT license found in the // LICENSE file in the "hack" directory of this source tree. // -// @generated SignedSource<> +// @generated SignedSource<> // // To regenerate this file, run: // hphp/hack/src/oxidized_regen.sh @@ -49,4 +49,5 @@ pub struct FullFidelityParserEnv { pub disable_modes: bool, pub disallow_hash_comments: bool, pub disallow_fun_and_cls_meth_pseudo_funcs: bool, + pub array_unification: bool, } diff --git a/hphp/hack/src/oxidized/gen/global_options.rs b/hphp/hack/src/oxidized/gen/global_options.rs index bb27f2c797c..658b7f10a83 100644 --- a/hphp/hack/src/oxidized/gen/global_options.rs +++ b/hphp/hack/src/oxidized/gen/global_options.rs @@ -3,7 +3,7 @@ // This source code is licensed under the MIT license found in the // LICENSE file in the "hack" directory of this source tree. // -// @generated SignedSource<<625cafb78a10e100101382af3aa2aecc>> +// @generated SignedSource<> // // To regenerate this file, run: // hphp/hack/src/oxidized_regen.sh @@ -138,4 +138,5 @@ pub struct GlobalOptions { pub tco_use_direct_decl_parser: bool, pub tco_ifc_enabled: Vec, pub po_enable_enum_supertyping: bool, + pub po_array_unification: bool, } diff --git a/hphp/hack/src/oxidized/gen/parser_options.rs b/hphp/hack/src/oxidized/gen/parser_options.rs index b3f686ab364..ffea71deae7 100644 --- a/hphp/hack/src/oxidized/gen/parser_options.rs +++ b/hphp/hack/src/oxidized/gen/parser_options.rs @@ -3,7 +3,7 @@ // This source code is licensed under the MIT license found in the // LICENSE file in the "hack" directory of this source tree. // -// @generated SignedSource<<81916e0c6fa01898fc992c92cb2b9182>> +// @generated SignedSource<<03bd6bc2d1191d88cf90ca36d950e296>> // // To regenerate this file, run: // hphp/hack/src/oxidized_regen.sh @@ -55,4 +55,5 @@ pub struct FfiT( pub bool, pub bool, pub bool, + pub bool, ); diff --git a/hphp/hack/src/oxidized/manual/global_options_impl.rs b/hphp/hack/src/oxidized/manual/global_options_impl.rs index 5baf9cacd24..d2ab89c5804 100644 --- a/hphp/hack/src/oxidized/manual/global_options_impl.rs +++ b/hphp/hack/src/oxidized/manual/global_options_impl.rs @@ -119,6 +119,7 @@ impl Default for GlobalOptions { tco_use_direct_decl_parser: false, tco_ifc_enabled: vec![], po_enable_enum_supertyping: false, + po_array_unification: false, } } } diff --git a/hphp/hack/src/oxidized_by_ref/gen/global_options.rs b/hphp/hack/src/oxidized_by_ref/gen/global_options.rs index e64050ab38f..f1f62f96f59 100644 --- a/hphp/hack/src/oxidized_by_ref/gen/global_options.rs +++ b/hphp/hack/src/oxidized_by_ref/gen/global_options.rs @@ -3,7 +3,7 @@ // This source code is licensed under the MIT license found in the // LICENSE file in the "hack" directory of this source tree. // -// @generated SignedSource<> +// @generated SignedSource<<7bd6db0bc0b69f06ab805a182daa248a>> // // To regenerate this file, run: // hphp/hack/src/oxidized_regen.sh @@ -137,5 +137,6 @@ pub struct GlobalOptions<'a> { pub tco_use_direct_decl_parser: bool, pub tco_ifc_enabled: &'a [&'a str], pub po_enable_enum_supertyping: bool, + pub po_array_unification: bool, } impl<'a> TrivialDrop for GlobalOptions<'a> {} diff --git a/hphp/hack/src/oxidized_by_ref/manual/global_options_impl.rs b/hphp/hack/src/oxidized_by_ref/manual/global_options_impl.rs index eb54a8e4c4e..d860594b1f3 100644 --- a/hphp/hack/src/oxidized_by_ref/manual/global_options_impl.rs +++ b/hphp/hack/src/oxidized_by_ref/manual/global_options_impl.rs @@ -117,6 +117,7 @@ const DEFAULT: GlobalOptions<'_> = GlobalOptions { tco_use_direct_decl_parser: false, tco_ifc_enabled: &[], po_enable_enum_supertyping: false, + po_array_unification: false, }; impl GlobalOptions<'static> { diff --git a/hphp/hack/src/parser/aast_parser.rs b/hphp/hack/src/parser/aast_parser.rs index 5075f01d51f..81e759ad560 100644 --- a/hphp/hack/src/parser/aast_parser.rs +++ b/hphp/hack/src/parser/aast_parser.rs @@ -185,6 +185,7 @@ impl<'src> AastParser { disallow_fun_and_cls_meth_pseudo_funcs: env .parser_options .po_disallow_fun_and_cls_meth_pseudo_funcs, + array_unification: env.parser_options.po_array_unification, }; let tree = if quick_mode { diff --git a/hphp/hack/src/parser/api/direct_decl_parser.rs b/hphp/hack/src/parser/api/direct_decl_parser.rs index 6486634b814..e0a6bcc8e89 100644 --- a/hphp/hack/src/parser/api/direct_decl_parser.rs +++ b/hphp/hack/src/parser/api/direct_decl_parser.rs @@ -34,6 +34,7 @@ pub fn parse_script<'a>( &source, mode, env.disable_xhp_element_mangling, + env.array_unification, auto_namespace_map, arena, ); diff --git a/hphp/hack/src/parser/full_fidelity_parser_env.ml b/hphp/hack/src/parser/full_fidelity_parser_env.ml index 020155e7d5f..3e6472666cb 100644 --- a/hphp/hack/src/parser/full_fidelity_parser_env.ml +++ b/hphp/hack/src/parser/full_fidelity_parser_env.ml @@ -25,6 +25,7 @@ type t = { disable_modes: bool; disallow_hash_comments: bool; disallow_fun_and_cls_meth_pseudo_funcs: bool; + array_unification: bool; } [@@deriving show] @@ -47,6 +48,7 @@ let default = disable_modes = false; disallow_hash_comments = false; disallow_fun_and_cls_meth_pseudo_funcs = false; + array_unification = false; } let make @@ -72,6 +74,7 @@ let make ?(disallow_hash_comments = default.disallow_hash_comments) ?(disallow_fun_and_cls_meth_pseudo_funcs = default.disallow_fun_and_cls_meth_pseudo_funcs) + ?(array_unification = default.array_unification) () = { hhvm_compat_mode; @@ -91,6 +94,7 @@ let make disable_modes; disallow_hash_comments; disallow_fun_and_cls_meth_pseudo_funcs; + array_unification; } let hhvm_compat_mode e = e.hhvm_compat_mode @@ -129,3 +133,5 @@ let disallow_hash_comments e = e.disallow_hash_comments let disallow_fun_and_cls_meth_pseudo_funcs e = e.disallow_fun_and_cls_meth_pseudo_funcs + +let array_unification e = e.array_unification diff --git a/hphp/hack/src/parser/parser_env.rs b/hphp/hack/src/parser/parser_env.rs index 9137eed439e..944e53de839 100644 --- a/hphp/hack/src/parser/parser_env.rs +++ b/hphp/hack/src/parser/parser_env.rs @@ -20,6 +20,7 @@ pub struct ParserEnv { pub disable_modes: bool, pub disallow_hash_comments: bool, pub disallow_fun_and_cls_meth_pseudo_funcs: bool, + pub array_unification: bool, } impl From for ParserEnv { @@ -35,6 +36,7 @@ impl From for ParserEnv { disable_modes: env.disable_modes, disallow_hash_comments: env.disallow_hash_comments, disallow_fun_and_cls_meth_pseudo_funcs: env.disallow_fun_and_cls_meth_pseudo_funcs, + array_unification: env.array_unification, } } } diff --git a/hphp/hack/src/providers/decl_service_client.ml b/hphp/hack/src/providers/decl_service_client.ml index b17bb126571..fa3f0a9b363 100644 --- a/hphp/hack/src/providers/decl_service_client.ml +++ b/hphp/hack/src/providers/decl_service_client.ml @@ -47,11 +47,13 @@ type t = { type_path_and_kind_cache: (Relative_path.t * Naming_types.kind_of_type) option String.Table.t; disable_xhp_element_mangling: bool; + array_unification: bool; } let from_raw_client (client : Decl_ipc_ffi_externs.decl_client) (disable_xhp_element_mangling : bool) + (array_unification : bool) (ns_map : (string * string) list) : t = { client; @@ -61,6 +63,7 @@ let from_raw_client fun_path_cache = String.Table.create (); type_path_and_kind_cache = String.Table.create (); disable_xhp_element_mangling; + array_unification; } (* HACK: The decl service just stores the decl (rather than a decl option), @@ -244,6 +247,7 @@ let parse_and_cache_decls_in let decls = Direct_decl_parser.parse_decls_ffi t.disable_xhp_element_mangling + t.array_unification filename contents t.ns_map diff --git a/hphp/hack/src/providers/decl_service_client.mli b/hphp/hack/src/providers/decl_service_client.mli index b78dfb4c6bd..b581127e105 100644 --- a/hphp/hack/src/providers/decl_service_client.mli +++ b/hphp/hack/src/providers/decl_service_client.mli @@ -11,7 +11,11 @@ for decls and get back answers. Often these requests will block upon IO. *) type t val from_raw_client : - Decl_ipc_ffi_externs.decl_client -> bool -> (string * string) list -> t + Decl_ipc_ffi_externs.decl_client -> + bool -> + bool -> + (string * string) list -> + t val rpc_get_fun : t -> string -> Typing_defs.fun_elt option diff --git a/hphp/hack/src/providers/direct_decl_utils.ml b/hphp/hack/src/providers/direct_decl_utils.ml index 703eb35b2a8..dc0192acdf8 100644 --- a/hphp/hack/src/providers/direct_decl_utils.ml +++ b/hphp/hack/src/providers/direct_decl_utils.ml @@ -85,9 +85,10 @@ let direct_decl_parse_and_cache ?(decl_hash = false) ctx file = let disable_xhp_element_mangling = ParserOptions.disable_xhp_element_mangling popt in + let array_unification = ParserOptions.array_unification popt in let (decls, mode, hash) = Direct_decl_parser.parse_decls_and_mode_ffi - disable_xhp_element_mangling + (disable_xhp_element_mangling, array_unification) file contents ns_map diff --git a/hphp/hack/src/server/serverConfig.ml b/hphp/hack/src/server/serverConfig.ml index c618bd6c692..130af8948d1 100644 --- a/hphp/hack/src/server/serverConfig.ml +++ b/hphp/hack/src/server/serverConfig.ml @@ -432,6 +432,7 @@ let load ~silent config_filename options : t * ServerLocalConfig.t = ~tco_ifc_enabled:(ServerArgs.enable_ifc options) ?po_enable_enum_classes:(bool_opt "enable_enum_classes" config) ?po_enable_enum_supertyping:(bool_opt "enable_enum_supertyping" config) + ?po_array_unification:(bool_opt "array_unification" config) () in Errors.allowed_fixme_codes_strict := -- 2.11.4.GIT