From 3f4f253028e59ed79f1a461e39381ce3a360b7ef Mon Sep 17 00:00:00 2001 From: Jonas Schievink Date: Thu, 21 Jan 2021 19:04:31 +0100 Subject: Revert "Make use of `block_def_map` in body lowering" --- crates/hir_def/src/body.rs | 19 +++++++++++++------ crates/hir_def/src/body/lower.rs | 16 ++++------------ crates/hir_def/src/data.rs | 2 +- 3 files changed, 18 insertions(+), 19 deletions(-) (limited to 'crates') diff --git a/crates/hir_def/src/body.rs b/crates/hir_def/src/body.rs index 8e8c0271f..2c2c999dd 100644 --- a/crates/hir_def/src/body.rs +++ b/crates/hir_def/src/body.rs @@ -45,7 +45,7 @@ pub(crate) struct CfgExpander { pub(crate) struct Expander { cfg_expander: CfgExpander, - def_map: Arc, + crate_def_map: Arc, current_file_id: HirFileId, ast_id_map: Arc, module: ModuleId, @@ -90,7 +90,7 @@ impl Expander { let ast_id_map = db.ast_id_map(current_file_id); Expander { cfg_expander, - def_map: crate_def_map, + crate_def_map, current_file_id, ast_id_map, module, @@ -101,6 +101,7 @@ impl Expander { pub(crate) fn enter_expand( &mut self, db: &dyn DefDatabase, + local_scope: Option<&ItemScope>, macro_call: ast::MacroCall, ) -> ExpandResult> { if self.recursion_limit + 1 > EXPANSION_RECURSION_LIMIT { @@ -110,12 +111,18 @@ impl Expander { let macro_call = InFile::new(self.current_file_id, ¯o_call); - let resolver = - |path: ModPath| -> Option { self.resolve_path_as_macro(db, &path) }; + let resolver = |path: ModPath| -> Option { + if let Some(local_scope) = local_scope { + if let Some(def) = path.as_ident().and_then(|n| local_scope.get_legacy_macro(n)) { + return Some(def); + } + } + self.resolve_path_as_macro(db, &path) + }; let mut err = None; let call_id = - macro_call.as_call_id_with_errors(db, self.def_map.krate(), resolver, &mut |e| { + macro_call.as_call_id_with_errors(db, self.crate_def_map.krate(), resolver, &mut |e| { err.get_or_insert(e); }); let call_id = match call_id { @@ -196,7 +203,7 @@ impl Expander { } fn resolve_path_as_macro(&self, db: &dyn DefDatabase, path: &ModPath) -> Option { - self.def_map + self.crate_def_map .resolve_path(db, self.module.local_id, path, BuiltinShadowMode::Other) .0 .take_macros() diff --git a/crates/hir_def/src/body/lower.rs b/crates/hir_def/src/body/lower.rs index 2c8a86723..4ce5e5b72 100644 --- a/crates/hir_def/src/body/lower.rs +++ b/crates/hir_def/src/body/lower.rs @@ -1,7 +1,7 @@ //! Transforms `ast::Expr` into an equivalent `hir_def::expr::Expr` //! representation. -use std::{any::type_name, mem, sync::Arc}; +use std::{any::type_name, sync::Arc}; use either::Either; use hir_expand::{ @@ -559,7 +559,7 @@ impl ExprCollector<'_> { let outer_file = self.expander.current_file_id; let macro_call = self.expander.to_source(AstPtr::new(&e)); - let res = self.expander.enter_expand(self.db, e); + let res = self.expander.enter_expand(self.db, Some(&self.body.item_scope), e); match &res.err { Some(ExpandError::UnresolvedProcMacro) => { @@ -696,19 +696,11 @@ impl ExprCollector<'_> { fn collect_block(&mut self, block: ast::BlockExpr) -> ExprId { let syntax_node_ptr = AstPtr::new(&block.clone().into()); - let ast_id = self.expander.ast_id(&block); - let def_map = self.db.block_def_map(self.expander.module.krate, ast_id); - let prev_def_map = mem::replace(&mut self.expander.def_map, def_map); - self.collect_stmts_items(block.statements()); let statements = block.statements().filter_map(|s| self.collect_stmt(s)).flatten().collect(); let tail = block.tail_expr().map(|e| self.collect_expr(e)); - let expr_id = - self.alloc_expr(Expr::Block { statements, tail, label: None }, syntax_node_ptr); - - self.expander.def_map = prev_def_map; - expr_id + self.alloc_expr(Expr::Block { statements, tail, label: None }, syntax_node_ptr) } fn collect_stmts_items(&mut self, stmts: ast::AstChildren) { @@ -838,7 +830,7 @@ impl ExprCollector<'_> { if annotation == BindingAnnotation::Unannotated && subpat.is_none() { // This could also be a single-segment path pattern. To // decide that, we need to try resolving the name. - let (resolved, _) = self.expander.def_map.resolve_path( + let (resolved, _) = self.expander.crate_def_map.resolve_path( self.db, self.expander.module.local_id, &name.clone().into(), diff --git a/crates/hir_def/src/data.rs b/crates/hir_def/src/data.rs index c2b0dc007..e7b7724f7 100644 --- a/crates/hir_def/src/data.rs +++ b/crates/hir_def/src/data.rs @@ -262,7 +262,7 @@ fn collect_items( let root = db.parse_or_expand(file_id).unwrap(); let call = ast_id_map.get(call.ast_id).to_node(&root); - if let Some((mark, mac)) = expander.enter_expand(db, call).value { + if let Some((mark, mac)) = expander.enter_expand(db, None, call).value { let src: InFile = expander.to_source(mac); let item_tree = db.item_tree(src.file_id); let iter = -- cgit v1.2.3