@@ -3,7 +3,9 @@ use rustc_data_structures::fx::FxIndexMap;
33use rustc_hir:: def_id:: DefId ;
44use tracing:: { debug, instrument} ;
55
6- pub use rustc_type_ir:: fold:: { FallibleTypeFolder , TypeFoldable , TypeFolder , TypeSuperFoldable } ;
6+ pub use rustc_type_ir:: fold:: {
7+ shift_region, shift_vars, FallibleTypeFolder , TypeFoldable , TypeFolder , TypeSuperFoldable ,
8+ } ;
79
810///////////////////////////////////////////////////////////////////////////
911// Some sample folders
@@ -412,103 +414,3 @@ impl<'tcx> TyCtxt<'tcx> {
412414 Binder :: bind_with_vars ( inner, bound_vars)
413415 }
414416}
415-
416- ///////////////////////////////////////////////////////////////////////////
417- // Shifter
418- //
419- // Shifts the De Bruijn indices on all escaping bound vars by a
420- // fixed amount. Useful in instantiation or when otherwise introducing
421- // a binding level that is not intended to capture the existing bound
422- // vars. See comment on `shift_vars_through_binders` method in
423- // `rustc_middle/src/ty/generic_args.rs` for more details.
424-
425- struct Shifter < ' tcx > {
426- tcx : TyCtxt < ' tcx > ,
427- current_index : ty:: DebruijnIndex ,
428- amount : u32 ,
429- }
430-
431- impl < ' tcx > Shifter < ' tcx > {
432- pub fn new ( tcx : TyCtxt < ' tcx > , amount : u32 ) -> Self {
433- Shifter { tcx, current_index : ty:: INNERMOST , amount }
434- }
435- }
436-
437- impl < ' tcx > TypeFolder < TyCtxt < ' tcx > > for Shifter < ' tcx > {
438- fn interner ( & self ) -> TyCtxt < ' tcx > {
439- self . tcx
440- }
441-
442- fn fold_binder < T : TypeFoldable < TyCtxt < ' tcx > > > (
443- & mut self ,
444- t : ty:: Binder < ' tcx , T > ,
445- ) -> ty:: Binder < ' tcx , T > {
446- self . current_index . shift_in ( 1 ) ;
447- let t = t. super_fold_with ( self ) ;
448- self . current_index . shift_out ( 1 ) ;
449- t
450- }
451-
452- fn fold_region ( & mut self , r : ty:: Region < ' tcx > ) -> ty:: Region < ' tcx > {
453- match * r {
454- ty:: ReBound ( debruijn, br) if debruijn >= self . current_index => {
455- let debruijn = debruijn. shifted_in ( self . amount ) ;
456- ty:: Region :: new_bound ( self . tcx , debruijn, br)
457- }
458- _ => r,
459- }
460- }
461-
462- fn fold_ty ( & mut self , ty : Ty < ' tcx > ) -> Ty < ' tcx > {
463- match * ty. kind ( ) {
464- ty:: Bound ( debruijn, bound_ty) if debruijn >= self . current_index => {
465- let debruijn = debruijn. shifted_in ( self . amount ) ;
466- Ty :: new_bound ( self . tcx , debruijn, bound_ty)
467- }
468-
469- _ if ty. has_vars_bound_at_or_above ( self . current_index ) => ty. super_fold_with ( self ) ,
470- _ => ty,
471- }
472- }
473-
474- fn fold_const ( & mut self , ct : ty:: Const < ' tcx > ) -> ty:: Const < ' tcx > {
475- if let ty:: ConstKind :: Bound ( debruijn, bound_ct) = ct. kind ( )
476- && debruijn >= self . current_index
477- {
478- let debruijn = debruijn. shifted_in ( self . amount ) ;
479- ty:: Const :: new_bound ( self . tcx , debruijn, bound_ct, ct. ty ( ) )
480- } else {
481- ct. super_fold_with ( self )
482- }
483- }
484-
485- fn fold_predicate ( & mut self , p : ty:: Predicate < ' tcx > ) -> ty:: Predicate < ' tcx > {
486- if p. has_vars_bound_at_or_above ( self . current_index ) { p. super_fold_with ( self ) } else { p }
487- }
488- }
489-
490- pub fn shift_region < ' tcx > (
491- tcx : TyCtxt < ' tcx > ,
492- region : ty:: Region < ' tcx > ,
493- amount : u32 ,
494- ) -> ty:: Region < ' tcx > {
495- match * region {
496- ty:: ReBound ( debruijn, br) if amount > 0 => {
497- ty:: Region :: new_bound ( tcx, debruijn. shifted_in ( amount) , br)
498- }
499- _ => region,
500- }
501- }
502-
503- pub fn shift_vars < ' tcx , T > ( tcx : TyCtxt < ' tcx > , value : T , amount : u32 ) -> T
504- where
505- T : TypeFoldable < TyCtxt < ' tcx > > ,
506- {
507- debug ! ( "shift_vars(value={:?}, amount={})" , value, amount) ;
508-
509- if amount == 0 || !value. has_escaping_bound_vars ( ) {
510- return value;
511- }
512-
513- value. fold_with ( & mut Shifter :: new ( tcx, amount) )
514- }
0 commit comments