about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorNiko Matsakis <niko@alum.mit.edu>2017-10-24 14:20:32 -0400
committerNiko Matsakis <niko@alum.mit.edu>2017-10-31 12:41:38 -0400
commit8535a4a32c2b11b0ecadd00d857604fed81e869e (patch)
treee153720b2730fe4563be95e7d0c488db5d0f29b7 /src
parent1f06ba486f9a7ac92aca81ab4960e251646f3b97 (diff)
downloadrust-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.rs37
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