diff options
Diffstat (limited to 'crates/ra_hir/src/ty')
-rw-r--r-- | crates/ra_hir/src/ty/infer/unify.rs | 23 | ||||
-rw-r--r-- | crates/ra_hir/src/ty/lower.rs | 7 |
2 files changed, 18 insertions, 12 deletions
diff --git a/crates/ra_hir/src/ty/infer/unify.rs b/crates/ra_hir/src/ty/infer/unify.rs index d161aa6b3..5e86ed260 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_arc_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> |
@@ -74,10 +75,13 @@ where | |||
74 | }) | 75 | }) |
75 | } | 76 | } |
76 | 77 | ||
77 | fn do_canonicalize_trait_ref(&mut self, trait_ref: TraitRef) -> TraitRef { | 78 | fn do_canonicalize_trait_ref(&mut self, mut trait_ref: TraitRef) -> TraitRef { |
78 | let substs = | 79 | make_mut_arc_slice(&mut trait_ref.substs.0, |tys| { |
79 | trait_ref.substs.iter().map(|ty| self.do_canonicalize_ty(ty.clone())).collect(); | 80 | for ty in tys { |
80 | TraitRef { trait_: trait_ref.trait_, substs: Substs(substs) } | 81 | *ty = self.do_canonicalize_ty(ty.clone()); |
82 | } | ||
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,13 @@ 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 | make_mut_arc_slice(&mut projection_ty.parameters.0, |params| { |
92 | projection_ty.parameters.iter().map(|ty| self.do_canonicalize_ty(ty.clone())).collect(); | 96 | for ty in params { |
93 | ProjectionTy { associated_ty: projection_ty.associated_ty, parameters: Substs(params) } | 97 | *ty = self.do_canonicalize_ty(ty.clone()); |
98 | } | ||
99 | }); | ||
100 | projection_ty | ||
94 | } | 101 | } |
95 | 102 | ||
96 | fn do_canonicalize_projection_predicate( | 103 | fn do_canonicalize_projection_predicate( |
diff --git a/crates/ra_hir/src/ty/lower.rs b/crates/ra_hir/src/ty/lower.rs index a604c02e2..003aa9bab 100644 --- a/crates/ra_hir/src/ty/lower.rs +++ b/crates/ra_hir/src/ty/lower.rs | |||
@@ -392,10 +392,9 @@ impl TraitRef { | |||
392 | ) -> Self { | 392 | ) -> Self { |
393 | let mut substs = TraitRef::substs_from_path(db, resolver, segment, resolved); | 393 | let mut substs = TraitRef::substs_from_path(db, resolver, segment, resolved); |
394 | if let Some(self_ty) = explicit_self_ty { | 394 | if let Some(self_ty) = explicit_self_ty { |
395 | // FIXME this could be nicer | 395 | crate::util::make_mut_arc_slice(&mut substs.0, |substs| { |
396 | let mut substs_vec = substs.0.to_vec(); | 396 | substs[0] = self_ty; |
397 | substs_vec[0] = self_ty; | 397 | }); |
398 | substs.0 = substs_vec.into(); | ||
399 | } | 398 | } |
400 | TraitRef { trait_: resolved, substs } | 399 | TraitRef { trait_: resolved, substs } |
401 | } | 400 | } |