]> git.lizzy.rs Git - rust.git/commitdiff
Add (currently unused) helper routine for skolemizing bound regions.
authorNiko Matsakis <niko@alum.mit.edu>
Fri, 12 Dec 2014 11:37:42 +0000 (06:37 -0500)
committerNiko Matsakis <niko@alum.mit.edu>
Fri, 19 Dec 2014 08:29:30 +0000 (03:29 -0500)
src/librustc/middle/infer/mod.rs

index c58b99e0ae2b71906eccb4a45ee8cef89c55f488..4eda0d01ebb7ba87227c44125a6cfbc3e476350c 100644 (file)
@@ -90,6 +90,10 @@ pub struct InferCtxt<'a, 'tcx: 'a> {
         RegionVarBindings<'a, 'tcx>,
 }
 
+/// A map returned by `skolemize_bound_regions()` indicating the skolemized
+/// region that each late-bound region was replaced with.
+pub type SkolemizationMap = FnvHashMap<ty::BoundRegion,ty::Region>;
+
 /// Why did we require that the two types be related?
 ///
 /// See `error_reporting.rs` for more details
@@ -698,9 +702,25 @@ pub fn sub_poly_trait_refs(&self,
             self.sub(a_is_expected, trace).poly_trait_refs(&*a, &*b).to_ures()
         })
     }
-}
 
-impl<'a, 'tcx> InferCtxt<'a, 'tcx> {
+    pub fn skolemize_bound_regions<T>(&self,
+                                      value: &ty::Binder<T>,
+                                      snapshot: &CombinedSnapshot)
+                                      -> (T, SkolemizationMap)
+        where T : TypeFoldable<'tcx>
+    {
+        let (result_binder, map) = replace_late_bound_regions(self.tcx, value, |br, _| {
+            self.region_vars.new_skolemized(br, &snapshot.region_vars_snapshot)
+        });
+
+        debug!("skolemize_bound_regions(value={}, result={}, map={})",
+               value.repr(self.tcx),
+               result_binder.value.repr(self.tcx),
+               map.repr(self.tcx));
+
+        (result_binder.value, map)
+    }
+
     pub fn next_ty_var_id(&self, diverging: bool) -> TyVid {
         self.type_variables
             .borrow_mut()