diff options
Diffstat (limited to 'crates/ra_hir')
-rw-r--r-- | crates/ra_hir/src/expr.rs | 44 |
1 files changed, 25 insertions, 19 deletions
diff --git a/crates/ra_hir/src/expr.rs b/crates/ra_hir/src/expr.rs index 9fea70dda..b59787a83 100644 --- a/crates/ra_hir/src/expr.rs +++ b/crates/ra_hir/src/expr.rs | |||
@@ -559,6 +559,7 @@ where | |||
559 | match expr.kind() { | 559 | match expr.kind() { |
560 | ast::ExprKind::IfExpr(e) => { | 560 | ast::ExprKind::IfExpr(e) => { |
561 | let then_branch = self.collect_block_opt(e.then_branch()); | 561 | let then_branch = self.collect_block_opt(e.then_branch()); |
562 | |||
562 | let else_branch = e.else_branch().map(|b| match b { | 563 | let else_branch = e.else_branch().map(|b| match b { |
563 | ast::ElseBranch::Block(it) => self.collect_block(it), | 564 | ast::ElseBranch::Block(it) => self.collect_block(it), |
564 | ast::ElseBranch::IfExpr(elif) => { | 565 | ast::ElseBranch::IfExpr(elif) => { |
@@ -567,25 +568,30 @@ where | |||
567 | } | 568 | } |
568 | }); | 569 | }); |
569 | 570 | ||
570 | if let Some(pat) = e.condition().and_then(|c| c.pat()) { | 571 | let condition = match e.condition() { |
571 | // if let -- desugar to match | 572 | None => self.exprs.alloc(Expr::Missing), |
572 | let pat = self.collect_pat(pat); | 573 | Some(condition) => match condition.pat() { |
573 | let match_expr = | 574 | None => self.collect_expr_opt(condition.expr()), |
574 | self.collect_expr_opt(e.condition().expect("checked above").expr()); | 575 | // if let -- desugar to match |
575 | let placeholder_pat = self.pats.alloc(Pat::Missing); | 576 | Some(pat) => { |
576 | let arms = vec![ | 577 | let pat = self.collect_pat(pat); |
577 | MatchArm { pats: vec![pat], expr: then_branch, guard: None }, | 578 | let match_expr = self.collect_expr_opt(condition.expr()); |
578 | MatchArm { | 579 | let placeholder_pat = self.pats.alloc(Pat::Missing); |
579 | pats: vec![placeholder_pat], | 580 | let arms = vec![ |
580 | expr: else_branch.unwrap_or_else(|| self.empty_block()), | 581 | MatchArm { pats: vec![pat], expr: then_branch, guard: None }, |
581 | guard: None, | 582 | MatchArm { |
582 | }, | 583 | pats: vec![placeholder_pat], |
583 | ]; | 584 | expr: else_branch.unwrap_or_else(|| self.empty_block()), |
584 | self.alloc_expr(Expr::Match { expr: match_expr, arms }, syntax_ptr) | 585 | guard: None, |
585 | } else { | 586 | }, |
586 | let condition = self.collect_expr_opt(e.condition().and_then(|c| c.expr())); | 587 | ]; |
587 | self.alloc_expr(Expr::If { condition, then_branch, else_branch }, syntax_ptr) | 588 | return self |
588 | } | 589 | .alloc_expr(Expr::Match { expr: match_expr, arms }, syntax_ptr); |
590 | } | ||
591 | }, | ||
592 | }; | ||
593 | |||
594 | self.alloc_expr(Expr::If { condition, then_branch, else_branch }, syntax_ptr) | ||
589 | } | 595 | } |
590 | ast::ExprKind::TryBlockExpr(e) => { | 596 | ast::ExprKind::TryBlockExpr(e) => { |
591 | let body = self.collect_block_opt(e.try_body()); | 597 | let body = self.collect_block_opt(e.try_body()); |