@@ -48,7 +48,7 @@ use session::config::nightly_options;
48
48
use util:: common:: FN_OUTPUT_NAME ;
49
49
use util:: nodemap:: { DefIdMap , NodeMap } ;
50
50
51
- use std:: collections:: BTreeMap ;
51
+ use std:: collections:: { BTreeSet , BTreeMap } ;
52
52
use std:: fmt:: Debug ;
53
53
use std:: mem;
54
54
use smallvec:: SmallVec ;
@@ -90,6 +90,8 @@ pub struct LoweringContext<'a> {
90
90
trait_impls : BTreeMap < DefId , Vec < NodeId > > ,
91
91
trait_auto_impl : BTreeMap < DefId , NodeId > ,
92
92
93
+ modules : BTreeMap < NodeId , hir:: ModuleItems > ,
94
+
93
95
is_generator : bool ,
94
96
95
97
catch_scopes : Vec < NodeId > ,
@@ -124,6 +126,8 @@ pub struct LoweringContext<'a> {
124
126
// needs to be created for it.
125
127
in_scope_lifetimes : Vec < Ident > ,
126
128
129
+ current_module : NodeId ,
130
+
127
131
type_def_lifetime_params : DefIdMap < usize > ,
128
132
129
133
current_hir_id_owner : Vec < ( DefIndex , u32 ) > ,
@@ -228,12 +232,14 @@ pub fn lower_crate(
228
232
bodies : BTreeMap :: new ( ) ,
229
233
trait_impls : BTreeMap :: new ( ) ,
230
234
trait_auto_impl : BTreeMap :: new ( ) ,
235
+ modules : BTreeMap :: new ( ) ,
231
236
exported_macros : Vec :: new ( ) ,
232
237
catch_scopes : Vec :: new ( ) ,
233
238
loop_scopes : Vec :: new ( ) ,
234
239
is_in_loop_condition : false ,
235
240
anonymous_lifetime_mode : AnonymousLifetimeMode :: PassThrough ,
236
241
type_def_lifetime_params : Default :: default ( ) ,
242
+ current_module : CRATE_NODE_ID ,
237
243
current_hir_id_owner : vec ! [ ( CRATE_DEF_INDEX , 0 ) ] ,
238
244
item_local_id_counters : Default :: default ( ) ,
239
245
node_id_to_hir_id : IndexVec :: new ( ) ,
@@ -414,11 +420,24 @@ impl<'a> LoweringContext<'a> {
414
420
}
415
421
416
422
impl < ' lcx , ' interner > Visitor < ' lcx > for ItemLowerer < ' lcx , ' interner > {
423
+ fn visit_mod ( & mut self , m : & ' lcx Mod , _s : Span , _attrs : & [ Attribute ] , n : NodeId ) {
424
+ self . lctx . modules . insert ( n, hir:: ModuleItems {
425
+ items : BTreeSet :: new ( ) ,
426
+ trait_items : BTreeSet :: new ( ) ,
427
+ impl_items : BTreeSet :: new ( ) ,
428
+ } ) ;
429
+
430
+ let old = self . lctx . current_module ;
431
+ self . lctx . current_module = n;
432
+ visit:: walk_mod ( self , m) ;
433
+ self . lctx . current_module = old;
434
+ }
435
+
417
436
fn visit_item ( & mut self , item : & ' lcx Item ) {
418
437
let mut item_lowered = true ;
419
438
self . lctx . with_hir_id_owner ( item. id , |lctx| {
420
439
if let Some ( hir_item) = lctx. lower_item ( item) {
421
- lctx. items . insert ( item. id , hir_item) ;
440
+ lctx. insert_item ( item. id , hir_item) ;
422
441
} else {
423
442
item_lowered = false ;
424
443
}
@@ -451,6 +470,7 @@ impl<'a> LoweringContext<'a> {
451
470
let id = hir:: TraitItemId { node_id : item. id } ;
452
471
let hir_item = lctx. lower_trait_item ( item) ;
453
472
lctx. trait_items . insert ( id, hir_item) ;
473
+ lctx. modules . get_mut ( & lctx. current_module ) . unwrap ( ) . trait_items . insert ( id) ;
454
474
} ) ;
455
475
456
476
visit:: walk_trait_item ( self , item) ;
@@ -461,6 +481,7 @@ impl<'a> LoweringContext<'a> {
461
481
let id = hir:: ImplItemId { node_id : item. id } ;
462
482
let hir_item = lctx. lower_impl_item ( item) ;
463
483
lctx. impl_items . insert ( id, hir_item) ;
484
+ lctx. modules . get_mut ( & lctx. current_module ) . unwrap ( ) . impl_items . insert ( id) ;
464
485
} ) ;
465
486
visit:: walk_impl_item ( self , item) ;
466
487
}
@@ -492,9 +513,15 @@ impl<'a> LoweringContext<'a> {
492
513
body_ids,
493
514
trait_impls : self . trait_impls ,
494
515
trait_auto_impl : self . trait_auto_impl ,
516
+ modules : self . modules ,
495
517
}
496
518
}
497
519
520
+ fn insert_item ( & mut self , id : NodeId , item : hir:: Item ) {
521
+ self . items . insert ( id, item) ;
522
+ self . modules . get_mut ( & self . current_module ) . unwrap ( ) . items . insert ( id) ;
523
+ }
524
+
498
525
fn allocate_hir_id_counter < T : Debug > ( & mut self , owner : NodeId , debug : & T ) -> LoweredNodeId {
499
526
if self . item_local_id_counters . insert ( owner, 0 ) . is_some ( ) {
500
527
bug ! (
@@ -1370,7 +1397,7 @@ impl<'a> LoweringContext<'a> {
1370
1397
// Insert the item into the global list. This usually happens
1371
1398
// automatically for all AST items. But this existential type item
1372
1399
// does not actually exist in the AST.
1373
- lctx. items . insert ( exist_ty_id. node_id , exist_ty_item) ;
1400
+ lctx. insert_item ( exist_ty_id. node_id , exist_ty_item) ;
1374
1401
1375
1402
// `impl Trait` now just becomes `Foo<'a, 'b, ..>`.
1376
1403
hir:: TyKind :: Def ( hir:: ItemId { id : exist_ty_id. node_id } , lifetimes)
@@ -3026,7 +3053,7 @@ impl<'a> LoweringContext<'a> {
3026
3053
} ;
3027
3054
let vis = respan ( vis. span , vis_kind) ;
3028
3055
3029
- this. items . insert (
3056
+ this. insert_item (
3030
3057
new_id. node_id ,
3031
3058
hir:: Item {
3032
3059
id : new_id. node_id ,
@@ -3133,7 +3160,7 @@ impl<'a> LoweringContext<'a> {
3133
3160
} ;
3134
3161
let vis = respan ( vis. span , vis_kind) ;
3135
3162
3136
- this. items . insert (
3163
+ this. insert_item (
3137
3164
new_id,
3138
3165
hir:: Item {
3139
3166
id : new_id,
0 commit comments