diff options
Diffstat (limited to 'crates/ra_hir/src/ty/infer')
-rw-r--r-- | crates/ra_hir/src/ty/infer/unify.rs | 34 |
1 files changed, 21 insertions, 13 deletions
diff --git a/crates/ra_hir/src/ty/infer/unify.rs b/crates/ra_hir/src/ty/infer/unify.rs index a24e5eb5c..e7e8825d1 100644 --- a/crates/ra_hir/src/ty/infer/unify.rs +++ b/crates/ra_hir/src/ty/infer/unify.rs | |||
@@ -1,8 +1,10 @@ | |||
1 | //! Unification and canonicalization logic. | 1 | //! Unification and canonicalization logic. |
2 | 2 | ||
3 | use super::InferenceContext; | 3 | use super::{InferenceContext, Obligation}; |
4 | use crate::db::HirDatabase; | 4 | use crate::db::HirDatabase; |
5 | use crate::ty::{Canonical, InferTy, ProjectionPredicate, ProjectionTy, TraitRef, Ty}; | 5 | use crate::ty::{ |
6 | Canonical, InEnvironment, InferTy, ProjectionPredicate, ProjectionTy, TraitRef, Ty, | ||
7 | }; | ||
6 | 8 | ||
7 | impl<'a, D: HirDatabase> InferenceContext<'a, D> { | 9 | impl<'a, D: HirDatabase> InferenceContext<'a, D> { |
8 | pub(super) fn canonicalizer<'b>(&'b mut self) -> Canonicalizer<'a, 'b, D> | 10 | pub(super) fn canonicalizer<'b>(&'b mut self) -> Canonicalizer<'a, 'b, D> |
@@ -105,22 +107,28 @@ where | |||
105 | ProjectionPredicate { ty, projection_ty } | 107 | ProjectionPredicate { ty, projection_ty } |
106 | } | 108 | } |
107 | 109 | ||
108 | pub fn canonicalize_ty(mut self, ty: Ty) -> Canonicalized<Ty> { | 110 | // FIXME: add some point, we need to introduce a `Fold` trait that abstracts |
109 | let result = self.do_canonicalize_ty(ty); | 111 | // over all the things that can be canonicalized (like Chalk and rustc have) |
110 | self.into_canonicalized(result) | ||
111 | } | ||
112 | 112 | ||
113 | pub fn canonicalize_trait_ref(mut self, trait_ref: TraitRef) -> Canonicalized<TraitRef> { | 113 | pub(crate) fn canonicalize_ty(mut self, ty: Ty) -> Canonicalized<Ty> { |
114 | let result = self.do_canonicalize_trait_ref(trait_ref); | 114 | let result = self.do_canonicalize_ty(ty); |
115 | self.into_canonicalized(result) | 115 | self.into_canonicalized(result) |
116 | } | 116 | } |
117 | 117 | ||
118 | pub fn canonicalize_projection( | 118 | pub(crate) fn canonicalize_obligation( |
119 | mut self, | 119 | mut self, |
120 | projection: ProjectionPredicate, | 120 | obligation: InEnvironment<Obligation>, |
121 | ) -> Canonicalized<ProjectionPredicate> { | 121 | ) -> Canonicalized<InEnvironment<Obligation>> { |
122 | let result = self.do_canonicalize_projection_predicate(projection); | 122 | let result = match obligation.value { |
123 | self.into_canonicalized(result) | 123 | Obligation::Trait(tr) => Obligation::Trait(self.do_canonicalize_trait_ref(tr)), |
124 | Obligation::Projection(pr) => { | ||
125 | Obligation::Projection(self.do_canonicalize_projection_predicate(pr)) | ||
126 | } | ||
127 | }; | ||
128 | self.into_canonicalized(InEnvironment { | ||
129 | value: result, | ||
130 | environment: obligation.environment, | ||
131 | }) | ||
124 | } | 132 | } |
125 | } | 133 | } |
126 | 134 | ||