@@ -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 ( ) ,
@@ -521,8 +512,11 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
521
512
visit:: walk_crate ( & mut MiscCollector { lctx : & mut self } , c) ;
522
513
visit:: walk_crate ( & mut item:: ItemLowerer { lctx : & mut self } , c) ;
523
514
524
- let module = self . lower_mod ( & c. items , c. span ) ;
515
+ let module = self . arena . alloc ( self . lower_mod ( & c. items , c. span ) ) ;
525
516
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
+
526
520
let body_ids = body_ids ( & self . bodies ) ;
527
521
let proc_macros =
528
522
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> {
557
551
}
558
552
559
553
let krate = hir:: Crate {
560
- item : module,
561
- exported_macros : self . arena . alloc_from_iter ( self . exported_macros ) ,
562
554
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 ,
567
556
bodies : self . bodies ,
568
557
body_ids,
569
558
trait_impls : self . trait_impls ,
@@ -576,12 +565,48 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
576
565
}
577
566
578
567
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) ) ;
581
572
self . modules . entry ( self . current_module ) . or_default ( ) . items . insert ( id) ;
582
573
id
583
574
}
584
575
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
+
585
610
fn allocate_hir_id_counter ( & mut self , owner : NodeId ) -> hir:: HirId {
586
611
// Set up the counter if needed.
587
612
self . item_local_id_counters . entry ( owner) . or_insert ( 0 ) ;
0 commit comments