diff options
-rw-r--r-- | crates/hir_def/src/body.rs | 19 | ||||
-rw-r--r-- | crates/hir_def/src/body/lower.rs | 16 | ||||
-rw-r--r-- | crates/hir_def/src/data.rs | 2 |
3 files changed, 18 insertions, 19 deletions
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 { | |||
45 | 45 | ||
46 | pub(crate) struct Expander { | 46 | pub(crate) struct Expander { |
47 | cfg_expander: CfgExpander, | 47 | cfg_expander: CfgExpander, |
48 | def_map: Arc<DefMap>, | 48 | crate_def_map: Arc<DefMap>, |
49 | current_file_id: HirFileId, | 49 | current_file_id: HirFileId, |
50 | ast_id_map: Arc<AstIdMap>, | 50 | ast_id_map: Arc<AstIdMap>, |
51 | module: ModuleId, | 51 | module: ModuleId, |
@@ -90,7 +90,7 @@ impl Expander { | |||
90 | let ast_id_map = db.ast_id_map(current_file_id); | 90 | let ast_id_map = db.ast_id_map(current_file_id); |
91 | Expander { | 91 | Expander { |
92 | cfg_expander, | 92 | cfg_expander, |
93 | def_map: crate_def_map, | 93 | crate_def_map, |
94 | current_file_id, | 94 | current_file_id, |
95 | ast_id_map, | 95 | ast_id_map, |
96 | module, | 96 | module, |
@@ -101,6 +101,7 @@ impl Expander { | |||
101 | pub(crate) fn enter_expand<T: ast::AstNode>( | 101 | pub(crate) fn enter_expand<T: ast::AstNode>( |
102 | &mut self, | 102 | &mut self, |
103 | db: &dyn DefDatabase, | 103 | db: &dyn DefDatabase, |
104 | local_scope: Option<&ItemScope>, | ||
104 | macro_call: ast::MacroCall, | 105 | macro_call: ast::MacroCall, |
105 | ) -> ExpandResult<Option<(Mark, T)>> { | 106 | ) -> ExpandResult<Option<(Mark, T)>> { |
106 | if self.recursion_limit + 1 > EXPANSION_RECURSION_LIMIT { | 107 | if self.recursion_limit + 1 > EXPANSION_RECURSION_LIMIT { |
@@ -110,12 +111,18 @@ impl Expander { | |||
110 | 111 | ||
111 | let macro_call = InFile::new(self.current_file_id, ¯o_call); | 112 | let macro_call = InFile::new(self.current_file_id, ¯o_call); |
112 | 113 | ||
113 | let resolver = | 114 | let resolver = |path: ModPath| -> Option<MacroDefId> { |
114 | |path: ModPath| -> Option<MacroDefId> { self.resolve_path_as_macro(db, &path) }; | 115 | if let Some(local_scope) = local_scope { |
116 | if let Some(def) = path.as_ident().and_then(|n| local_scope.get_legacy_macro(n)) { | ||
117 | return Some(def); | ||
118 | } | ||
119 | } | ||
120 | self.resolve_path_as_macro(db, &path) | ||
121 | }; | ||
115 | 122 | ||
116 | let mut err = None; | 123 | let mut err = None; |
117 | let call_id = | 124 | let call_id = |
118 | macro_call.as_call_id_with_errors(db, self.def_map.krate(), resolver, &mut |e| { | 125 | macro_call.as_call_id_with_errors(db, self.crate_def_map.krate(), resolver, &mut |e| { |
119 | err.get_or_insert(e); | 126 | err.get_or_insert(e); |
120 | }); | 127 | }); |
121 | let call_id = match call_id { | 128 | let call_id = match call_id { |
@@ -196,7 +203,7 @@ impl Expander { | |||
196 | } | 203 | } |
197 | 204 | ||
198 | fn resolve_path_as_macro(&self, db: &dyn DefDatabase, path: &ModPath) -> Option<MacroDefId> { | 205 | fn resolve_path_as_macro(&self, db: &dyn DefDatabase, path: &ModPath) -> Option<MacroDefId> { |
199 | self.def_map | 206 | self.crate_def_map |
200 | .resolve_path(db, self.module.local_id, path, BuiltinShadowMode::Other) | 207 | .resolve_path(db, self.module.local_id, path, BuiltinShadowMode::Other) |
201 | .0 | 208 | .0 |
202 | .take_macros() | 209 | .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 @@ | |||
1 | //! Transforms `ast::Expr` into an equivalent `hir_def::expr::Expr` | 1 | //! Transforms `ast::Expr` into an equivalent `hir_def::expr::Expr` |
2 | //! representation. | 2 | //! representation. |
3 | 3 | ||
4 | use std::{any::type_name, mem, sync::Arc}; | 4 | use std::{any::type_name, sync::Arc}; |
5 | 5 | ||
6 | use either::Either; | 6 | use either::Either; |
7 | use hir_expand::{ | 7 | use hir_expand::{ |
@@ -559,7 +559,7 @@ impl ExprCollector<'_> { | |||
559 | let outer_file = self.expander.current_file_id; | 559 | let outer_file = self.expander.current_file_id; |
560 | 560 | ||
561 | let macro_call = self.expander.to_source(AstPtr::new(&e)); | 561 | let macro_call = self.expander.to_source(AstPtr::new(&e)); |
562 | let res = self.expander.enter_expand(self.db, e); | 562 | let res = self.expander.enter_expand(self.db, Some(&self.body.item_scope), e); |
563 | 563 | ||
564 | match &res.err { | 564 | match &res.err { |
565 | Some(ExpandError::UnresolvedProcMacro) => { | 565 | Some(ExpandError::UnresolvedProcMacro) => { |
@@ -696,19 +696,11 @@ impl ExprCollector<'_> { | |||
696 | 696 | ||
697 | fn collect_block(&mut self, block: ast::BlockExpr) -> ExprId { | 697 | fn collect_block(&mut self, block: ast::BlockExpr) -> ExprId { |
698 | let syntax_node_ptr = AstPtr::new(&block.clone().into()); | 698 | let syntax_node_ptr = AstPtr::new(&block.clone().into()); |
699 | let ast_id = self.expander.ast_id(&block); | ||
700 | let def_map = self.db.block_def_map(self.expander.module.krate, ast_id); | ||
701 | let prev_def_map = mem::replace(&mut self.expander.def_map, def_map); | ||
702 | |||
703 | self.collect_stmts_items(block.statements()); | 699 | self.collect_stmts_items(block.statements()); |
704 | let statements = | 700 | let statements = |
705 | block.statements().filter_map(|s| self.collect_stmt(s)).flatten().collect(); | 701 | block.statements().filter_map(|s| self.collect_stmt(s)).flatten().collect(); |
706 | let tail = block.tail_expr().map(|e| self.collect_expr(e)); | 702 | let tail = block.tail_expr().map(|e| self.collect_expr(e)); |
707 | let expr_id = | 703 | self.alloc_expr(Expr::Block { statements, tail, label: None }, syntax_node_ptr) |
708 | self.alloc_expr(Expr::Block { statements, tail, label: None }, syntax_node_ptr); | ||
709 | |||
710 | self.expander.def_map = prev_def_map; | ||
711 | expr_id | ||
712 | } | 704 | } |
713 | 705 | ||
714 | fn collect_stmts_items(&mut self, stmts: ast::AstChildren<ast::Stmt>) { | 706 | fn collect_stmts_items(&mut self, stmts: ast::AstChildren<ast::Stmt>) { |
@@ -838,7 +830,7 @@ impl ExprCollector<'_> { | |||
838 | if annotation == BindingAnnotation::Unannotated && subpat.is_none() { | 830 | if annotation == BindingAnnotation::Unannotated && subpat.is_none() { |
839 | // This could also be a single-segment path pattern. To | 831 | // This could also be a single-segment path pattern. To |
840 | // decide that, we need to try resolving the name. | 832 | // decide that, we need to try resolving the name. |
841 | let (resolved, _) = self.expander.def_map.resolve_path( | 833 | let (resolved, _) = self.expander.crate_def_map.resolve_path( |
842 | self.db, | 834 | self.db, |
843 | self.expander.module.local_id, | 835 | self.expander.module.local_id, |
844 | &name.clone().into(), | 836 | &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( | |||
262 | let root = db.parse_or_expand(file_id).unwrap(); | 262 | let root = db.parse_or_expand(file_id).unwrap(); |
263 | let call = ast_id_map.get(call.ast_id).to_node(&root); | 263 | let call = ast_id_map.get(call.ast_id).to_node(&root); |
264 | 264 | ||
265 | if let Some((mark, mac)) = expander.enter_expand(db, call).value { | 265 | if let Some((mark, mac)) = expander.enter_expand(db, None, call).value { |
266 | let src: InFile<ast::MacroItems> = expander.to_source(mac); | 266 | let src: InFile<ast::MacroItems> = expander.to_source(mac); |
267 | let item_tree = db.item_tree(src.file_id); | 267 | let item_tree = db.item_tree(src.file_id); |
268 | let iter = | 268 | let iter = |