3535#![ doc( rust_logo) ]
3636#![ feature( assert_matches) ]
3737#![ feature( box_patterns) ]
38+ #![ feature( closure_track_caller) ]
3839#![ feature( exact_size_is_empty) ]
3940#![ feature( if_let_guard) ]
4041#![ feature( let_chains) ]
@@ -59,7 +60,7 @@ use rustc_hir::{
5960} ;
6061use rustc_index:: { Idx , IndexSlice , IndexVec } ;
6162use rustc_middle:: span_bug;
62- use rustc_middle:: ty:: { ResolverAstLowering , TyCtxt } ;
63+ use rustc_middle:: ty:: { PerOwnerResolverData , ResolverAstLowering , TyCtxt } ;
6364use rustc_session:: parse:: { add_feature_diagnostics, feature_err} ;
6465use rustc_span:: symbol:: { Ident , Symbol , kw, sym} ;
6566use rustc_span:: { DUMMY_SP , DesugaringKind , Span } ;
@@ -151,7 +152,10 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
151152 Self {
152153 // Pseudo-globals.
153154 tcx,
154- resolver : PerOwnerResolver { general : resolver } ,
155+ resolver : PerOwnerResolver {
156+ general : resolver,
157+ item : PerOwnerResolverData :: new ( DUMMY_NODE_ID ) ,
158+ } ,
155159 arena : tcx. hir_arena ,
156160
157161 // HirId handling.
@@ -201,6 +205,15 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
201205
202206pub ( crate ) struct PerOwnerResolver < ' a > {
203207 pub general : & ' a mut ResolverAstLowering ,
208+ pub item : PerOwnerResolverData ,
209+ }
210+
211+ impl < ' a > std:: ops:: Deref for PerOwnerResolver < ' a > {
212+ type Target = PerOwnerResolverData ;
213+
214+ fn deref ( & self ) -> & Self :: Target {
215+ & self . item
216+ }
204217}
205218
206219impl PerOwnerResolver < ' _ > {
@@ -368,17 +381,22 @@ enum AstOwner<'a> {
368381}
369382
370383fn index_crate < ' a > (
371- node_id_to_def_id : & NodeMap < LocalDefId > ,
384+ owners : & NodeMap < PerOwnerResolverData > ,
372385 krate : & ' a Crate ,
373386) -> IndexVec < LocalDefId , AstOwner < ' a > > {
374- let mut indexer = Indexer { node_id_to_def_id, index : IndexVec :: new ( ) } ;
387+ let mut indexer = Indexer {
388+ owners,
389+ node_id_to_def_id : & owners[ & CRATE_NODE_ID ] . node_id_to_def_id ,
390+ index : IndexVec :: new ( ) ,
391+ } ;
375392 * indexer. index . ensure_contains_elem ( CRATE_DEF_ID , || AstOwner :: NonOwner ) =
376393 AstOwner :: Crate ( krate) ;
377394 visit:: walk_crate ( & mut indexer, krate) ;
378395 return indexer. index ;
379396
380397 struct Indexer < ' s , ' a > {
381398 node_id_to_def_id : & ' s NodeMap < LocalDefId > ,
399+ owners : & ' s NodeMap < PerOwnerResolverData > ,
382400 index : IndexVec < LocalDefId , AstOwner < ' a > > ,
383401 }
384402
@@ -389,23 +407,38 @@ fn index_crate<'a>(
389407 }
390408
391409 fn visit_item ( & mut self , item : & ' a ast:: Item ) {
410+ let old = std:: mem:: replace (
411+ & mut self . node_id_to_def_id ,
412+ & self . owners [ & item. id ] . node_id_to_def_id ,
413+ ) ;
392414 let def_id = self . node_id_to_def_id [ & item. id ] ;
393415 * self . index . ensure_contains_elem ( def_id, || AstOwner :: NonOwner ) = AstOwner :: Item ( item) ;
394- visit:: walk_item ( self , item)
416+ visit:: walk_item ( self , item) ;
417+ self . node_id_to_def_id = old;
395418 }
396419
397420 fn visit_assoc_item ( & mut self , item : & ' a ast:: AssocItem , ctxt : visit:: AssocCtxt ) {
421+ let old = std:: mem:: replace (
422+ & mut self . node_id_to_def_id ,
423+ & self . owners [ & item. id ] . node_id_to_def_id ,
424+ ) ;
398425 let def_id = self . node_id_to_def_id [ & item. id ] ;
399426 * self . index . ensure_contains_elem ( def_id, || AstOwner :: NonOwner ) =
400427 AstOwner :: AssocItem ( item, ctxt) ;
401428 visit:: walk_assoc_item ( self , item, ctxt) ;
429+ self . node_id_to_def_id = old;
402430 }
403431
404432 fn visit_foreign_item ( & mut self , item : & ' a ast:: ForeignItem ) {
433+ let old = std:: mem:: replace (
434+ & mut self . node_id_to_def_id ,
435+ & self . owners [ & item. id ] . node_id_to_def_id ,
436+ ) ;
405437 let def_id = self . node_id_to_def_id [ & item. id ] ;
406438 * self . index . ensure_contains_elem ( def_id, || AstOwner :: NonOwner ) =
407439 AstOwner :: ForeignItem ( item) ;
408440 visit:: walk_item ( self , item) ;
441+ self . node_id_to_def_id = old;
409442 }
410443 }
411444}
@@ -442,7 +475,7 @@ pub fn lower_to_hir(tcx: TyCtxt<'_>, (): ()) -> hir::Crate<'_> {
442475 tcx. ensure_done ( ) . get_lang_items ( ( ) ) ;
443476 let ( mut resolver, krate) = tcx. resolver_for_lowering ( ) . steal ( ) ;
444477
445- let ast_index = index_crate ( & resolver. node_id_to_def_id , & krate) ;
478+ let ast_index = index_crate ( & resolver. owners , & krate) ;
446479 let mut owners = IndexVec :: from_fn_n (
447480 |_| hir:: MaybeOwner :: Phantom ,
448481 tcx. definitions_untracked ( ) . def_index_count ( ) ,
@@ -517,7 +550,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
517550 self . tcx . at ( span) . create_def ( self . current_hir_id_owner . def_id , name, def_kind) . def_id ( ) ;
518551
519552 debug ! ( "create_def: def_id_to_node_id[{:?}] <-> {:?}" , def_id, node_id) ;
520- self . resolver . general . node_id_to_def_id . insert ( node_id, def_id) ;
553+ self . resolver . item . node_id_to_def_id . insert ( node_id, def_id) ;
521554
522555 def_id
523556 }
@@ -532,16 +565,29 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
532565 /// Given the id of some node in the AST, finds the `LocalDefId` associated with it by the name
533566 /// resolver (if any).
534567 fn opt_local_def_id ( & self , node : NodeId ) -> Option < LocalDefId > {
535- self . resolver . general . node_id_to_def_id . get ( & node) . copied ( )
568+ self . resolver . node_id_to_def_id . get ( & node) . copied ( )
536569 }
537570
538571 fn local_def_id ( & self , node : NodeId ) -> LocalDefId {
539- self . opt_local_def_id ( node) . unwrap_or_else ( || panic ! ( "no entry for node id: `{node:?}`" ) )
572+ self . opt_local_def_id ( node) . unwrap_or_else ( || {
573+ self . resolver . general . owners . items ( ) . any ( |( id, items) | {
574+ items. node_id_to_def_id . items ( ) . any ( |( node_id, def_id) | {
575+ if * node_id == node {
576+ panic ! (
577+ "{def_id:?} ({node_id}) was found in {:?} ({id})" ,
578+ items. node_id_to_def_id. get( id) ,
579+ )
580+ }
581+ false
582+ } )
583+ } ) ;
584+ panic ! ( "no entry for node id: `{node:?}`" ) ;
585+ } )
540586 }
541587
542588 /// Given the id of an owner node in the AST, returns the corresponding `OwnerId`.
543589 fn owner_id ( & self , node : NodeId ) -> hir:: OwnerId {
544- hir:: OwnerId { def_id : self . local_def_id ( node) }
590+ hir:: OwnerId { def_id : self . resolver . general . owners [ & node] . node_id_to_def_id [ & node ] }
545591 }
546592
547593 /// Freshen the `LoweringContext` and ready it to lower a nested item.
@@ -560,6 +606,10 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
560606 let current_attrs = std:: mem:: take ( & mut self . attrs ) ;
561607 let current_bodies = std:: mem:: take ( & mut self . bodies ) ;
562608 let current_define_opaque = std:: mem:: take ( & mut self . define_opaque ) ;
609+ let current_ast_owner = std:: mem:: replace (
610+ & mut self . resolver . item ,
611+ self . resolver . general . owners . remove ( & owner) . unwrap ( ) ,
612+ ) ;
563613 let current_ident_and_label_to_local_id =
564614 std:: mem:: take ( & mut self . ident_and_label_to_local_id ) ;
565615
@@ -605,6 +655,10 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
605655 self . impl_trait_defs = current_impl_trait_defs;
606656 self . impl_trait_bounds = current_impl_trait_bounds;
607657
658+ let _prev_owner_data = std:: mem:: replace ( & mut self . resolver . item , current_ast_owner) ;
659+ #[ cfg( debug_assertions) ]
660+ self . resolver . general . owners . insert ( owner, _prev_owner_data) ;
661+
608662 debug_assert ! ( !self . children. iter( ) . any( |( id, _) | id == & owner_id. def_id) ) ;
609663 self . children . push ( ( owner_id. def_id , hir:: MaybeOwner :: Owner ( info) ) ) ;
610664 }
0 commit comments