@@ -97,9 +97,9 @@ pub fn provide(providers: &mut Providers) {
9797 providers. lower_to_hir = lower_to_hir;
9898}
9999
100- struct LoweringContext < ' hir > {
100+ struct LoweringContext < ' a , ' hir > {
101101 tcx : TyCtxt < ' hir > ,
102- resolver : & ' hir ResolverAstLowering < ' hir > ,
102+ resolver : & ' a ResolverAstLowering < ' hir > ,
103103 current_disambiguator : PerParentDisambiguatorState ,
104104
105105 /// Used to allocate HIR nodes.
@@ -132,7 +132,7 @@ struct LoweringContext<'hir> {
132132 is_in_dyn_type : bool ,
133133
134134 current_hir_id_owner : hir:: OwnerId ,
135- owner : & ' hir PerOwnerResolverData < ' hir > ,
135+ owner : & ' a PerOwnerResolverData < ' hir > ,
136136 item_local_id_counter : hir:: ItemLocalId ,
137137 trait_map : ItemLocalMap < & ' hir [ TraitCandidate < ' hir > ] > ,
138138
@@ -174,13 +174,8 @@ struct LoweringContext<'hir> {
174174 attribute_parser : AttributeParser < ' hir > ,
175175}
176176
177- impl < ' hir > LoweringContext < ' hir > {
178- fn new (
179- tcx : TyCtxt < ' hir > ,
180- resolver : & ' hir ResolverAstLowering < ' hir > ,
181- owner : NodeId ,
182- next_node_id : NodeId ,
183- ) -> Self {
177+ impl < ' a , ' hir > LoweringContext < ' a , ' hir > {
178+ fn new ( tcx : TyCtxt < ' hir > , resolver : & ' a ResolverAstLowering < ' hir > , owner : NodeId ) -> Self {
184179 let current_ast_owner = & resolver. owners [ & owner] ;
185180 let current_hir_id_owner = hir:: OwnerId { def_id : current_ast_owner. def_id } ;
186181 let current_disambiguator = resolver
@@ -210,7 +205,7 @@ impl<'hir> LoweringContext<'hir> {
210205 #[ cfg( debug_assertions) ]
211206 node_id_to_local_id : Default :: default ( ) ,
212207 trait_map : Default :: default ( ) ,
213- next_node_id,
208+ next_node_id : resolver . next_node_id ,
214209 node_id_to_def_id : NodeMap :: default ( ) ,
215210 partial_res_overrides : NodeMap :: default ( ) ,
216211
@@ -459,14 +454,18 @@ enum TryBlockScope {
459454 Heterogeneous ( HirId ) ,
460455}
461456
462- fn index_ast < ' tcx > ( tcx : TyCtxt < ' tcx > , ( ) : ( ) ) -> ( IndexVec < LocalDefId , Steal < AstOwner > > , NodeId ) {
457+ fn index_ast < ' tcx > (
458+ tcx : TyCtxt < ' tcx > ,
459+ ( ) : ( ) ,
460+ ) -> IndexVec < LocalDefId , Steal < ( Arc < ResolverAstLowering < ' tcx > > , AstOwner ) > > {
463461 // Queries that borrow `resolver_for_lowering`.
464462 tcx. ensure_done ( ) . output_filenames ( ( ) ) ;
465463 tcx. ensure_done ( ) . early_lint_checks ( ( ) ) ;
466464 tcx. ensure_done ( ) . get_lang_items ( ( ) ) ;
467465 tcx. ensure_done ( ) . debugger_visualizers ( LOCAL_CRATE ) ;
468466
469467 let ( resolver, krate) = tcx. resolver_for_lowering ( ) ;
468+ let mut resolver = resolver. steal ( ) ;
470469 let mut krate = krate. steal ( ) ;
471470
472471 let mut indexer = Indexer {
@@ -476,19 +475,24 @@ fn index_ast<'tcx>(tcx: TyCtxt<'tcx>, (): ()) -> (IndexVec<LocalDefId, Steal<Ast
476475 } ;
477476 indexer. visit_crate ( & mut krate) ;
478477 indexer. insert ( CRATE_NODE_ID , AstOwner :: Crate ( Box :: new ( krate) ) ) ;
479- return ( indexer . index , indexer. next_node_id ) ;
478+ resolver . next_node_id = indexer. next_node_id ;
480479
481- struct Indexer < ' s , ' ast > {
482- owners : & ' s NodeMap < PerOwnerResolverData < ' ast > > ,
483- index : IndexVec < LocalDefId , Steal < AstOwner > > ,
480+ let index = indexer. index ;
481+ let resolver = Arc :: new ( resolver) ;
482+ let index = index. into_iter ( ) . map ( |owner| Steal :: new ( ( Arc :: clone ( & resolver) , owner) ) ) . collect ( ) ;
483+ return index;
484+
485+ struct Indexer < ' s , ' hir > {
486+ owners : & ' s NodeMap < PerOwnerResolverData < ' hir > > ,
487+ index : IndexVec < LocalDefId , AstOwner > ,
484488 next_node_id : NodeId ,
485489 }
486490
487491 impl Indexer < ' _ , ' _ > {
488492 fn insert ( & mut self , id : NodeId , node : AstOwner ) {
489493 let def_id = self . owners [ & id] . def_id ;
490- self . index . ensure_contains_elem ( def_id, || Steal :: new ( AstOwner :: NonOwner ) ) ;
491- self . index [ def_id] = Steal :: new ( node) ;
494+ self . index . ensure_contains_elem ( def_id, || AstOwner :: NonOwner ) ;
495+ self . index [ def_id] = node;
492496 }
493497
494498 fn make_dummy < K > (
@@ -617,43 +621,46 @@ fn lower_to_hir(tcx: TyCtxt<'_>, def_id: LocalDefId) -> hir::MaybeOwner<'_> {
617621 tcx. ensure_done ( ) . early_lint_checks ( ( ) ) ;
618622 tcx. ensure_done ( ) . debugger_visualizers ( LOCAL_CRATE ) ;
619623 tcx. ensure_done ( ) . get_lang_items ( ( ) ) ;
620- let ( resolver, _) = tcx. resolver_for_lowering ( ) ;
621- let ( ast_index, next_node_id) = tcx. index_ast ( ( ) ) ;
622- let node = ast_index. get ( def_id) . map ( Steal :: steal) ;
623-
624- let mut item_lowerer = item:: ItemLowerer { tcx, resolver, next_node_id : * next_node_id } ;
625-
626- // The item existed in the AST.
627- let parent_id = match node. as_ref ( ) {
628- Some ( AstOwner :: Crate ( c) ) => return item_lowerer. lower_crate ( & c) ,
629- Some ( AstOwner :: Item ( item) ) => return item_lowerer. lower_item ( & item) ,
630- Some ( AstOwner :: TraitItem ( item) ) => {
631- return item_lowerer. lower_trait_item ( & item) ;
632- }
633- Some ( AstOwner :: ImplItem ( item) ) => {
634- return item_lowerer. lower_impl_item ( & item) ;
624+ let ast_index = tcx. index_ast ( ( ) ) ;
625+ let resolver_and_node = ast_index. get ( def_id) . map ( Steal :: steal) ;
626+
627+ let fallback_to_parent = |parent_id| {
628+ // The item did not exist in the AST, it was created by its parent.
629+ let mut parent_info = tcx. lower_to_hir ( parent_id) ;
630+ if let hir:: MaybeOwner :: NonOwner ( hir_id) = parent_info {
631+ parent_info = tcx. lower_to_hir ( hir_id. owner ) ;
635632 }
636- Some ( AstOwner :: ForeignItem ( item) ) => return item_lowerer. lower_foreign_item ( & item) ,
637- Some ( AstOwner :: Synthetic ( parent_id) ) => * parent_id,
638- Some ( AstOwner :: NonOwner ) | None => tcx. local_parent ( def_id) ,
633+
634+ let parent_info = parent_info. unwrap ( ) ;
635+ * parent_info. children . get ( & def_id) . unwrap_or_else ( || {
636+ panic ! (
637+ "{:?} does not appear in children of {:?}" ,
638+ def_id,
639+ parent_info. nodes. node( ) . def_id( )
640+ )
641+ } )
639642 } ;
640643
641- tcx. sess . time ( "drop_ast" , || std:: mem:: drop ( node) ) ;
644+ let Some ( ( resolver, node) ) = resolver_and_node else {
645+ return fallback_to_parent ( tcx. local_parent ( def_id) ) ;
646+ } ;
642647
643- // The item did not exist in the AST, it was created by its parent.
644- let mut parent_info = tcx. lower_to_hir ( parent_id) ;
645- if let hir:: MaybeOwner :: NonOwner ( hir_id) = parent_info {
646- parent_info = tcx. lower_to_hir ( hir_id. owner ) ;
647- }
648+ let mut item_lowerer = item:: ItemLowerer { tcx, resolver : & * resolver } ;
649+
650+ let item = match & node {
651+ // The item existed in the AST.
652+ AstOwner :: Crate ( c) => item_lowerer. lower_crate ( & c) ,
653+ AstOwner :: Item ( item) => item_lowerer. lower_item ( & item) ,
654+ AstOwner :: TraitItem ( item) => item_lowerer. lower_trait_item ( & item) ,
655+ AstOwner :: ImplItem ( item) => item_lowerer. lower_impl_item ( & item) ,
656+ AstOwner :: ForeignItem ( item) => item_lowerer. lower_foreign_item ( & item) ,
657+ AstOwner :: Synthetic ( parent_id) => fallback_to_parent ( * parent_id) ,
658+ AstOwner :: NonOwner => fallback_to_parent ( tcx. local_parent ( def_id) ) ,
659+ } ;
648660
649- let parent_info = parent_info. unwrap ( ) ;
650- * parent_info. children . get ( & def_id) . unwrap_or_else ( || {
651- panic ! (
652- "{:?} does not appear in children of {:?}" ,
653- def_id,
654- parent_info. nodes. node( ) . def_id( )
655- )
656- } )
661+ tcx. sess . time ( "drop_ast" , || std:: mem:: drop ( node) ) ;
662+
663+ item
657664}
658665
659666#[ derive( Copy , Clone , PartialEq , Debug ) ]
@@ -683,7 +690,7 @@ enum GenericArgsMode {
683690 Silence ,
684691}
685692
686- impl < ' hir > LoweringContext < ' hir > {
693+ impl < ' hir > LoweringContext < ' _ , ' hir > {
687694 fn create_def (
688695 & mut self ,
689696 node_id : NodeId ,
@@ -3138,7 +3145,7 @@ impl<'hir> GenericArgsCtor<'hir> {
31383145 && self . parenthesized == hir:: GenericArgsParentheses :: No
31393146 }
31403147
3141- fn into_generic_args ( self , this : & LoweringContext < ' hir > ) -> & ' hir hir:: GenericArgs < ' hir > {
3148+ fn into_generic_args ( self , this : & LoweringContext < ' _ , ' hir > ) -> & ' hir hir:: GenericArgs < ' hir > {
31423149 let ga = hir:: GenericArgs {
31433150 args : this. arena . alloc_from_iter ( self . args ) ,
31443151 constraints : self . constraints ,
0 commit comments