From 34c9ae77f74eae4ff50bd10f422986d6da372013 Mon Sep 17 00:00:00 2001 From: Niko Matsakis Date: Mon, 28 May 2018 09:53:10 -0400 Subject: [PATCH] refactor `resolve_lifetime` to track outer-index, not depth Co-authored-by: csmoe <35686186+csmoe@users.noreply.github.com> --- src/librustc/middle/resolve_lifetime.rs | 26 +++++++++++-------------- 1 file changed, 11 insertions(+), 15 deletions(-) diff --git a/src/librustc/middle/resolve_lifetime.rs b/src/librustc/middle/resolve_lifetime.rs index 76a8db53a08..53d51d9429f 100644 --- a/src/librustc/middle/resolve_lifetime.rs +++ b/src/librustc/middle/resolve_lifetime.rs @@ -133,19 +133,15 @@ impl Region { } } - fn from_depth(self, depth: u32) -> Region { + fn shifted_out_to_binder(self, binder: ty::DebruijnIndex) -> Region { match self { Region::LateBound(debruijn, id, origin) => Region::LateBound( - ty::DebruijnIndex { - depth: debruijn.depth - (depth - 1), - }, + debruijn.shifted_out_to_binder(binder), id, origin, ), Region::LateBoundAnon(debruijn, index) => Region::LateBoundAnon( - ty::DebruijnIndex { - depth: debruijn.depth - (depth - 1), - }, + debruijn.shifted_out_to_binder(binder), index, ), _ => self, @@ -1858,7 +1854,7 @@ impl<'a, 'tcx> LifetimeContext<'a, 'tcx> { .map(|(i, input)| { let mut gather = GatherLifetimes { map: self.map, - binder_depth: 1, + outer_index: ty::DebruijnIndex::INNERMOST, have_bound_regions: false, lifetimes: FxHashSet(), }; @@ -1899,7 +1895,7 @@ impl<'a, 'tcx> LifetimeContext<'a, 'tcx> { struct GatherLifetimes<'a> { map: &'a NamedRegionMap, - binder_depth: u32, + outer_index: ty::DebruijnIndex, have_bound_regions: bool, lifetimes: FxHashSet, } @@ -1911,7 +1907,7 @@ impl<'a, 'tcx> LifetimeContext<'a, 'tcx> { fn visit_ty(&mut self, ty: &hir::Ty) { if let hir::TyBareFn(_) = ty.node { - self.binder_depth += 1; + self.outer_index.shift_in(1); } if let hir::TyTraitObject(ref bounds, ref lifetime) = ty.node { for bound in bounds { @@ -1927,7 +1923,7 @@ impl<'a, 'tcx> LifetimeContext<'a, 'tcx> { intravisit::walk_ty(self, ty); } if let hir::TyBareFn(_) = ty.node { - self.binder_depth -= 1; + self.outer_index.shift_out(1); } } @@ -1946,22 +1942,22 @@ impl<'a, 'tcx> LifetimeContext<'a, 'tcx> { trait_ref: &hir::PolyTraitRef, modifier: hir::TraitBoundModifier, ) { - self.binder_depth += 1; + self.outer_index.shift_in(1); intravisit::walk_poly_trait_ref(self, trait_ref, modifier); - self.binder_depth -= 1; + self.outer_index.shift_out(1); } fn visit_lifetime(&mut self, lifetime_ref: &hir::Lifetime) { if let Some(&lifetime) = self.map.defs.get(&lifetime_ref.id) { match lifetime { Region::LateBound(debruijn, _, _) | Region::LateBoundAnon(debruijn, _) - if debruijn.depth < self.binder_depth => + if debruijn < self.outer_index => { self.have_bound_regions = true; } _ => { self.lifetimes - .insert(lifetime.from_depth(self.binder_depth)); + .insert(lifetime.shifted_out_to_binder(self.outer_index)); } } }