aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir/src/ty/infer/unify.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_hir/src/ty/infer/unify.rs')
-rw-r--r--crates/ra_hir/src/ty/infer/unify.rs23
1 files changed, 14 insertions, 9 deletions
diff --git a/crates/ra_hir/src/ty/infer/unify.rs b/crates/ra_hir/src/ty/infer/unify.rs
index d161aa6b3..ca33cc7f8 100644
--- a/crates/ra_hir/src/ty/infer/unify.rs
+++ b/crates/ra_hir/src/ty/infer/unify.rs
@@ -6,6 +6,7 @@ use crate::ty::{
6 Canonical, InEnvironment, InferTy, ProjectionPredicate, ProjectionTy, Substs, TraitRef, Ty, 6 Canonical, InEnvironment, InferTy, ProjectionPredicate, ProjectionTy, Substs, TraitRef, Ty,
7 TypeWalk, 7 TypeWalk,
8}; 8};
9use crate::util::make_mut_slice;
9 10
10impl<'a, D: HirDatabase> InferenceContext<'a, D> { 11impl<'a, D: HirDatabase> InferenceContext<'a, D> {
11 pub(super) fn canonicalizer<'b>(&'b mut self) -> Canonicalizer<'a, 'b, D> 12 pub(super) fn canonicalizer<'b>(&'b mut self) -> Canonicalizer<'a, 'b, D>
@@ -53,7 +54,9 @@ where
53 // recursive type 54 // recursive type
54 return tv.fallback_value(); 55 return tv.fallback_value();
55 } 56 }
56 if let Some(known_ty) = self.ctx.var_unification_table.probe_value(inner).known() { 57 if let Some(known_ty) =
58 self.ctx.var_unification_table.inlined_probe_value(inner).known()
59 {
57 self.var_stack.push(inner); 60 self.var_stack.push(inner);
58 let result = self.do_canonicalize_ty(known_ty.clone()); 61 let result = self.do_canonicalize_ty(known_ty.clone());
59 self.var_stack.pop(); 62 self.var_stack.pop();
@@ -74,10 +77,11 @@ where
74 }) 77 })
75 } 78 }
76 79
77 fn do_canonicalize_trait_ref(&mut self, trait_ref: TraitRef) -> TraitRef { 80 fn do_canonicalize_trait_ref(&mut self, mut trait_ref: TraitRef) -> TraitRef {
78 let substs = 81 for ty in make_mut_slice(&mut trait_ref.substs.0) {
79 trait_ref.substs.iter().map(|ty| self.do_canonicalize_ty(ty.clone())).collect(); 82 *ty = self.do_canonicalize_ty(ty.clone());
80 TraitRef { trait_: trait_ref.trait_, substs: Substs(substs) } 83 }
84 trait_ref
81 } 85 }
82 86
83 fn into_canonicalized<T>(self, result: T) -> Canonicalized<T> { 87 fn into_canonicalized<T>(self, result: T) -> Canonicalized<T> {
@@ -87,10 +91,11 @@ where
87 } 91 }
88 } 92 }
89 93
90 fn do_canonicalize_projection_ty(&mut self, projection_ty: ProjectionTy) -> ProjectionTy { 94 fn do_canonicalize_projection_ty(&mut self, mut projection_ty: ProjectionTy) -> ProjectionTy {
91 let params = 95 for ty in make_mut_slice(&mut projection_ty.parameters.0) {
92 projection_ty.parameters.iter().map(|ty| self.do_canonicalize_ty(ty.clone())).collect(); 96 *ty = self.do_canonicalize_ty(ty.clone());
93 ProjectionTy { associated_ty: projection_ty.associated_ty, parameters: Substs(params) } 97 }
98 projection_ty
94 } 99 }
95 100
96 fn do_canonicalize_projection_predicate( 101 fn do_canonicalize_projection_predicate(