From daaf46177e5dc63e20e5a1ec5692e53cc8f7bc34 Mon Sep 17 00:00:00 2001 From: Florian Diebold Date: Thu, 26 Sep 2019 21:37:03 +0200 Subject: Add SubstsBuilder + further refactoring. --- crates/ra_hir/src/ty/infer/path.rs | 10 +++++----- crates/ra_hir/src/ty/infer/unify.rs | 24 +++++++++--------------- 2 files changed, 14 insertions(+), 20 deletions(-) (limited to 'crates/ra_hir/src/ty/infer') diff --git a/crates/ra_hir/src/ty/infer/path.rs b/crates/ra_hir/src/ty/infer/path.rs index feb7481b2..db979353a 100644 --- a/crates/ra_hir/src/ty/infer/path.rs +++ b/crates/ra_hir/src/ty/infer/path.rs @@ -158,13 +158,13 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> { AssocItem::Const(c) => ValueNs::Const(c), AssocItem::TypeAlias(_) => unreachable!(), }; - let generics = item.generic_params(self.db); - let mut substs = Vec::with_capacity(generics.count_params_including_parent()); - substs.extend(trait_ref.substs.iter().cloned()); - substs.extend(std::iter::repeat(Ty::Unknown).take(generics.params.len())); + let substs = Substs::build_for_def(self.db, item) + .use_parent_substs(&trait_ref.substs) + .fill_with_unknown() + .build(); self.write_assoc_resolution(id, item); - Some((def, Some(substs.into()))) + Some((def, Some(substs))) } fn resolve_ty_assoc_item( diff --git a/crates/ra_hir/src/ty/infer/unify.rs b/crates/ra_hir/src/ty/infer/unify.rs index b6ebee3b1..d161aa6b3 100644 --- a/crates/ra_hir/src/ty/infer/unify.rs +++ b/crates/ra_hir/src/ty/infer/unify.rs @@ -3,7 +3,8 @@ use super::{InferenceContext, Obligation}; use crate::db::HirDatabase; use crate::ty::{ - Canonical, InEnvironment, InferTy, ProjectionPredicate, ProjectionTy, TraitRef, Ty, TypeWalk, + Canonical, InEnvironment, InferTy, ProjectionPredicate, ProjectionTy, Substs, TraitRef, Ty, + TypeWalk, }; impl<'a, D: HirDatabase> InferenceContext<'a, D> { @@ -74,12 +75,9 @@ where } fn do_canonicalize_trait_ref(&mut self, trait_ref: TraitRef) -> TraitRef { - let substs = trait_ref - .substs - .iter() - .map(|ty| self.do_canonicalize_ty(ty.clone())) - .collect::>(); - TraitRef { trait_: trait_ref.trait_, substs: substs.into() } + let substs = + trait_ref.substs.iter().map(|ty| self.do_canonicalize_ty(ty.clone())).collect(); + TraitRef { trait_: trait_ref.trait_, substs: Substs(substs) } } fn into_canonicalized(self, result: T) -> Canonicalized { @@ -90,12 +88,9 @@ where } fn do_canonicalize_projection_ty(&mut self, projection_ty: ProjectionTy) -> ProjectionTy { - let params = projection_ty - .parameters - .iter() - .map(|ty| self.do_canonicalize_ty(ty.clone())) - .collect::>(); - ProjectionTy { associated_ty: projection_ty.associated_ty, parameters: params.into() } + let params = + projection_ty.parameters.iter().map(|ty| self.do_canonicalize_ty(ty.clone())).collect(); + ProjectionTy { associated_ty: projection_ty.associated_ty, parameters: Substs(params) } } fn do_canonicalize_projection_predicate( @@ -153,8 +148,7 @@ impl Canonicalized { solution: Canonical>, ) { // the solution may contain new variables, which we need to convert to new inference vars - let new_vars = - (0..solution.num_vars).map(|_| ctx.new_type_var()).collect::>().into(); + let new_vars = Substs((0..solution.num_vars).map(|_| ctx.new_type_var()).collect()); for (i, ty) in solution.value.into_iter().enumerate() { let var = self.free_vars[i]; ctx.unify(&Ty::Infer(var), &ty.subst_bound_vars(&new_vars)); -- cgit v1.2.3