aboutsummaryrefslogtreecommitdiff
path: root/crates/hir_def
diff options
context:
space:
mode:
authorJonas Schievink <[email protected]>2021-01-21 17:05:52 +0000
committerJonas Schievink <[email protected]>2021-01-21 17:05:52 +0000
commitcdb0e25aaa8407caca878cfd0e92d46bb50b6da1 (patch)
tree625dde24f7b862a4810d8cc61ea529cbe5383f1f /crates/hir_def
parentbbc6298600d7d91d8473ba8153ebde7b3a7768e5 (diff)
Make use of `block_def_map` in body lowering
Removes the `local_scope` hack from `Expander` in favor of tracking the `DefMap` in use during body lowering
Diffstat (limited to 'crates/hir_def')
-rw-r--r--crates/hir_def/src/body.rs19
-rw-r--r--crates/hir_def/src/body/lower.rs16
-rw-r--r--crates/hir_def/src/data.rs2
3 files changed, 19 insertions, 18 deletions
diff --git a/crates/hir_def/src/body.rs b/crates/hir_def/src/body.rs
index 2c2c999dd..8e8c0271f 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
46pub(crate) struct Expander { 46pub(crate) struct Expander {
47 cfg_expander: CfgExpander, 47 cfg_expander: CfgExpander,
48 crate_def_map: Arc<DefMap>, 48 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 crate_def_map, 93 def_map: crate_def_map,
94 current_file_id, 94 current_file_id,
95 ast_id_map, 95 ast_id_map,
96 module, 96 module,
@@ -101,7 +101,6 @@ 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>,
105 macro_call: ast::MacroCall, 104 macro_call: ast::MacroCall,
106 ) -> ExpandResult<Option<(Mark, T)>> { 105 ) -> ExpandResult<Option<(Mark, T)>> {
107 if self.recursion_limit + 1 > EXPANSION_RECURSION_LIMIT { 106 if self.recursion_limit + 1 > EXPANSION_RECURSION_LIMIT {
@@ -111,18 +110,12 @@ impl Expander {
111 110
112 let macro_call = InFile::new(self.current_file_id, &macro_call); 111 let macro_call = InFile::new(self.current_file_id, &macro_call);
113 112
114 let resolver = |path: ModPath| -> Option<MacroDefId> { 113 let resolver =
115 if let Some(local_scope) = local_scope { 114 |path: ModPath| -> Option<MacroDefId> { self.resolve_path_as_macro(db, &path) };
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 };
122 115
123 let mut err = None; 116 let mut err = None;
124 let call_id = 117 let call_id =
125 macro_call.as_call_id_with_errors(db, self.crate_def_map.krate(), resolver, &mut |e| { 118 macro_call.as_call_id_with_errors(db, self.def_map.krate(), resolver, &mut |e| {
126 err.get_or_insert(e); 119 err.get_or_insert(e);
127 }); 120 });
128 let call_id = match call_id { 121 let call_id = match call_id {
@@ -203,7 +196,7 @@ impl Expander {
203 } 196 }
204 197
205 fn resolve_path_as_macro(&self, db: &dyn DefDatabase, path: &ModPath) -> Option<MacroDefId> { 198 fn resolve_path_as_macro(&self, db: &dyn DefDatabase, path: &ModPath) -> Option<MacroDefId> {
206 self.crate_def_map 199 self.def_map
207 .resolve_path(db, self.module.local_id, path, BuiltinShadowMode::Other) 200 .resolve_path(db, self.module.local_id, path, BuiltinShadowMode::Other)
208 .0 201 .0
209 .take_macros() 202 .take_macros()
diff --git a/crates/hir_def/src/body/lower.rs b/crates/hir_def/src/body/lower.rs
index 4ce5e5b72..2c8a86723 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
4use std::{any::type_name, sync::Arc}; 4use std::{any::type_name, mem, sync::Arc};
5 5
6use either::Either; 6use either::Either;
7use hir_expand::{ 7use 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, Some(&self.body.item_scope), e); 562 let res = self.expander.enter_expand(self.db, e);
563 563
564 match &res.err { 564 match &res.err {
565 Some(ExpandError::UnresolvedProcMacro) => { 565 Some(ExpandError::UnresolvedProcMacro) => {
@@ -696,11 +696,19 @@ 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
699 self.collect_stmts_items(block.statements()); 703 self.collect_stmts_items(block.statements());
700 let statements = 704 let statements =
701 block.statements().filter_map(|s| self.collect_stmt(s)).flatten().collect(); 705 block.statements().filter_map(|s| self.collect_stmt(s)).flatten().collect();
702 let tail = block.tail_expr().map(|e| self.collect_expr(e)); 706 let tail = block.tail_expr().map(|e| self.collect_expr(e));
703 self.alloc_expr(Expr::Block { statements, tail, label: None }, syntax_node_ptr) 707 let expr_id =
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
704 } 712 }
705 713
706 fn collect_stmts_items(&mut self, stmts: ast::AstChildren<ast::Stmt>) { 714 fn collect_stmts_items(&mut self, stmts: ast::AstChildren<ast::Stmt>) {
@@ -830,7 +838,7 @@ impl ExprCollector<'_> {
830 if annotation == BindingAnnotation::Unannotated && subpat.is_none() { 838 if annotation == BindingAnnotation::Unannotated && subpat.is_none() {
831 // This could also be a single-segment path pattern. To 839 // This could also be a single-segment path pattern. To
832 // decide that, we need to try resolving the name. 840 // decide that, we need to try resolving the name.
833 let (resolved, _) = self.expander.crate_def_map.resolve_path( 841 let (resolved, _) = self.expander.def_map.resolve_path(
834 self.db, 842 self.db,
835 self.expander.module.local_id, 843 self.expander.module.local_id,
836 &name.clone().into(), 844 &name.clone().into(),
diff --git a/crates/hir_def/src/data.rs b/crates/hir_def/src/data.rs
index e7b7724f7..c2b0dc007 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, None, call).value { 265 if let Some((mark, mac)) = expander.enter_expand(db, 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 =