diff options
Diffstat (limited to 'crates/ra_hir_def/src/body')
-rw-r--r-- | crates/ra_hir_def/src/body/lower.rs | 21 |
1 files changed, 14 insertions, 7 deletions
diff --git a/crates/ra_hir_def/src/body/lower.rs b/crates/ra_hir_def/src/body/lower.rs index e9dd65b0a..687216dc3 100644 --- a/crates/ra_hir_def/src/body/lower.rs +++ b/crates/ra_hir_def/src/body/lower.rs | |||
@@ -203,6 +203,16 @@ impl ExprCollector<'_> { | |||
203 | 203 | ||
204 | self.alloc_expr(Expr::If { condition, then_branch, else_branch }, syntax_ptr) | 204 | self.alloc_expr(Expr::If { condition, then_branch, else_branch }, syntax_ptr) |
205 | } | 205 | } |
206 | ast::Expr::EffectExpr(e) => match e.effect() { | ||
207 | ast::Effect::Try(_) => { | ||
208 | let body = self.collect_block_opt(e.block_expr()); | ||
209 | self.alloc_expr(Expr::TryBlock { body }, syntax_ptr) | ||
210 | } | ||
211 | // FIXME: we need to record these effects somewhere... | ||
212 | ast::Effect::Async(_) | ast::Effect::Label(_) | ast::Effect::Unsafe(_) => { | ||
213 | self.collect_block_opt(e.block_expr()) | ||
214 | } | ||
215 | }, | ||
206 | ast::Expr::BlockExpr(e) => self.collect_block(e), | 216 | ast::Expr::BlockExpr(e) => self.collect_block(e), |
207 | ast::Expr::LoopExpr(e) => { | 217 | ast::Expr::LoopExpr(e) => { |
208 | let body = self.collect_block_opt(e.loop_body()); | 218 | let body = self.collect_block_opt(e.loop_body()); |
@@ -456,6 +466,7 @@ impl ExprCollector<'_> { | |||
456 | krate: Some(self.expander.module.krate), | 466 | krate: Some(self.expander.module.krate), |
457 | ast_id: Some(self.expander.ast_id(&e)), | 467 | ast_id: Some(self.expander.ast_id(&e)), |
458 | kind: MacroDefKind::Declarative, | 468 | kind: MacroDefKind::Declarative, |
469 | local_inner: false, | ||
459 | }; | 470 | }; |
460 | self.body.item_scope.define_legacy_macro(name, mac); | 471 | self.body.item_scope.define_legacy_macro(name, mac); |
461 | 472 | ||
@@ -490,12 +501,8 @@ impl ExprCollector<'_> { | |||
490 | } | 501 | } |
491 | } | 502 | } |
492 | 503 | ||
493 | fn collect_block(&mut self, expr: ast::BlockExpr) -> ExprId { | 504 | fn collect_block(&mut self, block: ast::BlockExpr) -> ExprId { |
494 | let syntax_node_ptr = AstPtr::new(&expr.clone().into()); | 505 | let syntax_node_ptr = AstPtr::new(&block.clone().into()); |
495 | let block = match expr.block() { | ||
496 | Some(block) => block, | ||
497 | None => return self.alloc_expr(Expr::Missing, syntax_node_ptr), | ||
498 | }; | ||
499 | self.collect_block_items(&block); | 506 | self.collect_block_items(&block); |
500 | let statements = block | 507 | let statements = block |
501 | .statements() | 508 | .statements() |
@@ -513,7 +520,7 @@ impl ExprCollector<'_> { | |||
513 | self.alloc_expr(Expr::Block { statements, tail }, syntax_node_ptr) | 520 | self.alloc_expr(Expr::Block { statements, tail }, syntax_node_ptr) |
514 | } | 521 | } |
515 | 522 | ||
516 | fn collect_block_items(&mut self, block: &ast::Block) { | 523 | fn collect_block_items(&mut self, block: &ast::BlockExpr) { |
517 | let container = ContainerId::DefWithBodyId(self.def); | 524 | let container = ContainerId::DefWithBodyId(self.def); |
518 | for item in block.items() { | 525 | for item in block.items() { |
519 | let (def, name): (ModuleDefId, Option<ast::Name>) = match item { | 526 | let (def, name): (ModuleDefId, Option<ast::Name>) = match item { |