From dbf8b4a40bfbd3c8383a626b18525737098ea762 Mon Sep 17 00:00:00 2001 From: Thomas Jiang Date: Tue, 27 Sep 2022 18:38:12 -0700 Subject: [PATCH] Pass through DeclParserOptions created from NativeEnv Summary: We want to be consistent about what decl parser options to use when parsing the current file for decls. So this diff takes the relevant decl parser options HHVM has passed through in NativeEnv and threads them through to the direct decl parser. Reviewed By: edwinsmith Differential Revision: D39358487 fbshipit-source-id: ad6ec9f5be928c92cf9c17c8c1ff2a4d26340b7d --- hphp/hack/src/Cargo.lock | 1 + hphp/hack/src/hackc/compile/compile.rs | 17 +++++++++++++++++ hphp/hack/src/hackc/decl_provider/Cargo.toml | 1 + hphp/hack/src/hackc/decl_provider/self_provider.rs | 6 +++++- hphp/hack/src/hackc/ffi_bridge/compiler_ffi.rs | 16 ++++++++++++---- hphp/hack/src/hackc/hackc/compile.rs | 15 ++++++++++++--- hphp/hack/src/hackc/hackc/infer.rs | 9 ++++++--- hphp/hack/src/hackc/hackc/verify.rs | 8 ++++++-- 8 files changed, 60 insertions(+), 13 deletions(-) diff --git a/hphp/hack/src/Cargo.lock b/hphp/hack/src/Cargo.lock index 16d11244f09..778e70c7e29 100644 --- a/hphp/hack/src/Cargo.lock +++ b/hphp/hack/src/Cargo.lock @@ -1035,6 +1035,7 @@ dependencies = [ "bumpalo", "direct_decl_parser", "hash", + "oxidized", "oxidized_by_ref", "parser_core_types", "sha-1", diff --git a/hphp/hack/src/hackc/compile/compile.rs b/hphp/hack/src/hackc/compile/compile.rs index 8b7a7efc633..bb2e5e323e2 100644 --- a/hphp/hack/src/hackc/compile/compile.rs +++ b/hphp/hack/src/hackc/compile/compile.rs @@ -31,6 +31,7 @@ use options::Hhvm; use options::Options; use options::ParserOptions; use oxidized::ast; +use oxidized::decl_parser_options::DeclParserOptions; use oxidized::namespace_env::Env as NamespaceEnv; use oxidized::pos::Pos; use oxidized::relative_path::Prefix; @@ -101,6 +102,22 @@ impl NativeEnv { ..Default::default() } } + + pub fn to_decl_parser_options(&self) -> DeclParserOptions { + let auto_namespace_map = self.hhvm.aliased_namespaces_cloned().collect(); + // Keep in sync with getDeclFlags in runtime-option.cpp + let lang_flags = &self.hhvm.parser_options; + DeclParserOptions { + auto_namespace_map, + disable_xhp_element_mangling: lang_flags.po_disable_xhp_element_mangling, + interpret_soft_types_as_like_types: true, + allow_new_attribute_syntax: lang_flags.po_allow_new_attribute_syntax, + enable_xhp_class_modifier: lang_flags.po_enable_xhp_class_modifier, + php5_compat_mode: true, + hhvm_compat_mode: true, + ..Default::default() + } + } } /// Compilation profile. All times are in seconds, diff --git a/hphp/hack/src/hackc/decl_provider/Cargo.toml b/hphp/hack/src/hackc/decl_provider/Cargo.toml index 06ddba57e18..8f6f833ad89 100644 --- a/hphp/hack/src/hackc/decl_provider/Cargo.toml +++ b/hphp/hack/src/hackc/decl_provider/Cargo.toml @@ -13,6 +13,7 @@ bincode = "1.3.3" bumpalo = { version = "3.8", features = ["collections"] } direct_decl_parser = { path = "../../parser/api/cargo/direct_decl_parser" } hash = { path = "../../utils/hash" } +oxidized = { path = "../../oxidized" } oxidized_by_ref = { path = "../../oxidized_by_ref" } parser_core_types = { path = "../../parser/cargo/core_types" } sha-1 = "0.10" diff --git a/hphp/hack/src/hackc/decl_provider/self_provider.rs b/hphp/hack/src/hackc/decl_provider/self_provider.rs index fd28ab7acb6..9b5806246e6 100644 --- a/hphp/hack/src/hackc/decl_provider/self_provider.rs +++ b/hphp/hack/src/hackc/decl_provider/self_provider.rs @@ -7,6 +7,7 @@ use std::sync::Arc; use direct_decl_parser::parse_decls_without_reference_text; use direct_decl_parser::Decls; +use oxidized::decl_parser_options::DeclParserOptions; use oxidized_by_ref::shallow_decl_defs::ConstDecl; use oxidized_by_ref::shallow_decl_defs::FunDecl; use oxidized_by_ref::shallow_decl_defs::ModuleDecl; @@ -31,11 +32,12 @@ pub struct SelfProvider<'d> { impl<'d> SelfProvider<'d> { pub fn new( fallback_decl_provider: Option + 'd>>, + decl_opts: DeclParserOptions, source_text: SourceText<'_>, arena: &'d bumpalo::Bump, ) -> Self { let parsed_file = parse_decls_without_reference_text( - &Default::default(), + &decl_opts, source_text.file_path().clone(), source_text.text(), arena, @@ -53,6 +55,7 @@ impl<'d> SelfProvider<'d> { /// this can simply return a nonoption decl provider pub fn wrap_existing_provider( fallback_decl_provider: Option + 'd>>, + decl_opts: DeclParserOptions, source_text: SourceText<'_>, arena: &'d bumpalo::Bump, ) -> Option + 'd>> { @@ -61,6 +64,7 @@ impl<'d> SelfProvider<'d> { } else { Some(Arc::new(SelfProvider::new( fallback_decl_provider, + decl_opts, source_text, arena, )) as Arc + 'd>) diff --git a/hphp/hack/src/hackc/ffi_bridge/compiler_ffi.rs b/hphp/hack/src/hackc/ffi_bridge/compiler_ffi.rs index 81c27a91813..fa9e851be5b 100644 --- a/hphp/hack/src/hackc/ffi_bridge/compiler_ffi.rs +++ b/hphp/hack/src/hackc/ffi_bridge/compiler_ffi.rs @@ -319,8 +319,12 @@ fn compile_from_text_cpp_ffi( None }; - let decl_provider = - SelfProvider::wrap_existing_provider(external_decl_provider, text.clone(), &decl_allocator); + let decl_provider = SelfProvider::wrap_existing_provider( + external_decl_provider, + native_env.to_decl_parser_options(), + text.clone(), + &decl_allocator, + ); let mut output = Vec::new(); compile::from_text( @@ -410,8 +414,12 @@ fn compile_unit_from_text_cpp_ffi( None }; - let decl_provider = - SelfProvider::wrap_existing_provider(external_decl_provider, text.clone(), &decl_allocator); + let decl_provider = SelfProvider::wrap_existing_provider( + external_decl_provider, + native_env.to_decl_parser_options(), + text.clone(), + &decl_allocator, + ); compile::unit_from_text( alloc, diff --git a/hphp/hack/src/hackc/hackc/compile.rs b/hphp/hack/src/hackc/hackc/compile.rs index 3d75e9e77a5..29eb17624cc 100644 --- a/hphp/hack/src/hackc/hackc/compile.rs +++ b/hphp/hack/src/hackc/hackc/compile.rs @@ -162,8 +162,12 @@ pub(crate) fn process_single_file( let env = native_env(filepath, opts); let mut output = Vec::new(); let decl_arena = bumpalo::Bump::new(); - let decl_provider = - SelfProvider::wrap_existing_provider(None, source_text.clone(), &decl_arena); + let decl_provider = SelfProvider::wrap_existing_provider( + None, + env.to_decl_parser_options(), + source_text.clone(), + &decl_arena, + ); compile::from_text(&mut output, source_text, &env, decl_provider, profile)?; if opts.verbosity >= 1 { eprintln!("{}: {:#?}", env.filepath.path().display(), profile); @@ -179,7 +183,12 @@ pub(crate) fn compile_from_text(hackc_opts: &mut crate::Opts, w: &mut impl Write let env = hackc_opts.native_env(path)?; let decl_arena = bumpalo::Bump::new(); let text = SourceText::make(RcOc::new(env.filepath.clone()), &source_text); - let decl_provider = SelfProvider::wrap_existing_provider(None, text, &decl_arena); + let decl_provider = SelfProvider::wrap_existing_provider( + None, + env.to_decl_parser_options(), + text, + &decl_arena, + ); let hhas = compile_impl(env, source_text, decl_provider)?; w.write_all(&hhas)?; } diff --git a/hphp/hack/src/hackc/hackc/infer.rs b/hphp/hack/src/hackc/hackc/infer.rs index 68c6c06173d..c4df6499ab7 100644 --- a/hphp/hack/src/hackc/hackc/infer.rs +++ b/hphp/hack/src/hackc/hackc/infer.rs @@ -71,10 +71,13 @@ fn compile_php_file<'a, 'arena>( let env = crate::compile::native_env(filepath, single_file_opts); let mut profile = Profile::default(); let decl_arena = bumpalo::Bump::new(); - let decl_provider = - SelfProvider::wrap_existing_provider(None, source_text.clone(), &decl_arena); + let decl_provider = SelfProvider::wrap_existing_provider( + None, + env.to_decl_parser_options(), + source_text.clone(), + &decl_arena, + ); let unit = compile::unit_from_text(alloc, source_text, &env, decl_provider, &mut profile)?; - let ir = bc_to_ir::bc_to_ir(&unit, path); Ok(ir) diff --git a/hphp/hack/src/hackc/hackc/verify.rs b/hphp/hack/src/hackc/hackc/verify.rs index 9105e70ed13..c81a027ee36 100644 --- a/hphp/hack/src/hackc/hackc/verify.rs +++ b/hphp/hack/src/hackc/hackc/verify.rs @@ -242,8 +242,12 @@ fn compile_php_file<'a, 'arena>( let source_text = SourceText::make(RcOc::new(filepath.clone()), &content); let env = crate::compile::native_env(filepath, single_file_opts); let decl_arena = bumpalo::Bump::new(); - let decl_provider = - SelfProvider::wrap_existing_provider(None, source_text.clone(), &decl_arena); + let decl_provider = SelfProvider::wrap_existing_provider( + None, + env.to_decl_parser_options(), + source_text.clone(), + &decl_arena, + ); let unit = compile::unit_from_text(alloc, source_text, &env, decl_provider, profile) .map_err(|err| VerifyError::CompileError(err.to_string()))?; Ok((env, unit)) -- 2.11.4.GIT