@@ -23,7 +23,7 @@ use {resolve_error, resolve_struct_error, ResolutionError};
23
23
24
24
use rustc:: middle:: cstore:: LoadedMacro ;
25
25
use rustc:: hir:: def:: * ;
26
- use rustc:: hir:: def_id:: { CrateNum , BUILTIN_MACROS_CRATE , CRATE_DEF_INDEX , DefId } ;
26
+ use rustc:: hir:: def_id:: { BUILTIN_MACROS_CRATE , CRATE_DEF_INDEX , LOCAL_CRATE , DefId } ;
27
27
use rustc:: ty;
28
28
29
29
use std:: cell:: Cell ;
@@ -150,7 +150,7 @@ impl<'a> Resolver<'a> {
150
150
view_path. span ,
151
151
ResolutionError :: SelfImportsOnlyAllowedWithin ) ;
152
152
} else if source_name == "$crate" && full_path. segments . len ( ) == 1 {
153
- let crate_root = self . resolve_crate_var ( source. ctxt , item . span ) ;
153
+ let crate_root = self . resolve_crate_root ( source. ctxt ) ;
154
154
let crate_name = match crate_root. kind {
155
155
ModuleKind :: Def ( _, name) => name,
156
156
ModuleKind :: Block ( ..) => unreachable ! ( ) ,
@@ -247,7 +247,8 @@ impl<'a> Resolver<'a> {
247
247
248
248
// n.b. we don't need to look at the path option here, because cstore already did
249
249
let crate_id = self . session . cstore . extern_mod_stmt_cnum ( item. id ) . unwrap ( ) ;
250
- let module = self . get_extern_crate_root ( crate_id, item. span ) ;
250
+ let module =
251
+ self . get_module ( DefId { krate : crate_id, index : CRATE_DEF_INDEX } ) ;
251
252
self . populate_module_if_necessary ( module) ;
252
253
let used = self . process_legacy_macro_imports ( item, module, expansion) ;
253
254
let binding =
@@ -279,7 +280,7 @@ impl<'a> Resolver<'a> {
279
280
no_implicit_prelude : parent. no_implicit_prelude || {
280
281
attr:: contains_name ( & item. attrs , "no_implicit_prelude" )
281
282
} ,
282
- ..ModuleData :: new ( Some ( parent) , module_kind, def_id, item. span )
283
+ ..ModuleData :: new ( Some ( parent) , module_kind, def_id, expansion , item. span )
283
284
} ) ;
284
285
self . define ( parent, ident, TypeNS , ( module, vis, sp, expansion) ) ;
285
286
self . module_map . insert ( def_id, module) ;
@@ -317,6 +318,7 @@ impl<'a> Resolver<'a> {
317
318
let module = self . new_module ( parent,
318
319
module_kind,
319
320
parent. normal_ancestor_id ,
321
+ expansion,
320
322
item. span ) ;
321
323
self . define ( parent, ident, TypeNS , ( module, vis, sp, expansion) ) ;
322
324
@@ -376,6 +378,7 @@ impl<'a> Resolver<'a> {
376
378
let module = self . new_module ( parent,
377
379
module_kind,
378
380
parent. normal_ancestor_id ,
381
+ expansion,
379
382
item. span ) ;
380
383
self . define ( parent, ident, TypeNS , ( module, vis, sp, expansion) ) ;
381
384
self . current_module = module;
@@ -421,12 +424,13 @@ impl<'a> Resolver<'a> {
421
424
self . define ( parent, item. ident , ValueNS , ( def, vis, item. span , expansion) ) ;
422
425
}
423
426
424
- fn build_reduced_graph_for_block ( & mut self , block : & Block ) {
427
+ fn build_reduced_graph_for_block ( & mut self , block : & Block , expansion : Mark ) {
425
428
let parent = self . current_module ;
426
429
if self . block_needs_anonymous_module ( block) {
427
430
let module = self . new_module ( parent,
428
431
ModuleKind :: Block ( block. id ) ,
429
432
parent. normal_ancestor_id ,
433
+ expansion,
430
434
block. span ) ;
431
435
self . block_map . insert ( block. id , module) ;
432
436
self . current_module = module; // Descend into the block.
@@ -440,23 +444,24 @@ impl<'a> Resolver<'a> {
440
444
let def_id = def. def_id ( ) ;
441
445
let vis = self . session . cstore . visibility ( def_id) ;
442
446
let span = child. span ;
443
-
447
+ let expansion = Mark :: root ( ) ; // FIXME(jseyfried) intercrate hygiene
444
448
match def {
445
449
Def :: Mod ( ..) | Def :: Enum ( ..) => {
446
450
let module = self . new_module ( parent,
447
451
ModuleKind :: Def ( def, ident. name ) ,
448
452
def_id,
453
+ expansion,
449
454
span) ;
450
- self . define ( parent, ident, TypeNS , ( module, vis, DUMMY_SP , Mark :: root ( ) ) ) ;
455
+ self . define ( parent, ident, TypeNS , ( module, vis, DUMMY_SP , expansion ) ) ;
451
456
}
452
457
Def :: Variant ( ..) | Def :: TyAlias ( ..) => {
453
- self . define ( parent, ident, TypeNS , ( def, vis, DUMMY_SP , Mark :: root ( ) ) ) ;
458
+ self . define ( parent, ident, TypeNS , ( def, vis, DUMMY_SP , expansion ) ) ;
454
459
}
455
460
Def :: Fn ( ..) | Def :: Static ( ..) | Def :: Const ( ..) | Def :: VariantCtor ( ..) => {
456
- self . define ( parent, ident, ValueNS , ( def, vis, DUMMY_SP , Mark :: root ( ) ) ) ;
461
+ self . define ( parent, ident, ValueNS , ( def, vis, DUMMY_SP , expansion ) ) ;
457
462
}
458
463
Def :: StructCtor ( ..) => {
459
- self . define ( parent, ident, ValueNS , ( def, vis, DUMMY_SP , Mark :: root ( ) ) ) ;
464
+ self . define ( parent, ident, ValueNS , ( def, vis, DUMMY_SP , expansion ) ) ;
460
465
461
466
if let Some ( struct_def_id) =
462
467
self . session . cstore . def_key ( def_id) . parent
@@ -469,14 +474,15 @@ impl<'a> Resolver<'a> {
469
474
let module = self . new_module ( parent,
470
475
module_kind,
471
476
parent. normal_ancestor_id ,
477
+ expansion,
472
478
span) ;
473
- self . define ( parent, ident, TypeNS , ( module, vis, DUMMY_SP , Mark :: root ( ) ) ) ;
479
+ self . define ( parent, ident, TypeNS , ( module, vis, DUMMY_SP , expansion ) ) ;
474
480
475
481
for child in self . session . cstore . item_children ( def_id) {
476
482
let ns = if let Def :: AssociatedTy ( ..) = child. def { TypeNS } else { ValueNS } ;
477
483
let ident = Ident :: with_empty_ctxt ( child. name ) ;
478
484
self . define ( module, ident, ns, ( child. def , ty:: Visibility :: Public ,
479
- DUMMY_SP , Mark :: root ( ) ) ) ;
485
+ DUMMY_SP , expansion ) ) ;
480
486
481
487
if self . session . cstore . associated_item_cloned ( child. def . def_id ( ) )
482
488
. method_has_self_argument {
@@ -486,31 +492,42 @@ impl<'a> Resolver<'a> {
486
492
module. populated . set ( true ) ;
487
493
}
488
494
Def :: Struct ( ..) | Def :: Union ( ..) => {
489
- self . define ( parent, ident, TypeNS , ( def, vis, DUMMY_SP , Mark :: root ( ) ) ) ;
495
+ self . define ( parent, ident, TypeNS , ( def, vis, DUMMY_SP , expansion ) ) ;
490
496
491
497
// Record field names for error reporting.
492
498
let field_names = self . session . cstore . struct_field_names ( def_id) ;
493
499
self . insert_field_names ( def_id, field_names) ;
494
500
}
495
501
Def :: Macro ( ..) => {
496
- self . define ( parent, ident, MacroNS , ( def, vis, DUMMY_SP , Mark :: root ( ) ) ) ;
502
+ self . define ( parent, ident, MacroNS , ( def, vis, DUMMY_SP , expansion ) ) ;
497
503
}
498
504
_ => bug ! ( "unexpected definition: {:?}" , def)
499
505
}
500
506
}
501
507
502
- fn get_extern_crate_root ( & mut self , cnum : CrateNum , span : Span ) -> Module < ' a > {
503
- let def_id = DefId { krate : cnum, index : CRATE_DEF_INDEX } ;
504
- let name = self . session . cstore . crate_name ( cnum) ;
505
- let macros_only = self . session . cstore . dep_kind ( cnum) . macros_only ( ) ;
506
- let module_kind = ModuleKind :: Def ( Def :: Mod ( def_id) , name) ;
507
- let arenas = self . arenas ;
508
- * self . extern_crate_roots . entry ( ( cnum, macros_only) ) . or_insert_with ( || {
509
- arenas. alloc_module ( ModuleData :: new ( None , module_kind, def_id, span) )
510
- } )
508
+ pub fn get_module ( & mut self , def_id : DefId ) -> Module < ' a > {
509
+ if def_id. krate == LOCAL_CRATE {
510
+ return self . module_map [ & def_id]
511
+ }
512
+
513
+ let macros_only = self . session . cstore . dep_kind ( def_id. krate ) . macros_only ( ) ;
514
+ if let Some ( & module) = self . extern_module_map . get ( & ( def_id, macros_only) ) {
515
+ return module;
516
+ }
517
+
518
+ let ( name, parent) = if def_id. index == CRATE_DEF_INDEX {
519
+ ( self . session . cstore . crate_name ( def_id. krate ) , None )
520
+ } else {
521
+ let def_key = self . session . cstore . def_key ( def_id) ;
522
+ ( def_key. disambiguated_data . data . get_opt_name ( ) . unwrap ( ) ,
523
+ Some ( self . get_module ( DefId { index : def_key. parent . unwrap ( ) , ..def_id } ) ) )
524
+ } ;
525
+
526
+ let kind = ModuleKind :: Def ( Def :: Mod ( def_id) , name) ;
527
+ self . arenas . alloc_module ( ModuleData :: new ( parent, kind, def_id, Mark :: root ( ) , DUMMY_SP ) )
511
528
}
512
529
513
- pub fn macro_def_scope ( & mut self , expansion : Mark , span : Span ) -> Module < ' a > {
530
+ pub fn macro_def_scope ( & mut self , expansion : Mark ) -> Module < ' a > {
514
531
let def_id = self . macro_defs [ & expansion] ;
515
532
if let Some ( id) = self . definitions . as_local_node_id ( def_id) {
516
533
self . local_macro_def_scopes [ & id]
@@ -519,7 +536,7 @@ impl<'a> Resolver<'a> {
519
536
self . graph_root
520
537
} else {
521
538
let module_def_id = ty:: DefIdTree :: parent ( & * self , def_id) . unwrap ( ) ;
522
- self . get_extern_crate_root ( module_def_id. krate , span )
539
+ self . get_module ( module_def_id)
523
540
}
524
541
}
525
542
@@ -766,7 +783,7 @@ impl<'a, 'b> Visitor<'a> for BuildReducedGraphVisitor<'a, 'b> {
766
783
767
784
fn visit_block ( & mut self , block : & ' a Block ) {
768
785
let ( parent, legacy_scope) = ( self . resolver . current_module , self . legacy_scope ) ;
769
- self . resolver . build_reduced_graph_for_block ( block) ;
786
+ self . resolver . build_reduced_graph_for_block ( block, self . expansion ) ;
770
787
visit:: walk_block ( self , block) ;
771
788
self . resolver . current_module = parent;
772
789
self . legacy_scope = legacy_scope;
0 commit comments