aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir/src/ty/infer/unify.rs
diff options
context:
space:
mode:
authorShotaro Yamada <[email protected]>2019-10-14 04:56:18 +0100
committerShotaro Yamada <[email protected]>2019-10-14 06:25:05 +0100
commitf8d4cdc170bead42db3ffa647318ecf2bd6430e7 (patch)
tree2c020016af1fd5239fdad65b816b4cccea97df41 /crates/ra_hir/src/ty/infer/unify.rs
parent77f2dd96a122e59a8d8df8afb53a741df9b1af76 (diff)
Avoid cloning `Arc<[T]>` into a vec if possible
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, 15 insertions, 8 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};
9use crate::util::make_mut_arc_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>
@@ -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(