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