diff options
author | Aleksey Kladov <[email protected]> | 2020-05-02 00:18:19 +0100 |
---|---|---|
committer | Aleksey Kladov <[email protected]> | 2020-05-02 10:21:39 +0100 |
commit | 4f2134cc33f07c09fe166cec42971828843bc0ef (patch) | |
tree | 0e2440d51717dd0dfcefbf77e5ef546f1ee5c60d /crates/ra_hir_def/src | |
parent | 3c96de5380a09fe06752ce146edeb017ae8c701c (diff) |
Introduce EffectExpr
Diffstat (limited to 'crates/ra_hir_def/src')
-rw-r--r-- | crates/ra_hir_def/src/body/lower.rs | 24 |
1 files changed, 13 insertions, 11 deletions
diff --git a/crates/ra_hir_def/src/body/lower.rs b/crates/ra_hir_def/src/body/lower.rs index f06cc115b..58b3d10d8 100644 --- a/crates/ra_hir_def/src/body/lower.rs +++ b/crates/ra_hir_def/src/body/lower.rs | |||
@@ -203,10 +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::TryBlockExpr(e) => { | 206 | ast::Expr::EffectExpr(e) => match e.effect() { |
207 | let body = self.collect_block_opt(e.body()); | 207 | ast::Effect::Try(_) => { |
208 | self.alloc_expr(Expr::TryBlock { body }, syntax_ptr) | 208 | let body = self.collect_block_opt(e.block_expr()); |
209 | } | 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 | }, | ||
210 | ast::Expr::BlockExpr(e) => self.collect_block(e), | 216 | ast::Expr::BlockExpr(e) => self.collect_block(e), |
211 | ast::Expr::LoopExpr(e) => { | 217 | ast::Expr::LoopExpr(e) => { |
212 | let body = self.collect_block_opt(e.loop_body()); | 218 | let body = self.collect_block_opt(e.loop_body()); |
@@ -494,12 +500,8 @@ impl ExprCollector<'_> { | |||
494 | } | 500 | } |
495 | } | 501 | } |
496 | 502 | ||
497 | fn collect_block(&mut self, expr: ast::BlockExpr) -> ExprId { | 503 | fn collect_block(&mut self, block: ast::BlockExpr) -> ExprId { |
498 | let syntax_node_ptr = AstPtr::new(&expr.clone().into()); | 504 | let syntax_node_ptr = AstPtr::new(&block.clone().into()); |
499 | let block = match expr.block() { | ||
500 | Some(block) => block, | ||
501 | None => return self.alloc_expr(Expr::Missing, syntax_node_ptr), | ||
502 | }; | ||
503 | self.collect_block_items(&block); | 505 | self.collect_block_items(&block); |
504 | let statements = block | 506 | let statements = block |
505 | .statements() | 507 | .statements() |
@@ -517,7 +519,7 @@ impl ExprCollector<'_> { | |||
517 | self.alloc_expr(Expr::Block { statements, tail }, syntax_node_ptr) | 519 | self.alloc_expr(Expr::Block { statements, tail }, syntax_node_ptr) |
518 | } | 520 | } |
519 | 521 | ||
520 | fn collect_block_items(&mut self, block: &ast::Block) { | 522 | fn collect_block_items(&mut self, block: &ast::BlockExpr) { |
521 | let container = ContainerId::DefWithBodyId(self.def); | 523 | let container = ContainerId::DefWithBodyId(self.def); |
522 | for item in block.items() { | 524 | for item in block.items() { |
523 | let (def, name): (ModuleDefId, Option<ast::Name>) = match item { | 525 | let (def, name): (ModuleDefId, Option<ast::Name>) = match item { |