aboutsummaryrefslogtreecommitdiff
path: root/crates/hir_ty/src/infer/expr.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/hir_ty/src/infer/expr.rs')
-rw-r--r--crates/hir_ty/src/infer/expr.rs24
1 files changed, 14 insertions, 10 deletions
diff --git a/crates/hir_ty/src/infer/expr.rs b/crates/hir_ty/src/infer/expr.rs
index 25ab3ea4c..b99b6cd21 100644
--- a/crates/hir_ty/src/infer/expr.rs
+++ b/crates/hir_ty/src/infer/expr.rs
@@ -266,7 +266,7 @@ impl<'a> InferenceContext<'a> {
266 let sig_ty = TyKind::Function(FnPointer { 266 let sig_ty = TyKind::Function(FnPointer {
267 num_args: sig_tys.len() - 1, 267 num_args: sig_tys.len() - 1,
268 sig: FnSig { abi: (), safety: chalk_ir::Safety::Safe, variadic: false }, 268 sig: FnSig { abi: (), safety: chalk_ir::Safety::Safe, variadic: false },
269 substs: Substitution(sig_tys.clone().into()), 269 substs: Substitution::from_iter(&Interner, sig_tys.clone()),
270 }) 270 })
271 .intern(&Interner); 271 .intern(&Interner);
272 let closure_id = self.db.intern_closure((self.owner, tgt_expr)).into(); 272 let closure_id = self.db.intern_closure((self.owner, tgt_expr)).into();
@@ -406,7 +406,7 @@ impl<'a> InferenceContext<'a> {
406 406
407 self.unify(&ty, &expected.ty); 407 self.unify(&ty, &expected.ty);
408 408
409 let substs = ty.substs().cloned().unwrap_or_else(Substitution::empty); 409 let substs = ty.substs().cloned().unwrap_or_else(|| Substitution::empty(&Interner));
410 let field_types = def_id.map(|it| self.db.field_types(it)).unwrap_or_default(); 410 let field_types = def_id.map(|it| self.db.field_types(it)).unwrap_or_default();
411 let variant_data = def_id.map(|it| variant_data(self.db.upcast(), it)); 411 let variant_data = def_id.map(|it| variant_data(self.db.upcast(), it));
412 for field in fields.iter() { 412 for field in fields.iter() {
@@ -456,9 +456,13 @@ impl<'a> InferenceContext<'a> {
456 .unwrap_or(true) 456 .unwrap_or(true)
457 }; 457 };
458 match canonicalized.decanonicalize_ty(derefed_ty.value).interned(&Interner) { 458 match canonicalized.decanonicalize_ty(derefed_ty.value).interned(&Interner) {
459 TyKind::Tuple(_, substs) => { 459 TyKind::Tuple(_, substs) => name.as_tuple_index().and_then(|idx| {
460 name.as_tuple_index().and_then(|idx| substs.0.get(idx).cloned()) 460 substs
461 } 461 .interned(&Interner)
462 .get(idx)
463 .map(|a| a.assert_ty_ref(&Interner))
464 .cloned()
465 }),
462 TyKind::Adt(AdtId(hir_def::AdtId::StructId(s)), parameters) => { 466 TyKind::Adt(AdtId(hir_def::AdtId::StructId(s)), parameters) => {
463 let local_id = self.db.struct_data(*s).variant_data.field(name)?; 467 let local_id = self.db.struct_data(*s).variant_data.field(name)?;
464 let field = FieldId { parent: (*s).into(), local_id }; 468 let field = FieldId { parent: (*s).into(), local_id };
@@ -635,7 +639,7 @@ impl<'a> InferenceContext<'a> {
635 let rhs_ty = rhs.map(|e| self.infer_expr(e, &rhs_expect)); 639 let rhs_ty = rhs.map(|e| self.infer_expr(e, &rhs_expect));
636 match (range_type, lhs_ty, rhs_ty) { 640 match (range_type, lhs_ty, rhs_ty) {
637 (RangeOp::Exclusive, None, None) => match self.resolve_range_full() { 641 (RangeOp::Exclusive, None, None) => match self.resolve_range_full() {
638 Some(adt) => Ty::adt_ty(adt, Substitution::empty()), 642 Some(adt) => Ty::adt_ty(adt, Substitution::empty(&Interner)),
639 None => self.err_ty(), 643 None => self.err_ty(),
640 }, 644 },
641 (RangeOp::Exclusive, None, Some(ty)) => match self.resolve_range_to() { 645 (RangeOp::Exclusive, None, Some(ty)) => match self.resolve_range_to() {
@@ -694,8 +698,8 @@ impl<'a> InferenceContext<'a> {
694 Expr::Tuple { exprs } => { 698 Expr::Tuple { exprs } => {
695 let mut tys = match expected.ty.interned(&Interner) { 699 let mut tys = match expected.ty.interned(&Interner) {
696 TyKind::Tuple(_, substs) => substs 700 TyKind::Tuple(_, substs) => substs
697 .iter() 701 .iter(&Interner)
698 .cloned() 702 .map(|a| a.assert_ty_ref(&Interner).clone())
699 .chain(repeat_with(|| self.table.new_type_var())) 703 .chain(repeat_with(|| self.table.new_type_var()))
700 .take(exprs.len()) 704 .take(exprs.len())
701 .collect::<Vec<_>>(), 705 .collect::<Vec<_>>(),
@@ -706,7 +710,7 @@ impl<'a> InferenceContext<'a> {
706 self.infer_expr_coerce(*expr, &Expectation::has_type(ty.clone())); 710 self.infer_expr_coerce(*expr, &Expectation::has_type(ty.clone()));
707 } 711 }
708 712
709 TyKind::Tuple(tys.len(), Substitution(tys.into())).intern(&Interner) 713 TyKind::Tuple(tys.len(), Substitution::from_iter(&Interner, tys)).intern(&Interner)
710 } 714 }
711 Expr::Array(array) => { 715 Expr::Array(array) => {
712 let elem_ty = match expected.ty.interned(&Interner) { 716 let elem_ty = match expected.ty.interned(&Interner) {
@@ -953,7 +957,7 @@ impl<'a> InferenceContext<'a> {
953 substs.push(self.err_ty()); 957 substs.push(self.err_ty());
954 } 958 }
955 assert_eq!(substs.len(), total_len); 959 assert_eq!(substs.len(), total_len);
956 Substitution(substs.into()) 960 Substitution::from_iter(&Interner, substs)
957 } 961 }
958 962
959 fn register_obligations_for_call(&mut self, callable_ty: &Ty) { 963 fn register_obligations_for_call(&mut self, callable_ty: &Ty) {