From 619af1e22cb71b981fde4cedbf6ebce9b3488028 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Sun, 27 Jan 2019 00:23:07 +0300 Subject: fix AST for if expressions then is not always a block... --- crates/ra_hir/src/expr.rs | 16 ++++++++++++++-- .../ra_hir/src/ty/snapshots/tests__infer_in_elseif.snap | 17 +++++++++++++++++ crates/ra_hir/src/ty/tests.rs | 17 +++++++++++++++++ 3 files changed, 48 insertions(+), 2 deletions(-) create mode 100644 crates/ra_hir/src/ty/snapshots/tests__infer_in_elseif.snap (limited to 'crates/ra_hir') diff --git a/crates/ra_hir/src/expr.rs b/crates/ra_hir/src/expr.rs index 29469af2c..60d997bbe 100644 --- a/crates/ra_hir/src/expr.rs +++ b/crates/ra_hir/src/expr.rs @@ -498,7 +498,13 @@ impl ExprCollector { let then_branch = self.collect_block_opt(e.then_branch()); let else_branch = e .else_branch() - .map(|e| self.collect_block(e)) + .map(|b| match b { + ast::ElseBranchFlavor::Block(it) => self.collect_block(it), + ast::ElseBranchFlavor::IfExpr(elif) => { + let expr: &ast::Expr = ast::Expr::cast(elif.syntax()).unwrap(); + self.collect_expr(expr) + } + }) .unwrap_or_else(|| self.empty_block()); let placeholder_pat = self.pats.alloc(Pat::Missing); let arms = vec![ @@ -521,7 +527,13 @@ impl ExprCollector { } else { let condition = self.collect_expr_opt(e.condition().and_then(|c| c.expr())); let then_branch = self.collect_block_opt(e.then_branch()); - let else_branch = e.else_branch().map(|e| self.collect_block(e)); + let else_branch = e.else_branch().map(|b| match b { + ast::ElseBranchFlavor::Block(it) => self.collect_block(it), + ast::ElseBranchFlavor::IfExpr(elif) => { + let expr: &ast::Expr = ast::Expr::cast(elif.syntax()).unwrap(); + self.collect_expr(expr) + } + }); self.alloc_expr( Expr::If { condition, diff --git a/crates/ra_hir/src/ty/snapshots/tests__infer_in_elseif.snap b/crates/ra_hir/src/ty/snapshots/tests__infer_in_elseif.snap new file mode 100644 index 000000000..6a435e5cf --- /dev/null +++ b/crates/ra_hir/src/ty/snapshots/tests__infer_in_elseif.snap @@ -0,0 +1,17 @@ +--- +created: "2019-01-26T21:36:52.714121185+00:00" +creator: insta@0.5.2 +expression: "&result" +source: crates/ra_hir/src/ty/tests.rs +--- +[35; 38) 'foo': Foo +[45; 109) '{ ... } }': () +[51; 107) 'if tru... }': () +[54; 58) 'true': bool +[59; 67) '{ }': () +[73; 107) 'if fal... }': i32 +[76; 81) 'false': bool +[82; 107) '{ ... }': i32 +[92; 95) 'foo': Foo +[92; 101) 'foo.field': i32 + diff --git a/crates/ra_hir/src/ty/tests.rs b/crates/ra_hir/src/ty/tests.rs index e0b0689f8..e1165f682 100644 --- a/crates/ra_hir/src/ty/tests.rs +++ b/crates/ra_hir/src/ty/tests.rs @@ -284,6 +284,23 @@ fn test() { ); } +#[test] +fn infer_in_elseif() { + check_inference( + "infer_in_elseif", + r#" +struct Foo { field: i32 } +fn main(foo: Foo) { + if true { + + } else if false { + foo.field + } +} +"#, + ) +} + #[test] fn infer_inherent_method() { check_inference( -- cgit v1.2.3