diff options
author | Florian Diebold <[email protected]> | 2019-09-03 12:10:00 +0100 |
---|---|---|
committer | Florian Diebold <[email protected]> | 2019-09-03 13:00:35 +0100 |
commit | b8c1e402fa3a40c7e979750d60d7b003f9cb7b0d (patch) | |
tree | ddd1737a8e3f46fb8757bad1d8024469d3bf0a89 /crates/ra_hir/src/ty/traits.rs | |
parent | c4fcfa2b0d516b9790fa8abdf96bb2308657d60a (diff) |
Make type walking infrastructure a bit nicer
If/when we switch to using Chalk's Ty, we'll need to replace this by its `Fold`
trait, but I didn't want to import the whole thing just yet.
Diffstat (limited to 'crates/ra_hir/src/ty/traits.rs')
-rw-r--r-- | crates/ra_hir/src/ty/traits.rs | 20 |
1 files changed, 4 insertions, 16 deletions
diff --git a/crates/ra_hir/src/ty/traits.rs b/crates/ra_hir/src/ty/traits.rs index 25316bc02..6e0271a96 100644 --- a/crates/ra_hir/src/ty/traits.rs +++ b/crates/ra_hir/src/ty/traits.rs | |||
@@ -8,7 +8,7 @@ use ra_db::salsa; | |||
8 | use ra_prof::profile; | 8 | use ra_prof::profile; |
9 | use rustc_hash::FxHashSet; | 9 | use rustc_hash::FxHashSet; |
10 | 10 | ||
11 | use super::{Canonical, GenericPredicate, HirDisplay, ProjectionTy, TraitRef, Ty}; | 11 | use super::{Canonical, GenericPredicate, HirDisplay, ProjectionTy, TraitRef, Ty, TypeWalk}; |
12 | use crate::{db::HirDatabase, Crate, ImplBlock, Trait}; | 12 | use crate::{db::HirDatabase, Crate, ImplBlock, Trait}; |
13 | 13 | ||
14 | use self::chalk::{from_chalk, ToChalk}; | 14 | use self::chalk::{from_chalk, ToChalk}; |
@@ -138,25 +138,13 @@ pub struct ProjectionPredicate { | |||
138 | pub ty: Ty, | 138 | pub ty: Ty, |
139 | } | 139 | } |
140 | 140 | ||
141 | impl ProjectionPredicate { | 141 | impl TypeWalk for ProjectionPredicate { |
142 | pub fn subst(mut self, substs: &super::Substs) -> ProjectionPredicate { | 142 | fn walk(&self, f: &mut impl FnMut(&Ty)) { |
143 | self.walk_mut(&mut |ty| match ty { | ||
144 | Ty::Param { idx, .. } => { | ||
145 | if let Some(t) = substs.get(*idx as usize).cloned() { | ||
146 | *ty = t; | ||
147 | } | ||
148 | } | ||
149 | _ => {} | ||
150 | }); | ||
151 | self | ||
152 | } | ||
153 | |||
154 | pub fn walk(&self, f: &mut impl FnMut(&Ty)) { | ||
155 | self.projection_ty.walk(f); | 143 | self.projection_ty.walk(f); |
156 | self.ty.walk(f); | 144 | self.ty.walk(f); |
157 | } | 145 | } |
158 | 146 | ||
159 | pub fn walk_mut(&mut self, f: &mut impl FnMut(&mut Ty)) { | 147 | fn walk_mut(&mut self, f: &mut impl FnMut(&mut Ty)) { |
160 | self.projection_ty.walk_mut(f); | 148 | self.projection_ty.walk_mut(f); |
161 | self.ty.walk_mut(f); | 149 | self.ty.walk_mut(f); |
162 | } | 150 | } |