3636#![ doc( rust_logo) ]
3737#![ feature( assert_matches) ]
3838#![ feature( box_patterns) ]
39+ #![ feature( closure_track_caller) ]
3940#![ feature( exact_size_is_empty) ]
4041#![ feature( if_let_guard) ]
4142#![ feature( let_chains) ]
@@ -60,7 +61,7 @@ use rustc_hir::{
6061} ;
6162use rustc_index:: { Idx , IndexSlice , IndexVec } ;
6263use rustc_middle:: span_bug;
63- use rustc_middle:: ty:: { ResolverAstLowering , TyCtxt } ;
64+ use rustc_middle:: ty:: { PerOwnerResolverData , ResolverAstLowering , TyCtxt } ;
6465use rustc_session:: parse:: { add_feature_diagnostics, feature_err} ;
6566use rustc_span:: symbol:: { Ident , Symbol , kw, sym} ;
6667use rustc_span:: { DUMMY_SP , DesugaringKind , Span } ;
@@ -152,7 +153,10 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
152153 Self {
153154 // Pseudo-globals.
154155 tcx,
155- resolver : PerOwnerResolver { general : resolver } ,
156+ resolver : PerOwnerResolver {
157+ general : resolver,
158+ item : PerOwnerResolverData :: new ( DUMMY_NODE_ID ) ,
159+ } ,
156160 arena : tcx. hir_arena ,
157161
158162 // HirId handling.
@@ -202,6 +206,15 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
202206
203207pub ( crate ) struct PerOwnerResolver < ' a > {
204208 pub general : & ' a mut ResolverAstLowering ,
209+ pub item : PerOwnerResolverData ,
210+ }
211+
212+ impl < ' a > std:: ops:: Deref for PerOwnerResolver < ' a > {
213+ type Target = PerOwnerResolverData ;
214+
215+ fn deref ( & self ) -> & Self :: Target {
216+ & self . item
217+ }
205218}
206219
207220impl PerOwnerResolver < ' _ > {
@@ -369,17 +382,22 @@ enum AstOwner<'a> {
369382}
370383
371384fn index_crate < ' a > (
372- node_id_to_def_id : & NodeMap < LocalDefId > ,
385+ owners : & NodeMap < PerOwnerResolverData > ,
373386 krate : & ' a Crate ,
374387) -> IndexVec < LocalDefId , AstOwner < ' a > > {
375- let mut indexer = Indexer { node_id_to_def_id, index : IndexVec :: new ( ) } ;
388+ let mut indexer = Indexer {
389+ owners,
390+ node_id_to_def_id : & owners[ & CRATE_NODE_ID ] . node_id_to_def_id ,
391+ index : IndexVec :: new ( ) ,
392+ } ;
376393 * indexer. index . ensure_contains_elem ( CRATE_DEF_ID , || AstOwner :: NonOwner ) =
377394 AstOwner :: Crate ( krate) ;
378395 visit:: walk_crate ( & mut indexer, krate) ;
379396 return indexer. index ;
380397
381398 struct Indexer < ' s , ' a > {
382399 node_id_to_def_id : & ' s NodeMap < LocalDefId > ,
400+ owners : & ' s NodeMap < PerOwnerResolverData > ,
383401 index : IndexVec < LocalDefId , AstOwner < ' a > > ,
384402 }
385403
@@ -390,23 +408,38 @@ fn index_crate<'a>(
390408 }
391409
392410 fn visit_item ( & mut self , item : & ' a ast:: Item ) {
411+ let old = std:: mem:: replace (
412+ & mut self . node_id_to_def_id ,
413+ & self . owners [ & item. id ] . node_id_to_def_id ,
414+ ) ;
393415 let def_id = self . node_id_to_def_id [ & item. id ] ;
394416 * self . index . ensure_contains_elem ( def_id, || AstOwner :: NonOwner ) = AstOwner :: Item ( item) ;
395- visit:: walk_item ( self , item)
417+ visit:: walk_item ( self , item) ;
418+ self . node_id_to_def_id = old;
396419 }
397420
398421 fn visit_assoc_item ( & mut self , item : & ' a ast:: AssocItem , ctxt : visit:: AssocCtxt ) {
422+ let old = std:: mem:: replace (
423+ & mut self . node_id_to_def_id ,
424+ & self . owners [ & item. id ] . node_id_to_def_id ,
425+ ) ;
399426 let def_id = self . node_id_to_def_id [ & item. id ] ;
400427 * self . index . ensure_contains_elem ( def_id, || AstOwner :: NonOwner ) =
401428 AstOwner :: AssocItem ( item, ctxt) ;
402429 visit:: walk_assoc_item ( self , item, ctxt) ;
430+ self . node_id_to_def_id = old;
403431 }
404432
405433 fn visit_foreign_item ( & mut self , item : & ' a ast:: ForeignItem ) {
434+ let old = std:: mem:: replace (
435+ & mut self . node_id_to_def_id ,
436+ & self . owners [ & item. id ] . node_id_to_def_id ,
437+ ) ;
406438 let def_id = self . node_id_to_def_id [ & item. id ] ;
407439 * self . index . ensure_contains_elem ( def_id, || AstOwner :: NonOwner ) =
408440 AstOwner :: ForeignItem ( item) ;
409441 visit:: walk_item ( self , item) ;
442+ self . node_id_to_def_id = old;
410443 }
411444 }
412445}
@@ -443,7 +476,7 @@ pub fn lower_to_hir(tcx: TyCtxt<'_>, (): ()) -> hir::Crate<'_> {
443476 tcx. ensure_done ( ) . get_lang_items ( ( ) ) ;
444477 let ( mut resolver, krate) = tcx. resolver_for_lowering ( ) . steal ( ) ;
445478
446- let ast_index = index_crate ( & resolver. node_id_to_def_id , & krate) ;
479+ let ast_index = index_crate ( & resolver. owners , & krate) ;
447480 let mut owners = IndexVec :: from_fn_n (
448481 |_| hir:: MaybeOwner :: Phantom ,
449482 tcx. definitions_untracked ( ) . def_index_count ( ) ,
@@ -518,7 +551,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
518551 self . tcx . at ( span) . create_def ( self . current_hir_id_owner . def_id , name, def_kind) . def_id ( ) ;
519552
520553 debug ! ( "create_def: def_id_to_node_id[{:?}] <-> {:?}" , def_id, node_id) ;
521- self . resolver . general . node_id_to_def_id . insert ( node_id, def_id) ;
554+ self . resolver . item . node_id_to_def_id . insert ( node_id, def_id) ;
522555
523556 def_id
524557 }
@@ -533,16 +566,29 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
533566 /// Given the id of some node in the AST, finds the `LocalDefId` associated with it by the name
534567 /// resolver (if any).
535568 fn opt_local_def_id ( & self , node : NodeId ) -> Option < LocalDefId > {
536- self . resolver . general . node_id_to_def_id . get ( & node) . copied ( )
569+ self . resolver . node_id_to_def_id . get ( & node) . copied ( )
537570 }
538571
539572 fn local_def_id ( & self , node : NodeId ) -> LocalDefId {
540- self . opt_local_def_id ( node) . unwrap_or_else ( || panic ! ( "no entry for node id: `{node:?}`" ) )
573+ self . opt_local_def_id ( node) . unwrap_or_else ( || {
574+ self . resolver . general . owners . items ( ) . any ( |( id, items) | {
575+ items. node_id_to_def_id . items ( ) . any ( |( node_id, def_id) | {
576+ if * node_id == node {
577+ panic ! (
578+ "{def_id:?} ({node_id}) was found in {:?} ({id})" ,
579+ items. node_id_to_def_id. get( id) ,
580+ )
581+ }
582+ false
583+ } )
584+ } ) ;
585+ panic ! ( "no entry for node id: `{node:?}`" ) ;
586+ } )
541587 }
542588
543589 /// Given the id of an owner node in the AST, returns the corresponding `OwnerId`.
544590 fn owner_id ( & self , node : NodeId ) -> hir:: OwnerId {
545- hir:: OwnerId { def_id : self . local_def_id ( node) }
591+ hir:: OwnerId { def_id : self . resolver . general . owners [ & node] . node_id_to_def_id [ & node ] }
546592 }
547593
548594 /// Freshen the `LoweringContext` and ready it to lower a nested item.
@@ -561,6 +607,10 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
561607 let current_attrs = std:: mem:: take ( & mut self . attrs ) ;
562608 let current_bodies = std:: mem:: take ( & mut self . bodies ) ;
563609 let current_define_opaque = std:: mem:: take ( & mut self . define_opaque ) ;
610+ let current_ast_owner = std:: mem:: replace (
611+ & mut self . resolver . item ,
612+ self . resolver . general . owners . remove ( & owner) . unwrap ( ) ,
613+ ) ;
564614 let current_ident_and_label_to_local_id =
565615 std:: mem:: take ( & mut self . ident_and_label_to_local_id ) ;
566616
@@ -606,6 +656,10 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
606656 self . impl_trait_defs = current_impl_trait_defs;
607657 self . impl_trait_bounds = current_impl_trait_bounds;
608658
659+ let _prev_owner_data = std:: mem:: replace ( & mut self . resolver . item , current_ast_owner) ;
660+ #[ cfg( debug_assertions) ]
661+ self . resolver . general . owners . insert ( owner, _prev_owner_data) ;
662+
609663 debug_assert ! ( !self . children. iter( ) . any( |( id, _) | id == & owner_id. def_id) ) ;
610664 self . children . push ( ( owner_id. def_id , hir:: MaybeOwner :: Owner ( info) ) ) ;
611665 }
0 commit comments