@@ -101,13 +101,8 @@ struct LoweringContext<'a, 'hir: 'a> {
101101 arena : & ' hir Arena < ' hir > ,
102102
103103 /// The items being lowered are collected here.
104- items : BTreeMap < hir:: ItemId , hir:: Item < ' hir > > ,
105-
106- trait_items : BTreeMap < hir:: TraitItemId , hir:: TraitItem < ' hir > > ,
107- impl_items : BTreeMap < hir:: ImplItemId , hir:: ImplItem < ' hir > > ,
108- foreign_items : BTreeMap < hir:: ForeignItemId , hir:: ForeignItem < ' hir > > ,
104+ owners : IndexVec < LocalDefId , Option < hir:: OwnerNode < ' hir > > > ,
109105 bodies : BTreeMap < hir:: BodyId , hir:: Body < ' hir > > ,
110- exported_macros : Vec < hir:: MacroDef < ' hir > > ,
111106 non_exported_macro_attrs : Vec < ast:: Attribute > ,
112107
113108 trait_impls : BTreeMap < DefId , Vec < LocalDefId > > ,
@@ -330,15 +325,11 @@ pub fn lower_crate<'a, 'hir>(
330325 resolver,
331326 nt_to_tokenstream,
332327 arena,
333- items : BTreeMap :: new ( ) ,
334- trait_items : BTreeMap :: new ( ) ,
335- impl_items : BTreeMap :: new ( ) ,
336- foreign_items : BTreeMap :: new ( ) ,
328+ owners : IndexVec :: default ( ) ,
337329 bodies : BTreeMap :: new ( ) ,
338330 trait_impls : BTreeMap :: new ( ) ,
339331 modules : BTreeMap :: new ( ) ,
340332 attrs : BTreeMap :: default ( ) ,
341- exported_macros : Vec :: new ( ) ,
342333 non_exported_macro_attrs : Vec :: new ( ) ,
343334 catch_scopes : Vec :: new ( ) ,
344335 loop_scopes : Vec :: new ( ) ,
@@ -521,8 +512,11 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
521512 visit:: walk_crate ( & mut MiscCollector { lctx : & mut self } , c) ;
522513 visit:: walk_crate ( & mut item:: ItemLowerer { lctx : & mut self } , c) ;
523514
524- let module = self . lower_mod ( & c. items , c. span ) ;
515+ let module = self . arena . alloc ( self . lower_mod ( & c. items , c. span ) ) ;
525516 self . lower_attrs ( hir:: CRATE_HIR_ID , & c. attrs ) ;
517+ self . owners . ensure_contains_elem ( CRATE_DEF_ID , || None ) ;
518+ self . owners [ CRATE_DEF_ID ] = Some ( hir:: OwnerNode :: Crate ( module) ) ;
519+
526520 let body_ids = body_ids ( & self . bodies ) ;
527521 let proc_macros =
528522 c. proc_macros . iter ( ) . map ( |id| self . node_id_to_hir_id [ * id] . unwrap ( ) ) . collect ( ) ;
@@ -557,13 +551,8 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
557551 }
558552
559553 let krate = hir:: Crate {
560- item : module,
561- exported_macros : self . arena . alloc_from_iter ( self . exported_macros ) ,
562554 non_exported_macro_attrs : self . arena . alloc_from_iter ( self . non_exported_macro_attrs ) ,
563- items : self . items ,
564- trait_items : self . trait_items ,
565- impl_items : self . impl_items ,
566- foreign_items : self . foreign_items ,
555+ owners : self . owners ,
567556 bodies : self . bodies ,
568557 body_ids,
569558 trait_impls : self . trait_impls ,
@@ -576,12 +565,48 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
576565 }
577566
578567 fn insert_item ( & mut self , item : hir:: Item < ' hir > ) -> hir:: ItemId {
579- let id = hir:: ItemId { def_id : item. def_id } ;
580- self . items . insert ( id, item) ;
568+ let id = item. item_id ( ) ;
569+ let item = self . arena . alloc ( item) ;
570+ self . owners . ensure_contains_elem ( id. def_id , || None ) ;
571+ self . owners [ id. def_id ] = Some ( hir:: OwnerNode :: Item ( item) ) ;
581572 self . modules . entry ( self . current_module ) . or_default ( ) . items . insert ( id) ;
582573 id
583574 }
584575
576+ fn insert_foreign_item ( & mut self , item : hir:: ForeignItem < ' hir > ) -> hir:: ForeignItemId {
577+ let id = item. foreign_item_id ( ) ;
578+ let item = self . arena . alloc ( item) ;
579+ self . owners . ensure_contains_elem ( id. def_id , || None ) ;
580+ self . owners [ id. def_id ] = Some ( hir:: OwnerNode :: ForeignItem ( item) ) ;
581+ self . modules . entry ( self . current_module ) . or_default ( ) . foreign_items . insert ( id) ;
582+ id
583+ }
584+
585+ fn insert_impl_item ( & mut self , item : hir:: ImplItem < ' hir > ) -> hir:: ImplItemId {
586+ let id = item. impl_item_id ( ) ;
587+ let item = self . arena . alloc ( item) ;
588+ self . owners . ensure_contains_elem ( id. def_id , || None ) ;
589+ self . owners [ id. def_id ] = Some ( hir:: OwnerNode :: ImplItem ( item) ) ;
590+ self . modules . entry ( self . current_module ) . or_default ( ) . impl_items . insert ( id) ;
591+ id
592+ }
593+
594+ fn insert_trait_item ( & mut self , item : hir:: TraitItem < ' hir > ) -> hir:: TraitItemId {
595+ let id = item. trait_item_id ( ) ;
596+ let item = self . arena . alloc ( item) ;
597+ self . owners . ensure_contains_elem ( id. def_id , || None ) ;
598+ self . owners [ id. def_id ] = Some ( hir:: OwnerNode :: TraitItem ( item) ) ;
599+ self . modules . entry ( self . current_module ) . or_default ( ) . trait_items . insert ( id) ;
600+ id
601+ }
602+
603+ fn insert_macro_def ( & mut self , item : hir:: MacroDef < ' hir > ) {
604+ let def_id = item. def_id ;
605+ let item = self . arena . alloc ( item) ;
606+ self . owners . ensure_contains_elem ( def_id, || None ) ;
607+ self . owners [ def_id] = Some ( hir:: OwnerNode :: MacroDef ( item) ) ;
608+ }
609+
585610 fn allocate_hir_id_counter ( & mut self , owner : NodeId ) -> hir:: HirId {
586611 // Set up the counter if needed.
587612 self . item_local_id_counters . entry ( owner) . or_insert ( 0 ) ;
0 commit comments