@@ -101,13 +101,8 @@ struct LoweringContext<'a, 'hir: 'a> {
101
101
arena : & ' hir Arena < ' hir > ,
102
102
103
103
/// 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 > > > ,
109
105
bodies : BTreeMap < hir:: BodyId , hir:: Body < ' hir > > ,
110
- exported_macros : Vec < hir:: MacroDef < ' hir > > ,
111
106
non_exported_macro_attrs : Vec < ast:: Attribute > ,
112
107
113
108
trait_impls : BTreeMap < DefId , Vec < LocalDefId > > ,
@@ -330,15 +325,11 @@ pub fn lower_crate<'a, 'hir>(
330
325
resolver,
331
326
nt_to_tokenstream,
332
327
arena,
333
- items : BTreeMap :: new ( ) ,
334
- trait_items : BTreeMap :: new ( ) ,
335
- impl_items : BTreeMap :: new ( ) ,
336
- foreign_items : BTreeMap :: new ( ) ,
328
+ owners : IndexVec :: default ( ) ,
337
329
bodies : BTreeMap :: new ( ) ,
338
330
trait_impls : BTreeMap :: new ( ) ,
339
331
modules : BTreeMap :: new ( ) ,
340
332
attrs : BTreeMap :: default ( ) ,
341
- exported_macros : Vec :: new ( ) ,
342
333
non_exported_macro_attrs : Vec :: new ( ) ,
343
334
catch_scopes : Vec :: new ( ) ,
344
335
loop_scopes : Vec :: new ( ) ,
@@ -558,12 +549,8 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
558
549
559
550
let krate = hir:: Crate {
560
551
item : module,
561
- exported_macros : self . arena . alloc_from_iter ( self . exported_macros ) ,
562
552
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 ,
567
554
bodies : self . bodies ,
568
555
body_ids,
569
556
trait_impls : self . trait_impls ,
@@ -576,12 +563,48 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
576
563
}
577
564
578
565
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) ) ;
581
570
self . modules . entry ( self . current_module ) . or_default ( ) . items . insert ( id) ;
582
571
id
583
572
}
584
573
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
+
585
608
fn allocate_hir_id_counter ( & mut self , owner : NodeId ) -> hir:: HirId {
586
609
// Set up the counter if needed.
587
610
self . item_local_id_counters . entry ( owner) . or_insert ( 0 ) ;
0 commit comments