@@ -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 ( ) ,
@@ -558,12 +549,8 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
558549
559550 let krate = hir:: Crate {
560551 item : module,
561- exported_macros : self . arena . alloc_from_iter ( self . exported_macros ) ,
562552 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 ,
553+ owners : self . owners ,
567554 bodies : self . bodies ,
568555 body_ids,
569556 trait_impls : self . trait_impls ,
@@ -576,12 +563,48 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
576563 }
577564
578565 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) ;
566+ let id = item. item_id ( ) ;
567+ let item = self . arena . alloc ( item) ;
568+ self . owners . ensure_contains_elem ( id. def_id , || None ) ;
569+ self . owners [ id. def_id ] = Some ( hir:: OwnerNode :: Item ( item) ) ;
581570 self . modules . entry ( self . current_module ) . or_default ( ) . items . insert ( id) ;
582571 id
583572 }
584573
574+ fn insert_foreign_item ( & mut self , item : hir:: ForeignItem < ' hir > ) -> hir:: ForeignItemId {
575+ let id = item. foreign_item_id ( ) ;
576+ let item = self . arena . alloc ( item) ;
577+ self . owners . ensure_contains_elem ( id. def_id , || None ) ;
578+ self . owners [ id. def_id ] = Some ( hir:: OwnerNode :: ForeignItem ( item) ) ;
579+ self . modules . entry ( self . current_module ) . or_default ( ) . foreign_items . insert ( id) ;
580+ id
581+ }
582+
583+ fn insert_impl_item ( & mut self , item : hir:: ImplItem < ' hir > ) -> hir:: ImplItemId {
584+ let id = item. impl_item_id ( ) ;
585+ let item = self . arena . alloc ( item) ;
586+ self . owners . ensure_contains_elem ( id. def_id , || None ) ;
587+ self . owners [ id. def_id ] = Some ( hir:: OwnerNode :: ImplItem ( item) ) ;
588+ self . modules . entry ( self . current_module ) . or_default ( ) . impl_items . insert ( id) ;
589+ id
590+ }
591+
592+ fn insert_trait_item ( & mut self , item : hir:: TraitItem < ' hir > ) -> hir:: TraitItemId {
593+ let id = item. trait_item_id ( ) ;
594+ let item = self . arena . alloc ( item) ;
595+ self . owners . ensure_contains_elem ( id. def_id , || None ) ;
596+ self . owners [ id. def_id ] = Some ( hir:: OwnerNode :: TraitItem ( item) ) ;
597+ self . modules . entry ( self . current_module ) . or_default ( ) . trait_items . insert ( id) ;
598+ id
599+ }
600+
601+ fn insert_macro_def ( & mut self , item : hir:: MacroDef < ' hir > ) {
602+ let def_id = item. def_id ;
603+ let item = self . arena . alloc ( item) ;
604+ self . owners . ensure_contains_elem ( def_id, || None ) ;
605+ self . owners [ def_id] = Some ( hir:: OwnerNode :: MacroDef ( item) ) ;
606+ }
607+
585608 fn allocate_hir_id_counter ( & mut self , owner : NodeId ) -> hir:: HirId {
586609 // Set up the counter if needed.
587610 self . item_local_id_counters . entry ( owner) . or_insert ( 0 ) ;
0 commit comments