@@ -40,12 +40,9 @@ impl ItemLowerer<'_, '_, '_> {
4040
4141impl < ' a >  Visitor < ' a >  for  ItemLowerer < ' a ,  ' _ ,  ' _ >  { 
4242    fn  visit_item ( & mut  self ,  item :  & ' a  Item )  { 
43-         self . lctx . allocate_hir_id_counter ( item. id ) ; 
4443        let  hir_id = self . lctx . with_hir_id_owner ( item. id ,  |lctx| { 
45-             lctx. without_in_scope_lifetime_defs ( |lctx| { 
46-                 let  hir_item = lctx. lower_item ( item) ; 
47-                 lctx. insert_item ( hir_item) 
48-             } ) 
44+             let  node = lctx. without_in_scope_lifetime_defs ( |lctx| lctx. lower_item ( item) ) ; 
45+             hir:: OwnerNode :: Item ( node) 
4946        } ) ; 
5047
5148        self . lctx . with_parent_item_lifetime_defs ( hir_id,  |this| { 
@@ -72,26 +69,17 @@ impl<'a> Visitor<'a> for ItemLowerer<'a, '_, '_> {
7269    } 
7370
7471    fn  visit_assoc_item ( & mut  self ,  item :  & ' a  AssocItem ,  ctxt :  AssocCtxt )  { 
75-         self . lctx . allocate_hir_id_counter ( item. id ) ; 
7672        self . lctx . with_hir_id_owner ( item. id ,  |lctx| match  ctxt { 
77-             AssocCtxt :: Trait  => { 
78-                 let  hir_item = lctx. lower_trait_item ( item) ; 
79-                 lctx. insert_trait_item ( hir_item) ; 
80-             } 
81-             AssocCtxt :: Impl  => { 
82-                 let  hir_item = lctx. lower_impl_item ( item) ; 
83-                 lctx. insert_impl_item ( hir_item) ; 
84-             } 
73+             AssocCtxt :: Trait  => hir:: OwnerNode :: TraitItem ( lctx. lower_trait_item ( item) ) , 
74+             AssocCtxt :: Impl  => hir:: OwnerNode :: ImplItem ( lctx. lower_impl_item ( item) ) , 
8575        } ) ; 
8676
8777        visit:: walk_assoc_item ( self ,  item,  ctxt) ; 
8878    } 
8979
9080    fn  visit_foreign_item ( & mut  self ,  item :  & ' a  ForeignItem )  { 
91-         self . lctx . allocate_hir_id_counter ( item. id ) ; 
9281        self . lctx . with_hir_id_owner ( item. id ,  |lctx| { 
93-             let  hir_item = lctx. lower_foreign_item ( item) ; 
94-             lctx. insert_foreign_item ( hir_item) ; 
82+             hir:: OwnerNode :: ForeignItem ( lctx. lower_foreign_item ( item) ) 
9583        } ) ; 
9684
9785        visit:: walk_foreign_item ( self ,  item) ; 
@@ -106,12 +94,12 @@ impl<'hir> LoweringContext<'_, 'hir> {
10694    // only used when lowering a child item of a trait or impl. 
10795    fn  with_parent_item_lifetime_defs < T > ( 
10896        & mut  self , 
109-         parent_hir_id :  hir :: ItemId , 
97+         parent_hir_id :  LocalDefId , 
11098        f :  impl  FnOnce ( & mut  Self )  -> T , 
11199    )  -> T  { 
112100        let  old_len = self . in_scope_lifetimes . len ( ) ; 
113101
114-         let  parent_generics = match  self . owners [ parent_hir_id. def_id ] . unwrap ( ) . expect_item ( ) . kind  { 
102+         let  parent_generics = match  self . owners [ parent_hir_id] . unwrap ( ) . expect_item ( ) . kind  { 
115103            hir:: ItemKind :: Impl ( hir:: Impl  {  ref  generics,  .. } ) 
116104            | hir:: ItemKind :: Trait ( _,  _,  ref  generics,  ..)  => generics. params , 
117105            _ => & [ ] , 
@@ -186,19 +174,20 @@ impl<'hir> LoweringContext<'_, 'hir> {
186174        } 
187175    } 
188176
189-     pub   fn  lower_item ( & mut  self ,  i :  & Item )  -> hir:: Item < ' hir >  { 
177+     fn  lower_item ( & mut  self ,  i :  & Item )  ->  & ' hir  hir:: Item < ' hir >  { 
190178        let  mut  ident = i. ident ; 
191179        let  mut  vis = self . lower_visibility ( & i. vis ) ; 
192180        let  hir_id = self . lower_node_id ( i. id ) ; 
193181        let  attrs = self . lower_attrs ( hir_id,  & i. attrs ) ; 
194182        let  kind = self . lower_item_kind ( i. span ,  i. id ,  hir_id,  & mut  ident,  attrs,  & mut  vis,  & i. kind ) ; 
195-         hir:: Item  { 
183+         let  item =  hir:: Item  { 
196184            def_id :  hir_id. expect_owner ( ) , 
197185            ident :  self . lower_ident ( ident) , 
198186            kind, 
199187            vis, 
200188            span :  self . lower_span ( i. span ) , 
201-         } 
189+         } ; 
190+         self . arena . alloc ( item) 
202191    } 
203192
204193    fn  lower_item_kind ( 
@@ -480,10 +469,16 @@ impl<'hir> LoweringContext<'_, 'hir> {
480469                // Essentially a single `use` which imports two names is desugared into 
481470                // two imports. 
482471                for  new_node_id in  [ id1,  id2]  { 
483-                     // Associate an HirId to both ids even if there is no resolution. 
484-                     let  new_id = self . allocate_hir_id_counter ( new_node_id) ; 
485- 
486-                     let  res = if  let  Some ( res)  = resolutions. next ( )  {  res }  else  {  continue  } ; 
472+                     let  new_id = self . resolver . local_def_id ( new_node_id) ; 
473+                     let  res = if  let  Some ( res)  = resolutions. next ( )  { 
474+                         res
475+                     }  else  { 
476+                         // Associate an HirId to both ids even if there is no resolution. 
477+                         self . node_id_to_hir_id . ensure_contains_elem ( new_node_id,  || None ) ; 
478+                         debug_assert ! ( self . node_id_to_hir_id[ new_node_id] . is_none( ) ) ; 
479+                         self . node_id_to_hir_id [ new_node_id]  = Some ( hir:: HirId :: make_owner ( new_id) ) ; 
480+                         continue ; 
481+                     } ; 
487482                    let  ident = * ident; 
488483                    let  mut  path = path. clone ( ) ; 
489484                    for  seg in  & mut  path. segments  { 
@@ -500,13 +495,14 @@ impl<'hir> LoweringContext<'_, 'hir> {
500495                            this. attrs . insert ( hir:: HirId :: make_owner ( new_id) ,  attrs) ; 
501496                        } 
502497
503-                         this . insert_item ( hir:: Item  { 
498+                         let  item =  hir:: Item  { 
504499                            def_id :  new_id, 
505500                            ident :  this. lower_ident ( ident) , 
506501                            kind, 
507502                            vis, 
508503                            span :  this. lower_span ( span) , 
509-                         } ) ; 
504+                         } ; 
505+                         hir:: OwnerNode :: Item ( this. arena . alloc ( item) ) 
510506                    } ) ; 
511507                } 
512508
@@ -550,7 +546,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
550546
551547                // Add all the nested `PathListItem`s to the HIR. 
552548                for  & ( ref  use_tree,  id)  in  trees { 
553-                     let  new_hir_id = self . allocate_hir_id_counter ( id) ; 
549+                     let  new_hir_id = self . resolver . local_def_id ( id) ; 
554550
555551                    let  mut  prefix = prefix. clone ( ) ; 
556552
@@ -574,13 +570,14 @@ impl<'hir> LoweringContext<'_, 'hir> {
574570                            this. attrs . insert ( hir:: HirId :: make_owner ( new_hir_id) ,  attrs) ; 
575571                        } 
576572
577-                         this . insert_item ( hir:: Item  { 
573+                         let  item =  hir:: Item  { 
578574                            def_id :  new_hir_id, 
579575                            ident :  this. lower_ident ( ident) , 
580576                            kind, 
581577                            vis, 
582578                            span :  this. lower_span ( use_tree. span ) , 
583-                         } ) ; 
579+                         } ; 
580+                         hir:: OwnerNode :: Item ( this. arena . alloc ( item) ) 
584581                    } ) ; 
585582                } 
586583
@@ -647,11 +644,11 @@ impl<'hir> LoweringContext<'_, 'hir> {
647644        respan ( self . lower_span ( vis. span ) ,  vis_kind) 
648645    } 
649646
650-     fn  lower_foreign_item ( & mut  self ,  i :  & ForeignItem )  -> hir:: ForeignItem < ' hir >  { 
647+     fn  lower_foreign_item ( & mut  self ,  i :  & ForeignItem )  -> & ' hir   hir:: ForeignItem < ' hir >  { 
651648        let  hir_id = self . lower_node_id ( i. id ) ; 
652649        let  def_id = hir_id. expect_owner ( ) ; 
653650        self . lower_attrs ( hir_id,  & i. attrs ) ; 
654-         hir:: ForeignItem  { 
651+         let  item =  hir:: ForeignItem  { 
655652            def_id, 
656653            ident :  self . lower_ident ( i. ident ) , 
657654            kind :  match  i. kind  { 
@@ -681,12 +678,13 @@ impl<'hir> LoweringContext<'_, 'hir> {
681678            } , 
682679            vis :  self . lower_visibility ( & i. vis ) , 
683680            span :  self . lower_span ( i. span ) , 
684-         } 
681+         } ; 
682+         self . arena . alloc ( item) 
685683    } 
686684
687685    fn  lower_foreign_item_ref ( & mut  self ,  i :  & ForeignItem )  -> hir:: ForeignItemRef  { 
688686        hir:: ForeignItemRef  { 
689-             id :  hir:: ForeignItemId  {  def_id :  self . allocate_hir_id_counter ( i. id )  } , 
687+             id :  hir:: ForeignItemId  {  def_id :  self . resolver . local_def_id ( i. id )  } , 
690688            ident :  self . lower_ident ( i. ident ) , 
691689            span :  self . lower_span ( i. span ) , 
692690        } 
@@ -761,7 +759,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
761759        } 
762760    } 
763761
764-     fn  lower_trait_item ( & mut  self ,  i :  & AssocItem )  -> hir:: TraitItem < ' hir >  { 
762+     fn  lower_trait_item ( & mut  self ,  i :  & AssocItem )  -> & ' hir   hir:: TraitItem < ' hir >  { 
765763        let  hir_id = self . lower_node_id ( i. id ) ; 
766764        let  trait_item_def_id = hir_id. expect_owner ( ) ; 
767765
@@ -804,13 +802,14 @@ impl<'hir> LoweringContext<'_, 'hir> {
804802        } ; 
805803
806804        self . lower_attrs ( hir_id,  & i. attrs ) ; 
807-         hir:: TraitItem  { 
805+         let  item =  hir:: TraitItem  { 
808806            def_id :  trait_item_def_id, 
809807            ident :  self . lower_ident ( i. ident ) , 
810808            generics, 
811809            kind, 
812810            span :  self . lower_span ( i. span ) , 
813-         } 
811+         } ; 
812+         self . arena . alloc ( item) 
814813    } 
815814
816815    fn  lower_trait_item_ref ( & mut  self ,  i :  & AssocItem )  -> hir:: TraitItemRef  { 
@@ -840,7 +839,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
840839        self . expr ( span,  hir:: ExprKind :: Err ,  AttrVec :: new ( ) ) 
841840    } 
842841
843-     fn  lower_impl_item ( & mut  self ,  i :  & AssocItem )  -> hir:: ImplItem < ' hir >  { 
842+     fn  lower_impl_item ( & mut  self ,  i :  & AssocItem )  -> & ' hir   hir:: ImplItem < ' hir >  { 
844843        let  impl_item_def_id = self . resolver . local_def_id ( i. id ) ; 
845844
846845        let  ( generics,  kind)  = match  & i. kind  { 
@@ -894,23 +893,24 @@ impl<'hir> LoweringContext<'_, 'hir> {
894893        let  ( defaultness,  _)  = self . lower_defaultness ( i. kind . defaultness ( ) ,  has_value) ; 
895894        let  hir_id = self . lower_node_id ( i. id ) ; 
896895        self . lower_attrs ( hir_id,  & i. attrs ) ; 
897-         hir:: ImplItem  { 
896+         let  item =  hir:: ImplItem  { 
898897            def_id :  hir_id. expect_owner ( ) , 
899898            ident :  self . lower_ident ( i. ident ) , 
900899            generics, 
901900            vis :  self . lower_visibility ( & i. vis ) , 
902901            defaultness, 
903902            kind, 
904903            span :  self . lower_span ( i. span ) , 
905-         } 
904+         } ; 
905+         self . arena . alloc ( item) 
906906    } 
907907
908908    fn  lower_impl_item_ref ( & mut  self ,  i :  & AssocItem )  -> hir:: ImplItemRef  { 
909909        // Since `default impl` is not yet implemented, this is always true in impls. 
910910        let  has_value = true ; 
911911        let  ( defaultness,  _)  = self . lower_defaultness ( i. kind . defaultness ( ) ,  has_value) ; 
912912        hir:: ImplItemRef  { 
913-             id :  hir:: ImplItemId  {  def_id :  self . allocate_hir_id_counter ( i. id )  } , 
913+             id :  hir:: ImplItemId  {  def_id :  self . resolver . local_def_id ( i. id )  } , 
914914            ident :  self . lower_ident ( i. ident ) , 
915915            span :  self . lower_span ( i. span ) , 
916916            defaultness, 
0 commit comments