@@ -89,9 +89,9 @@ mod pat;
8989mod path;
9090pub mod stability;
9191
92- struct LoweringContext < ' hir > {
92+ struct LoweringContext < ' a , ' hir > {
9393 tcx : TyCtxt < ' hir > ,
94- resolver : & ' hir ResolverAstLowering < ' hir > ,
94+ resolver : & ' a ResolverAstLowering < ' hir > ,
9595 current_disambiguator : PerParentDisambiguatorState ,
9696
9797 /// Used to allocate HIR nodes.
@@ -160,13 +160,8 @@ struct LoweringContext<'hir> {
160160 attribute_parser : AttributeParser < ' hir > ,
161161}
162162
163- impl < ' hir > LoweringContext < ' hir > {
164- fn new (
165- tcx : TyCtxt < ' hir > ,
166- resolver : & ' hir ResolverAstLowering < ' hir > ,
167- owner : NodeId ,
168- next_node_id : NodeId ,
169- ) -> Self {
163+ impl < ' a , ' hir > LoweringContext < ' a , ' hir > {
164+ fn new ( tcx : TyCtxt < ' hir > , resolver : & ' a ResolverAstLowering < ' hir > , owner : NodeId ) -> Self {
170165 let registered_tools = tcx. registered_tools ( ( ) ) . iter ( ) . map ( |x| x. name ) . collect ( ) ;
171166 let current_hir_id_owner = hir:: OwnerId { def_id : resolver. node_id_to_def_id [ & owner] } ;
172167 let current_disambiguator = resolver
@@ -193,7 +188,7 @@ impl<'hir> LoweringContext<'hir> {
193188 #[ cfg( debug_assertions) ]
194189 node_id_to_local_id : [ ( owner, hir:: ItemLocalId :: ZERO ) ] . into_iter ( ) . collect ( ) ,
195190 trait_map : Default :: default ( ) ,
196- next_node_id,
191+ next_node_id : resolver . next_node_id ,
197192 node_id_to_def_id : NodeMap :: default ( ) ,
198193 partial_res_overrides : NodeMap :: default ( ) ,
199194
@@ -457,14 +452,15 @@ enum TryBlockScope {
457452pub fn index_ast < ' tcx > (
458453 tcx : TyCtxt < ' tcx > ,
459454 ( ) : ( ) ,
460- ) -> ( IndexVec < LocalDefId , Steal < AstOwner > > , NodeId ) {
455+ ) -> IndexVec < LocalDefId , Steal < ( Arc < ResolverAstLowering < ' tcx > > , AstOwner ) > > {
461456 // Queries that borrow `resolver_for_lowering`.
462457 tcx. ensure_done ( ) . output_filenames ( ( ) ) ;
463458 tcx. ensure_done ( ) . early_lint_checks ( ( ) ) ;
464459 tcx. ensure_done ( ) . get_lang_items ( ( ) ) ;
465460 tcx. ensure_done ( ) . debugger_visualizers ( LOCAL_CRATE ) ;
466461
467462 let ( resolver, krate) = tcx. resolver_for_lowering ( ) ;
463+ let mut resolver = resolver. steal ( ) ;
468464 let mut krate = krate. steal ( ) ;
469465
470466 let mut indexer = Indexer {
@@ -474,19 +470,24 @@ pub fn index_ast<'tcx>(
474470 } ;
475471 indexer. visit_crate ( & mut krate) ;
476472 indexer. insert ( CRATE_NODE_ID , AstOwner :: Crate ( Box :: new ( krate) ) ) ;
477- return ( indexer. index , indexer. next_node_id ) ;
473+ resolver. next_node_id = indexer. next_node_id ;
474+
475+ let index = indexer. index ;
476+ let resolver = Arc :: new ( resolver) ;
477+ let index = index. into_iter ( ) . map ( |owner| Steal :: new ( ( Arc :: clone ( & resolver) , owner) ) ) . collect ( ) ;
478+ return index;
478479
479480 struct Indexer < ' s > {
480481 node_id_to_def_id : & ' s NodeMap < LocalDefId > ,
481- index : IndexVec < LocalDefId , Steal < AstOwner > > ,
482+ index : IndexVec < LocalDefId , AstOwner > ,
482483 next_node_id : NodeId ,
483484 }
484485
485486 impl Indexer < ' _ > {
486487 fn insert ( & mut self , id : NodeId , node : AstOwner ) {
487488 let def_id = self . node_id_to_def_id [ & id] ;
488- self . index . ensure_contains_elem ( def_id, || Steal :: new ( AstOwner :: NonOwner ) ) ;
489- self . index [ def_id] = Steal :: new ( node) ;
489+ self . index . ensure_contains_elem ( def_id, || AstOwner :: NonOwner ) ;
490+ self . index [ def_id] = node;
490491 }
491492
492493 fn make_dummy < K > (
@@ -611,43 +612,46 @@ pub fn lower_to_hir(tcx: TyCtxt<'_>, def_id: LocalDefId) -> hir::MaybeOwner<'_>
611612 tcx. ensure_done ( ) . early_lint_checks ( ( ) ) ;
612613 tcx. ensure_done ( ) . debugger_visualizers ( LOCAL_CRATE ) ;
613614 tcx. ensure_done ( ) . get_lang_items ( ( ) ) ;
614- let ( resolver, _) = tcx. resolver_for_lowering ( ) ;
615- let ( ast_index, next_node_id) = tcx. index_ast ( ( ) ) ;
616- let node = ast_index. get ( def_id) . map ( Steal :: steal) ;
617-
618- let mut item_lowerer = item:: ItemLowerer { tcx, resolver, next_node_id : * next_node_id } ;
619-
620- // The item existed in the AST.
621- let parent_id = match node. as_ref ( ) {
622- Some ( AstOwner :: Crate ( c) ) => return item_lowerer. lower_crate ( & c) ,
623- Some ( AstOwner :: Item ( item) ) => return item_lowerer. lower_item ( & item) ,
624- Some ( AstOwner :: TraitItem ( item) ) => {
625- return item_lowerer. lower_trait_item ( & item) ;
626- }
627- Some ( AstOwner :: ImplItem ( item) ) => {
628- return item_lowerer. lower_impl_item ( & item) ;
615+ let ast_index = tcx. index_ast ( ( ) ) ;
616+ let resolver_and_node = ast_index. get ( def_id) . map ( Steal :: steal) ;
617+
618+ let fallback_to_parent = |parent_id| {
619+ // The item did not exist in the AST, it was created by its parent.
620+ let mut parent_info = tcx. lower_to_hir ( parent_id) ;
621+ if let hir:: MaybeOwner :: NonOwner ( hir_id) = parent_info {
622+ parent_info = tcx. lower_to_hir ( hir_id. owner ) ;
629623 }
630- Some ( AstOwner :: ForeignItem ( item) ) => return item_lowerer. lower_foreign_item ( & item) ,
631- Some ( AstOwner :: Synthetic ( parent_id) ) => * parent_id,
632- Some ( AstOwner :: NonOwner ) | None => tcx. local_parent ( def_id) ,
624+
625+ let parent_info = parent_info. unwrap ( ) ;
626+ * parent_info. children . get ( & def_id) . unwrap_or_else ( || {
627+ panic ! (
628+ "{:?} does not appear in children of {:?}" ,
629+ def_id,
630+ parent_info. nodes. node( ) . def_id( )
631+ )
632+ } )
633633 } ;
634634
635- tcx. sess . time ( "drop_ast" , || std:: mem:: drop ( node) ) ;
635+ let Some ( ( resolver, node) ) = resolver_and_node else {
636+ return fallback_to_parent ( tcx. local_parent ( def_id) ) ;
637+ } ;
636638
637- // The item did not exist in the AST, it was created by its parent.
638- let mut parent_info = tcx. lower_to_hir ( parent_id) ;
639- if let hir:: MaybeOwner :: NonOwner ( hir_id) = parent_info {
640- parent_info = tcx. lower_to_hir ( hir_id. owner ) ;
641- }
639+ let mut item_lowerer = item:: ItemLowerer { tcx, resolver : & * resolver } ;
640+
641+ let item = match & node {
642+ // The item existed in the AST.
643+ AstOwner :: Crate ( c) => item_lowerer. lower_crate ( & c) ,
644+ AstOwner :: Item ( item) => item_lowerer. lower_item ( & item) ,
645+ AstOwner :: TraitItem ( item) => item_lowerer. lower_trait_item ( & item) ,
646+ AstOwner :: ImplItem ( item) => item_lowerer. lower_impl_item ( & item) ,
647+ AstOwner :: ForeignItem ( item) => item_lowerer. lower_foreign_item ( & item) ,
648+ AstOwner :: Synthetic ( parent_id) => fallback_to_parent ( * parent_id) ,
649+ AstOwner :: NonOwner => fallback_to_parent ( tcx. local_parent ( def_id) ) ,
650+ } ;
642651
643- let parent_info = parent_info. unwrap ( ) ;
644- * parent_info. children . get ( & def_id) . unwrap_or_else ( || {
645- panic ! (
646- "{:?} does not appear in children of {:?}" ,
647- def_id,
648- parent_info. nodes. node( ) . def_id( )
649- )
650- } )
652+ tcx. sess . time ( "drop_ast" , || std:: mem:: drop ( node) ) ;
653+
654+ item
651655}
652656
653657#[ derive( Copy , Clone , PartialEq , Debug ) ]
@@ -677,7 +681,7 @@ enum GenericArgsMode {
677681 Silence ,
678682}
679683
680- impl < ' hir > LoweringContext < ' hir > {
684+ impl < ' hir > LoweringContext < ' _ , ' hir > {
681685 fn create_def (
682686 & mut self ,
683687 node_id : NodeId ,
@@ -3109,7 +3113,7 @@ impl<'hir> GenericArgsCtor<'hir> {
31093113 && self . parenthesized == hir:: GenericArgsParentheses :: No
31103114 }
31113115
3112- fn into_generic_args ( self , this : & LoweringContext < ' hir > ) -> & ' hir hir:: GenericArgs < ' hir > {
3116+ fn into_generic_args ( self , this : & LoweringContext < ' _ , ' hir > ) -> & ' hir hir:: GenericArgs < ' hir > {
31133117 let ga = hir:: GenericArgs {
31143118 args : this. arena . alloc_from_iter ( self . args ) ,
31153119 constraints : self . constraints ,
0 commit comments