From 6e73cc89b6f2e0086a3261489811f221ee7deaa8 Mon Sep 17 00:00:00 2001 From: Hirokazu Hata Date: Sun, 13 Jan 2019 21:00:27 +0900 Subject: Implement tuple inference --- crates/ra_hir/src/expr.rs | 13 ++++++++++++- crates/ra_hir/src/ty.rs | 8 ++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/crates/ra_hir/src/expr.rs b/crates/ra_hir/src/expr.rs index 593fe1598..f0936e9f3 100644 --- a/crates/ra_hir/src/expr.rs +++ b/crates/ra_hir/src/expr.rs @@ -183,6 +183,9 @@ pub enum Expr { arg_types: Vec>, body: ExprId, }, + Tuple { + exprs: Vec, + }, } pub use ra_syntax::ast::PrefixOp as UnaryOp; @@ -297,6 +300,11 @@ impl Expr { | Expr::UnaryOp { expr, .. } => { f(*expr); } + Expr::Tuple { exprs } => { + for expr in exprs { + f(*expr); + } + } } } } @@ -621,11 +629,14 @@ impl ExprCollector { let op = e.op(); self.alloc_expr(Expr::BinaryOp { lhs, rhs, op }, syntax_ptr) } + ast::ExprKind::TupleExpr(e) => { + let exprs = e.exprs().map(|expr| self.collect_expr(expr)).collect(); + self.alloc_expr(Expr::Tuple { exprs }, syntax_ptr) + } // TODO implement HIR for these: ast::ExprKind::Label(_e) => self.alloc_expr(Expr::Missing, syntax_ptr), ast::ExprKind::IndexExpr(_e) => self.alloc_expr(Expr::Missing, syntax_ptr), - ast::ExprKind::TupleExpr(_e) => self.alloc_expr(Expr::Missing, syntax_ptr), ast::ExprKind::ArrayExpr(_e) => self.alloc_expr(Expr::Missing, syntax_ptr), ast::ExprKind::RangeExpr(_e) => self.alloc_expr(Expr::Missing, syntax_ptr), ast::ExprKind::Literal(_e) => self.alloc_expr(Expr::Missing, syntax_ptr), diff --git a/crates/ra_hir/src/ty.rs b/crates/ra_hir/src/ty.rs index 5d5568d69..0692d3b2a 100644 --- a/crates/ra_hir/src/ty.rs +++ b/crates/ra_hir/src/ty.rs @@ -1040,6 +1040,14 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> { } _ => Ty::Unknown, }, + Expr::Tuple { exprs } => { + let mut ty_vec = Vec::with_capacity(exprs.len()); + for arg in exprs.iter() { + ty_vec.push(self.infer_expr(*arg, &Expectation::none())?); + } + + Ty::Tuple(Arc::from(ty_vec)) + } }; // use a new type variable if we got Ty::Unknown here let ty = self.insert_type_vars_shallow(ty); -- cgit v1.2.3