aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir/src/ty/infer/expr.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_hir/src/ty/infer/expr.rs')
-rw-r--r--crates/ra_hir/src/ty/infer/expr.rs11
1 files changed, 8 insertions, 3 deletions
diff --git a/crates/ra_hir/src/ty/infer/expr.rs b/crates/ra_hir/src/ty/infer/expr.rs
index 2996920c6..663ff9435 100644
--- a/crates/ra_hir/src/ty/infer/expr.rs
+++ b/crates/ra_hir/src/ty/infer/expr.rs
@@ -214,6 +214,8 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> {
214 self.unify(&ty, &expected.ty); 214 self.unify(&ty, &expected.ty);
215 215
216 let substs = ty.substs().unwrap_or_else(Substs::empty); 216 let substs = ty.substs().unwrap_or_else(Substs::empty);
217 let field_types =
218 def_id.map(|it| self.db.field_types(it.into())).unwrap_or_default();
217 for (field_idx, field) in fields.iter().enumerate() { 219 for (field_idx, field) in fields.iter().enumerate() {
218 let field_def = def_id.and_then(|it| match it.field(self.db, &field.name) { 220 let field_def = def_id.and_then(|it| match it.field(self.db, &field.name) {
219 Some(field) => Some(field), 221 Some(field) => Some(field),
@@ -228,8 +230,9 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> {
228 if let Some(field_def) = field_def { 230 if let Some(field_def) = field_def {
229 self.result.record_field_resolutions.insert(field.expr, field_def); 231 self.result.record_field_resolutions.insert(field.expr, field_def);
230 } 232 }
231 let field_ty = 233 let field_ty = field_def
232 field_def.map_or(Ty::Unknown, |field| field.ty(self.db)).subst(&substs); 234 .map_or(Ty::Unknown, |it| field_types[it.id].clone())
235 .subst(&substs);
233 self.infer_expr_coerce(field.expr, &Expectation::has_type(field_ty)); 236 self.infer_expr_coerce(field.expr, &Expectation::has_type(field_ty));
234 } 237 }
235 if let Some(expr) = spread { 238 if let Some(expr) = spread {
@@ -252,7 +255,9 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> {
252 .and_then(|idx| a_ty.parameters.0.get(idx).cloned()), 255 .and_then(|idx| a_ty.parameters.0.get(idx).cloned()),
253 TypeCtor::Adt(Adt::Struct(s)) => s.field(self.db, name).map(|field| { 256 TypeCtor::Adt(Adt::Struct(s)) => s.field(self.db, name).map(|field| {
254 self.write_field_resolution(tgt_expr, field); 257 self.write_field_resolution(tgt_expr, field);
255 field.ty(self.db).subst(&a_ty.parameters) 258 self.db.field_types(s.id.into())[field.id]
259 .clone()
260 .subst(&a_ty.parameters)
256 }), 261 }),
257 _ => None, 262 _ => None,
258 }, 263 },