diff options
Diffstat (limited to 'crates/hir_def/src/body')
-rw-r--r-- | crates/hir_def/src/body/lower.rs | 16 |
1 files changed, 12 insertions, 4 deletions
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 | ||
4 | use std::{any::type_name, sync::Arc}; | 4 | use std::{any::type_name, mem, 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, 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(), |