diff options
Diffstat (limited to 'crates/ra_hir/src/ty/infer/unify.rs')
-rw-r--r-- | crates/ra_hir/src/ty/infer/unify.rs | 23 |
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 | }; |
9 | use crate::util::make_mut_slice; | ||
9 | 10 | ||
10 | impl<'a, D: HirDatabase> InferenceContext<'a, D> { | 11 | impl<'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( |