diff options
| author | Niko Matsakis <niko@alum.mit.edu> | 2017-10-24 14:20:32 -0400 |
|---|---|---|
| committer | Niko Matsakis <niko@alum.mit.edu> | 2017-10-31 12:41:38 -0400 |
| commit | 8535a4a32c2b11b0ecadd00d857604fed81e869e (patch) | |
| tree | e153720b2730fe4563be95e7d0c488db5d0f29b7 /src | |
| parent | 1f06ba486f9a7ac92aca81ab4960e251646f3b97 (diff) | |
| download | rust-8535a4a32c2b11b0ecadd00d857604fed81e869e.tar.gz rust-8535a4a32c2b11b0ecadd00d857604fed81e869e.zip | |
add helper `for_each_free_region` that iterates over free regions
Diffstat (limited to 'src')
| -rw-r--r-- | src/librustc/ty/fold.rs | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/src/librustc/ty/fold.rs b/src/librustc/ty/fold.rs index edd4329fa41..149999e0eee 100644 --- a/src/librustc/ty/fold.rs +++ b/src/librustc/ty/fold.rs @@ -218,6 +218,43 @@ impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> { { value.fold_with(&mut RegionFolder::new(self, skipped_regions, &mut f)) } + + pub fn for_each_free_region<T,F>(self, + value: &T, + callback: F) + where F: FnMut(ty::Region<'tcx>), + T: TypeFoldable<'tcx>, + { + value.visit_with(&mut RegionVisitor { current_depth: 0, callback }); + + struct RegionVisitor<F> { + current_depth: u32, + callback: F, + } + + impl<'tcx, F> TypeVisitor<'tcx> for RegionVisitor<F> + where F : FnMut(ty::Region<'tcx>) + { + fn visit_binder<T: TypeFoldable<'tcx>>(&mut self, t: &Binder<T>) -> bool { + self.current_depth += 1; + t.skip_binder().visit_with(self); + self.current_depth -= 1; + + false // keep visiting + } + + fn visit_region(&mut self, r: ty::Region<'tcx>) -> bool { + match *r { + ty::ReLateBound(debruijn, _) if debruijn.depth < self.current_depth => { + /* ignore bound regions */ + } + _ => (self.callback)(r), + } + + false // keep visiting + } + } + } } /// Folds over the substructure of a type, visiting its component |
