@@ -646,31 +646,18 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
646
646
/// parameter while `f` is running (and restored afterwards).
647
647
fn collect_in_band_defs < T > (
648
648
& mut self ,
649
- parent_def_id : LocalDefId ,
650
- anonymous_lifetime_mode : AnonymousLifetimeMode ,
651
- f : impl FnOnce ( & mut Self ) -> ( Vec < hir:: GenericParam < ' hir > > , T ) ,
652
- ) -> ( Vec < hir:: GenericParam < ' hir > > , T ) {
649
+ f : impl FnOnce ( & mut Self ) -> T ,
650
+ ) -> ( Vec < ( Span , ParamName ) > , T ) {
653
651
assert ! ( !self . is_collecting_in_band_lifetimes) ;
654
652
assert ! ( self . lifetimes_to_define. is_empty( ) ) ;
655
- let old_anonymous_lifetime_mode = self . anonymous_lifetime_mode ;
656
-
657
- self . anonymous_lifetime_mode = anonymous_lifetime_mode;
658
653
self . is_collecting_in_band_lifetimes = true ;
659
654
660
- let ( in_band_ty_params , res) = f ( self ) ;
655
+ let res = f ( self ) ;
661
656
662
657
self . is_collecting_in_band_lifetimes = false ;
663
- self . anonymous_lifetime_mode = old_anonymous_lifetime_mode;
664
-
665
- let lifetimes_to_define = self . lifetimes_to_define . split_off ( 0 ) ;
666
658
667
- let params = lifetimes_to_define
668
- . into_iter ( )
669
- . map ( |( span, hir_name) | self . lifetime_to_generic_param ( span, hir_name, parent_def_id) )
670
- . chain ( in_band_ty_params. into_iter ( ) )
671
- . collect ( ) ;
672
-
673
- ( params, res)
659
+ let lifetimes_to_define = std:: mem:: take ( & mut self . lifetimes_to_define ) ;
660
+ ( lifetimes_to_define, res)
674
661
}
675
662
676
663
/// Converts a lifetime into a new generic parameter.
@@ -785,27 +772,39 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
785
772
anonymous_lifetime_mode : AnonymousLifetimeMode ,
786
773
f : impl FnOnce ( & mut Self , & mut Vec < hir:: GenericParam < ' hir > > ) -> T ,
787
774
) -> ( hir:: Generics < ' hir > , T ) {
788
- let ( in_band_defs, ( mut lowered_generics, res) ) =
789
- self . with_in_scope_lifetime_defs ( & generics. params , |this| {
790
- this. collect_in_band_defs ( parent_def_id, anonymous_lifetime_mode, |this| {
791
- let mut params = Vec :: new ( ) ;
792
- // Note: it is necessary to lower generics *before* calling `f`.
793
- // When lowering `async fn`, there's a final step when lowering
794
- // the return type that assumes that all in-scope lifetimes have
795
- // already been added to either `in_scope_lifetimes` or
796
- // `lifetimes_to_define`. If we swapped the order of these two,
797
- // in-band-lifetimes introduced by generics or where-clauses
798
- // wouldn't have been added yet.
799
- let generics = this. lower_generics_mut (
800
- generics,
801
- ImplTraitContext :: Universal ( & mut params, this. current_hir_id_owner ) ,
802
- ) ;
803
- let res = f ( this, & mut params) ;
804
- ( params, ( generics, res) )
775
+ let ( lifetimes_to_define, ( mut lowered_generics, impl_trait_defs, res) ) = self
776
+ . collect_in_band_defs ( |this| {
777
+ this. with_anonymous_lifetime_mode ( anonymous_lifetime_mode, |this| {
778
+ this. with_in_scope_lifetime_defs ( & generics. params , |this| {
779
+ let mut impl_trait_defs = Vec :: new ( ) ;
780
+ // Note: it is necessary to lower generics *before* calling `f`.
781
+ // When lowering `async fn`, there's a final step when lowering
782
+ // the return type that assumes that all in-scope lifetimes have
783
+ // already been added to either `in_scope_lifetimes` or
784
+ // `lifetimes_to_define`. If we swapped the order of these two,
785
+ // in-band-lifetimes introduced by generics or where-clauses
786
+ // wouldn't have been added yet.
787
+ let generics = this. lower_generics_mut (
788
+ generics,
789
+ ImplTraitContext :: Universal (
790
+ & mut impl_trait_defs,
791
+ this. current_hir_id_owner ,
792
+ ) ,
793
+ ) ;
794
+ let res = f ( this, & mut impl_trait_defs) ;
795
+ ( generics, impl_trait_defs, res)
796
+ } )
805
797
} )
806
798
} ) ;
807
799
808
- lowered_generics. params . extend ( in_band_defs) ;
800
+ lowered_generics. params . extend (
801
+ lifetimes_to_define
802
+ . into_iter ( )
803
+ . map ( |( span, hir_name) | {
804
+ self . lifetime_to_generic_param ( span, hir_name, parent_def_id)
805
+ } )
806
+ . chain ( impl_trait_defs) ,
807
+ ) ;
809
808
810
809
let lowered_generics = lowered_generics. into_generics ( self . arena ) ;
811
810
( lowered_generics, res)
0 commit comments