diff options
author | Florian Diebold <[email protected]> | 2021-04-01 20:04:02 +0100 |
---|---|---|
committer | Florian Diebold <[email protected]> | 2021-04-03 10:17:13 +0100 |
commit | e480d81988fc0c0e4f80f1c54058b95b9aaf1ebf (patch) | |
tree | 079dabc4e0de72e30d2bd04bd50427ff6950b348 /crates/hir_ty/src/infer/expr.rs | |
parent | 327f3a0a3017e047be58b8312f8bf3ac690db3fd (diff) |
Introduce `GenericArg` like in Chalk
Plus some more adaptations to Substitution.
Lots of `assert_ty_ref` that we should revisit when introducing
lifetime/const parameters.
Diffstat (limited to 'crates/hir_ty/src/infer/expr.rs')
-rw-r--r-- | crates/hir_ty/src/infer/expr.rs | 24 |
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) { |