diff options
Diffstat (limited to 'crates/ra_hir/src/ty/infer.rs')
-rw-r--r-- | crates/ra_hir/src/ty/infer.rs | 25 |
1 files changed, 19 insertions, 6 deletions
diff --git a/crates/ra_hir/src/ty/infer.rs b/crates/ra_hir/src/ty/infer.rs index 887153484..28947be51 100644 --- a/crates/ra_hir/src/ty/infer.rs +++ b/crates/ra_hir/src/ty/infer.rs | |||
@@ -32,7 +32,7 @@ use crate::{ | |||
32 | DefWithBody, | 32 | DefWithBody, |
33 | ImplItem, | 33 | ImplItem, |
34 | type_ref::{TypeRef, Mutability}, | 34 | type_ref::{TypeRef, Mutability}, |
35 | expr::{Body, Expr, BindingAnnotation, Literal, ExprId, Pat, PatId, UnaryOp, BinaryOp, Statement, FieldPat, self}, | 35 | expr::{Body, Expr, BindingAnnotation, Literal, ExprId, Pat, PatId, UnaryOp, BinaryOp, Statement, FieldPat,Array, self}, |
36 | generics::GenericParams, | 36 | generics::GenericParams, |
37 | path::{GenericArgs, GenericArg}, | 37 | path::{GenericArgs, GenericArg}, |
38 | adt::VariantDef, | 38 | adt::VariantDef, |
@@ -489,8 +489,8 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> { | |||
489 | Some(ty) | 489 | Some(ty) |
490 | } | 490 | } |
491 | Resolution::LocalBinding(pat) => { | 491 | Resolution::LocalBinding(pat) => { |
492 | let ty = self.type_of_pat.get(pat)?; | 492 | let ty = self.type_of_pat.get(pat)?.clone(); |
493 | let ty = self.resolve_ty_as_possible(&mut vec![], ty.clone()); | 493 | let ty = self.resolve_ty_as_possible(&mut vec![], ty); |
494 | Some(ty) | 494 | Some(ty) |
495 | } | 495 | } |
496 | Resolution::GenericParam(..) => { | 496 | Resolution::GenericParam(..) => { |
@@ -1074,7 +1074,7 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> { | |||
1074 | 1074 | ||
1075 | Ty::apply(TypeCtor::Tuple, Substs(ty_vec.into())) | 1075 | Ty::apply(TypeCtor::Tuple, Substs(ty_vec.into())) |
1076 | } | 1076 | } |
1077 | Expr::Array { exprs } => { | 1077 | Expr::Array(array) => { |
1078 | let elem_ty = match &expected.ty { | 1078 | let elem_ty = match &expected.ty { |
1079 | Ty::Apply(a_ty) => match a_ty.ctor { | 1079 | Ty::Apply(a_ty) => match a_ty.ctor { |
1080 | TypeCtor::Slice | TypeCtor::Array => { | 1080 | TypeCtor::Slice | TypeCtor::Array => { |
@@ -1085,8 +1085,21 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> { | |||
1085 | _ => self.new_type_var(), | 1085 | _ => self.new_type_var(), |
1086 | }; | 1086 | }; |
1087 | 1087 | ||
1088 | for expr in exprs.iter() { | 1088 | match array { |
1089 | self.infer_expr(*expr, &Expectation::has_type(elem_ty.clone())); | 1089 | Array::ElementList(items) => { |
1090 | for expr in items.iter() { | ||
1091 | self.infer_expr(*expr, &Expectation::has_type(elem_ty.clone())); | ||
1092 | } | ||
1093 | } | ||
1094 | Array::Repeat { initializer, repeat } => { | ||
1095 | self.infer_expr(*initializer, &Expectation::has_type(elem_ty.clone())); | ||
1096 | self.infer_expr( | ||
1097 | *repeat, | ||
1098 | &Expectation::has_type(Ty::simple(TypeCtor::Int( | ||
1099 | primitive::UncertainIntTy::Known(primitive::IntTy::usize()), | ||
1100 | ))), | ||
1101 | ); | ||
1102 | } | ||
1090 | } | 1103 | } |
1091 | 1104 | ||
1092 | Ty::apply_one(TypeCtor::Array, elem_ty) | 1105 | Ty::apply_one(TypeCtor::Array, elem_ty) |