From 7a7e47eab7323a8e122d9994b2936e50e42a1af2 Mon Sep 17 00:00:00 2001 From: Florian Diebold Date: Thu, 18 Mar 2021 21:53:19 +0100 Subject: Chalkify TraitRef --- crates/hir_ty/src/infer/coerce.rs | 6 ++++-- crates/hir_ty/src/infer/expr.rs | 13 +++++++++---- crates/hir_ty/src/infer/path.rs | 12 +++++++----- crates/hir_ty/src/infer/unify.rs | 4 ++-- 4 files changed, 22 insertions(+), 13 deletions(-) (limited to 'crates/hir_ty/src/infer') diff --git a/crates/hir_ty/src/infer/coerce.rs b/crates/hir_ty/src/infer/coerce.rs index b1f98c507..b86474ed4 100644 --- a/crates/hir_ty/src/infer/coerce.rs +++ b/crates/hir_ty/src/infer/coerce.rs @@ -8,7 +8,8 @@ use chalk_ir::{Mutability, TyVariableKind}; use hir_def::lang_item::LangItemTarget; use crate::{ - autoderef, traits::Solution, Interner, Obligation, Substitution, TraitRef, Ty, TyKind, + autoderef, to_chalk_trait_id, traits::Solution, Interner, Obligation, Substitution, TraitRef, + Ty, TyKind, }; use super::{InEnvironment, InferenceContext}; @@ -140,7 +141,8 @@ impl<'a> InferenceContext<'a> { .push(from_ty.clone()) .push(to_ty.clone()) .build(); - let trait_ref = TraitRef { trait_: coerce_unsized_trait, substs }; + let trait_ref = + TraitRef { trait_id: to_chalk_trait_id(coerce_unsized_trait), substitution: substs }; let goal = InEnvironment::new(self.trait_env.clone(), Obligation::Trait(trait_ref)); let canonicalizer = self.canonicalizer(); diff --git a/crates/hir_ty/src/infer/expr.rs b/crates/hir_ty/src/infer/expr.rs index 0be8c5a90..93548b6c0 100644 --- a/crates/hir_ty/src/infer/expr.rs +++ b/crates/hir_ty/src/infer/expr.rs @@ -18,7 +18,7 @@ use crate::{ lower::lower_to_chalk_mutability, method_resolution, op, primitive::{self, UintTy}, - to_assoc_type_id, + to_assoc_type_id, to_chalk_trait_id, traits::{chalk::from_chalk, FnTrait, InEnvironment}, utils::{generics, variant_data, Generics}, AdtId, Binders, CallableDefId, FnPointer, FnSig, Interner, Obligation, Rawness, Scalar, @@ -90,8 +90,10 @@ impl<'a> InferenceContext<'a> { Substitution::build_for_generics(&generic_params).push(ty.clone()).push(arg_ty).build(); let trait_env = Arc::clone(&self.trait_env); - let implements_fn_trait = - Obligation::Trait(TraitRef { trait_: fn_once_trait, substs: substs.clone() }); + let implements_fn_trait = Obligation::Trait(TraitRef { + trait_id: to_chalk_trait_id(fn_once_trait), + substitution: substs.clone(), + }); let goal = self.canonicalizer().canonicalize_obligation(InEnvironment { value: implements_fn_trait.clone(), environment: trait_env, @@ -948,7 +950,10 @@ impl<'a> InferenceContext<'a> { // construct a TraitDef let substs = parameters.prefix(generics(self.db.upcast(), trait_.into()).len()); - self.obligations.push(Obligation::Trait(TraitRef { trait_, substs })); + self.obligations.push(Obligation::Trait(TraitRef { + trait_id: to_chalk_trait_id(trait_), + substitution: substs, + })); } } CallableDefId::StructId(_) | CallableDefId::EnumVariantId(_) => {} diff --git a/crates/hir_ty/src/infer/path.rs b/crates/hir_ty/src/infer/path.rs index ea01d6238..e15135fc1 100644 --- a/crates/hir_ty/src/infer/path.rs +++ b/crates/hir_ty/src/infer/path.rs @@ -9,7 +9,9 @@ use hir_def::{ }; use hir_expand::name::Name; -use crate::{method_resolution, Interner, Substitution, Ty, TyKind, ValueTyDefId}; +use crate::{ + method_resolution, to_chalk_trait_id, Interner, Substitution, Ty, TyKind, ValueTyDefId, +}; use super::{ExprOrPatId, InferenceContext, TraitRef}; @@ -165,7 +167,7 @@ impl<'a> InferenceContext<'a> { segment: PathSegment<'_>, id: ExprOrPatId, ) -> Option<(ValueNs, Option)> { - let trait_ = trait_ref.trait_; + let trait_ = trait_ref.hir_trait_id(); let item = self.db.trait_data(trait_).items.iter().map(|(_name, id)| (*id)).find_map(|item| { match item { @@ -200,7 +202,7 @@ impl<'a> InferenceContext<'a> { }; self.write_assoc_resolution(id, item); - Some((def, Some(trait_ref.substs))) + Some((def, Some(trait_ref.substitution))) } fn resolve_ty_assoc_item( @@ -255,8 +257,8 @@ impl<'a> InferenceContext<'a> { .fill(std::iter::repeat_with(|| self.table.new_type_var())) .build(); self.obligations.push(super::Obligation::Trait(TraitRef { - trait_, - substs: trait_substs.clone(), + trait_id: to_chalk_trait_id(trait_), + substitution: trait_substs.clone(), })); Some(trait_substs) } diff --git a/crates/hir_ty/src/infer/unify.rs b/crates/hir_ty/src/infer/unify.rs index b2d4f67b3..f5ea09698 100644 --- a/crates/hir_ty/src/infer/unify.rs +++ b/crates/hir_ty/src/infer/unify.rs @@ -390,9 +390,9 @@ impl InferenceTable { ) -> bool { match (pred1, pred2) { (GenericPredicate::Implemented(tr1), GenericPredicate::Implemented(tr2)) - if tr1.trait_ == tr2.trait_ => + if tr1.trait_id == tr2.trait_id => { - self.unify_substs(&tr1.substs, &tr2.substs, depth + 1) + self.unify_substs(&tr1.substitution, &tr2.substitution, depth + 1) } (GenericPredicate::Projection(proj1), GenericPredicate::Projection(proj2)) if proj1.projection_ty.associated_ty_id == proj2.projection_ty.associated_ty_id => -- cgit v1.2.3