3232
3333// tidy-alphabetical-start
3434#![ feature( box_patterns) ]
35+ #![ feature( closure_track_caller) ]
3536#![ feature( if_let_guard) ]
3637// tidy-alphabetical-end
3738
@@ -58,7 +59,7 @@ use rustc_hir::{
5859} ;
5960use rustc_index:: { Idx , IndexSlice , IndexVec } ;
6061use rustc_middle:: span_bug;
61- use rustc_middle:: ty:: { ResolverAstLowering , TyCtxt } ;
62+ use rustc_middle:: ty:: { PerOwnerResolverData , ResolverAstLowering , TyCtxt } ;
6263use rustc_session:: parse:: add_feature_diagnostics;
6364use rustc_span:: symbol:: { Ident , Symbol , kw, sym} ;
6465use rustc_span:: { DUMMY_SP , DesugaringKind , Span } ;
@@ -154,7 +155,10 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
154155 Self {
155156 // Pseudo-globals.
156157 tcx,
157- resolver : PerOwnerResolver { general : resolver } ,
158+ resolver : PerOwnerResolver {
159+ general : resolver,
160+ item : PerOwnerResolverData :: new ( DUMMY_NODE_ID ) ,
161+ } ,
158162 disambiguator : DisambiguatorState :: new ( ) ,
159163 arena : tcx. hir_arena ,
160164
@@ -234,6 +238,15 @@ impl SpanLowerer {
234238
235239pub ( crate ) struct PerOwnerResolver < ' a > {
236240 pub general : & ' a mut ResolverAstLowering ,
241+ pub item : PerOwnerResolverData ,
242+ }
243+
244+ impl < ' a > std:: ops:: Deref for PerOwnerResolver < ' a > {
245+ type Target = PerOwnerResolverData ;
246+
247+ fn deref ( & self ) -> & Self :: Target {
248+ & self . item
249+ }
237250}
238251
239252impl PerOwnerResolver < ' _ > {
@@ -434,17 +447,22 @@ enum TryBlockScope {
434447}
435448
436449fn index_crate < ' a > (
437- node_id_to_def_id : & NodeMap < LocalDefId > ,
450+ owners : & NodeMap < PerOwnerResolverData > ,
438451 krate : & ' a Crate ,
439452) -> IndexVec < LocalDefId , AstOwner < ' a > > {
440- let mut indexer = Indexer { node_id_to_def_id, index : IndexVec :: new ( ) } ;
453+ let mut indexer = Indexer {
454+ owners,
455+ node_id_to_def_id : & owners[ & CRATE_NODE_ID ] . node_id_to_def_id ,
456+ index : IndexVec :: new ( ) ,
457+ } ;
441458 * indexer. index . ensure_contains_elem ( CRATE_DEF_ID , || AstOwner :: NonOwner ) =
442459 AstOwner :: Crate ( krate) ;
443460 visit:: walk_crate ( & mut indexer, krate) ;
444461 return indexer. index ;
445462
446463 struct Indexer < ' s , ' a > {
447464 node_id_to_def_id : & ' s NodeMap < LocalDefId > ,
465+ owners : & ' s NodeMap < PerOwnerResolverData > ,
448466 index : IndexVec < LocalDefId , AstOwner < ' a > > ,
449467 }
450468
@@ -455,23 +473,38 @@ fn index_crate<'a>(
455473 }
456474
457475 fn visit_item ( & mut self , item : & ' a ast:: Item ) {
476+ let old = std:: mem:: replace (
477+ & mut self . node_id_to_def_id ,
478+ & self . owners [ & item. id ] . node_id_to_def_id ,
479+ ) ;
458480 let def_id = self . node_id_to_def_id [ & item. id ] ;
459481 * self . index . ensure_contains_elem ( def_id, || AstOwner :: NonOwner ) = AstOwner :: Item ( item) ;
460- visit:: walk_item ( self , item)
482+ visit:: walk_item ( self , item) ;
483+ self . node_id_to_def_id = old;
461484 }
462485
463486 fn visit_assoc_item ( & mut self , item : & ' a ast:: AssocItem , ctxt : visit:: AssocCtxt ) {
487+ let old = std:: mem:: replace (
488+ & mut self . node_id_to_def_id ,
489+ & self . owners [ & item. id ] . node_id_to_def_id ,
490+ ) ;
464491 let def_id = self . node_id_to_def_id [ & item. id ] ;
465492 * self . index . ensure_contains_elem ( def_id, || AstOwner :: NonOwner ) =
466493 AstOwner :: AssocItem ( item, ctxt) ;
467494 visit:: walk_assoc_item ( self , item, ctxt) ;
495+ self . node_id_to_def_id = old;
468496 }
469497
470498 fn visit_foreign_item ( & mut self , item : & ' a ast:: ForeignItem ) {
499+ let old = std:: mem:: replace (
500+ & mut self . node_id_to_def_id ,
501+ & self . owners [ & item. id ] . node_id_to_def_id ,
502+ ) ;
471503 let def_id = self . node_id_to_def_id [ & item. id ] ;
472504 * self . index . ensure_contains_elem ( def_id, || AstOwner :: NonOwner ) =
473505 AstOwner :: ForeignItem ( item) ;
474506 visit:: walk_item ( self , item) ;
507+ self . node_id_to_def_id = old;
475508 }
476509 }
477510}
@@ -508,7 +541,7 @@ pub fn lower_to_hir(tcx: TyCtxt<'_>, (): ()) -> hir::Crate<'_> {
508541 tcx. ensure_done ( ) . get_lang_items ( ( ) ) ;
509542 let ( mut resolver, krate) = tcx. resolver_for_lowering ( ) . steal ( ) ;
510543
511- let ast_index = index_crate ( & resolver. node_id_to_def_id , & krate) ;
544+ let ast_index = index_crate ( & resolver. owners , & krate) ;
512545 let mut owners = IndexVec :: from_fn_n (
513546 |_| hir:: MaybeOwner :: Phantom ,
514547 tcx. definitions_untracked ( ) . def_index_count ( ) ,
@@ -592,7 +625,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
592625 . def_id ( ) ;
593626
594627 debug ! ( "create_def: def_id_to_node_id[{:?}] <-> {:?}" , def_id, node_id) ;
595- self . resolver . general . node_id_to_def_id . insert ( node_id, def_id) ;
628+ self . resolver . item . node_id_to_def_id . insert ( node_id, def_id) ;
596629
597630 def_id
598631 }
@@ -607,16 +640,29 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
607640 /// Given the id of some node in the AST, finds the `LocalDefId` associated with it by the name
608641 /// resolver (if any).
609642 fn opt_local_def_id ( & self , node : NodeId ) -> Option < LocalDefId > {
610- self . resolver . general . node_id_to_def_id . get ( & node) . copied ( )
643+ self . resolver . node_id_to_def_id . get ( & node) . copied ( )
611644 }
612645
613646 fn local_def_id ( & self , node : NodeId ) -> LocalDefId {
614- self . opt_local_def_id ( node) . unwrap_or_else ( || panic ! ( "no entry for node id: `{node:?}`" ) )
647+ self . opt_local_def_id ( node) . unwrap_or_else ( || {
648+ self . resolver . general . owners . items ( ) . any ( |( id, items) | {
649+ items. node_id_to_def_id . items ( ) . any ( |( node_id, def_id) | {
650+ if * node_id == node {
651+ panic ! (
652+ "{def_id:?} ({node_id}) was found in {:?} ({id})" ,
653+ items. node_id_to_def_id. get( id) ,
654+ )
655+ }
656+ false
657+ } )
658+ } ) ;
659+ panic ! ( "no entry for node id: `{node:?}`" ) ;
660+ } )
615661 }
616662
617663 /// Given the id of an owner node in the AST, returns the corresponding `OwnerId`.
618664 fn owner_id ( & self , node : NodeId ) -> hir:: OwnerId {
619- hir:: OwnerId { def_id : self . local_def_id ( node) }
665+ hir:: OwnerId { def_id : self . resolver . general . owners [ & node] . node_id_to_def_id [ & node ] }
620666 }
621667
622668 /// Freshen the `LoweringContext` and ready it to lower a nested item.
@@ -635,6 +681,10 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
635681 let current_attrs = std:: mem:: take ( & mut self . attrs ) ;
636682 let current_bodies = std:: mem:: take ( & mut self . bodies ) ;
637683 let current_define_opaque = std:: mem:: take ( & mut self . define_opaque ) ;
684+ let current_ast_owner = std:: mem:: replace (
685+ & mut self . resolver . item ,
686+ self . resolver . general . owners . remove ( & owner) . unwrap ( ) ,
687+ ) ;
638688 let current_ident_and_label_to_local_id =
639689 std:: mem:: take ( & mut self . ident_and_label_to_local_id ) ;
640690
@@ -682,6 +732,10 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
682732 self . impl_trait_bounds = current_impl_trait_bounds;
683733 self . delayed_lints = current_delayed_lints;
684734
735+ let _prev_owner_data = std:: mem:: replace ( & mut self . resolver . item , current_ast_owner) ;
736+ #[ cfg( debug_assertions) ]
737+ self . resolver . general . owners . insert ( owner, _prev_owner_data) ;
738+
685739 debug_assert ! ( !self . children. iter( ) . any( |( id, _) | id == & owner_id. def_id) ) ;
686740 self . children . push ( ( owner_id. def_id , hir:: MaybeOwner :: Owner ( info) ) ) ;
687741 }
0 commit comments