13
13
//! Here we build the "reduced graph": the graph of the module tree without
14
14
//! any imports resolved.
15
15
16
- use macros;
16
+ use macros:: { InvocationData , LegacyImports , LegacyScope } ;
17
17
use resolve_imports:: ImportDirectiveSubclass :: { self , GlobImport } ;
18
18
use { Module , ModuleS , ModuleKind } ;
19
19
use Namespace :: { self , TypeNS , ValueNS } ;
@@ -84,7 +84,7 @@ impl<'b> Resolver<'b> {
84
84
}
85
85
86
86
/// Constructs the reduced graph for one item.
87
- fn build_reduced_graph_for_item ( & mut self , item : & Item , expansion : Mark ) {
87
+ fn build_reduced_graph_for_item ( & mut self , item : & Item , legacy_imports : & mut LegacyImports ) {
88
88
let parent = self . current_module ;
89
89
let name = item. ident . name ;
90
90
let sp = item. span ;
@@ -200,16 +200,9 @@ impl<'b> Resolver<'b> {
200
200
LoadedMacroKind :: Def ( mut def) => {
201
201
let name = def. ident . name ;
202
202
if def. use_locally {
203
- let ext = macro_rules:: compile ( & self . session . parse_sess , & def) ;
204
- let shadowing =
205
- self . resolve_macro_name ( Mark :: root ( ) , name, false ) . is_some ( ) ;
206
- self . invocations [ & Mark :: root ( ) ] . module . get ( ) . macros . borrow_mut ( )
207
- . insert ( name, macros:: NameBinding {
208
- ext : Rc :: new ( ext) ,
209
- expansion : expansion,
210
- shadowing : shadowing,
211
- span : loaded_macro. import_site ,
212
- } ) ;
203
+ let ext =
204
+ Rc :: new ( macro_rules:: compile ( & self . session . parse_sess , & def) ) ;
205
+ legacy_imports. insert ( name, ( ext, loaded_macro. import_site ) ) ;
213
206
self . macro_names . insert ( name) ;
214
207
}
215
208
if def. export {
@@ -250,7 +243,6 @@ impl<'b> Resolver<'b> {
250
243
attr:: contains_name ( & item. attrs , "no_implicit_prelude" )
251
244
} ,
252
245
normal_ancestor_id : Some ( item. id ) ,
253
- macros_escape : self . contains_macro_use ( & item. attrs ) ,
254
246
..ModuleS :: new ( Some ( parent) , ModuleKind :: Def ( def, name) )
255
247
} ) ;
256
248
self . define ( parent, name, TypeNS , ( module, sp, vis) ) ;
@@ -520,45 +512,62 @@ impl<'b> Resolver<'b> {
520
512
521
513
pub struct BuildReducedGraphVisitor < ' a , ' b : ' a > {
522
514
pub resolver : & ' a mut Resolver < ' b > ,
523
- pub expansion : Mark ,
515
+ pub legacy_scope : LegacyScope < ' b > ,
516
+ pub legacy_imports : LegacyImports ,
524
517
}
525
518
526
519
impl < ' a , ' b > BuildReducedGraphVisitor < ' a , ' b > {
527
- fn visit_invoc ( & mut self , id : ast:: NodeId ) {
528
- let mark = Mark :: from_placeholder_id ( id) ;
529
- self . resolver . invocations [ & mark] . module . set ( self . resolver . current_module ) ;
520
+ fn visit_invoc ( & mut self , id : ast:: NodeId ) -> & ' b InvocationData < ' b > {
521
+ let invocation = self . resolver . invocations [ & Mark :: from_placeholder_id ( id) ] ;
522
+ invocation. module . set ( self . resolver . current_module ) ;
523
+ invocation. legacy_scope . set ( self . legacy_scope ) ;
524
+ invocation
530
525
}
531
526
}
532
527
533
528
macro_rules! method {
534
529
( $visit: ident: $ty: ty, $invoc: path, $walk: ident) => {
535
530
fn $visit( & mut self , node: & $ty) {
536
- match node. node {
537
- $invoc( ..) => self . visit_invoc( node. id) ,
538
- _ => visit:: $walk( self , node) ,
531
+ if let $invoc( ..) = node. node {
532
+ self . visit_invoc( node. id) ;
533
+ } else {
534
+ visit:: $walk( self , node) ;
539
535
}
540
536
}
541
537
}
542
538
}
543
539
544
540
impl < ' a , ' b > Visitor for BuildReducedGraphVisitor < ' a , ' b > {
545
541
method ! ( visit_impl_item: ast:: ImplItem , ast:: ImplItemKind :: Macro , walk_impl_item) ;
546
- method ! ( visit_stmt: ast:: Stmt , ast:: StmtKind :: Mac , walk_stmt) ;
547
542
method ! ( visit_expr: ast:: Expr , ast:: ExprKind :: Mac , walk_expr) ;
548
543
method ! ( visit_pat: ast:: Pat , ast:: PatKind :: Mac , walk_pat) ;
549
544
method ! ( visit_ty: ast:: Ty , ast:: TyKind :: Mac , walk_ty) ;
550
545
551
546
fn visit_item ( & mut self , item : & Item ) {
552
- match item. node {
547
+ let macro_use = match item. node {
553
548
ItemKind :: Mac ( ..) if item. id == ast:: DUMMY_NODE_ID => return , // Scope placeholder
554
- ItemKind :: Mac ( ..) => return self . visit_invoc ( item. id ) ,
555
- _ => { }
556
- }
549
+ ItemKind :: Mac ( ..) => {
550
+ return self . legacy_scope = LegacyScope :: Expansion ( self . visit_invoc ( item. id ) ) ;
551
+ }
552
+ ItemKind :: Mod ( ..) => self . resolver . contains_macro_use ( & item. attrs ) ,
553
+ _ => false ,
554
+ } ;
557
555
558
- let parent = self . resolver . current_module ;
559
- self . resolver . build_reduced_graph_for_item ( item, self . expansion ) ;
556
+ let ( parent, legacy_scope ) = ( self . resolver . current_module , self . legacy_scope ) ;
557
+ self . resolver . build_reduced_graph_for_item ( item, & mut self . legacy_imports ) ;
560
558
visit:: walk_item ( self , item) ;
561
559
self . resolver . current_module = parent;
560
+ if !macro_use {
561
+ self . legacy_scope = legacy_scope;
562
+ }
563
+ }
564
+
565
+ fn visit_stmt ( & mut self , stmt : & ast:: Stmt ) {
566
+ if let ast:: StmtKind :: Mac ( ..) = stmt. node {
567
+ self . legacy_scope = LegacyScope :: Expansion ( self . visit_invoc ( stmt. id ) ) ;
568
+ } else {
569
+ visit:: walk_stmt ( self , stmt) ;
570
+ }
562
571
}
563
572
564
573
fn visit_foreign_item ( & mut self , foreign_item : & ForeignItem ) {
@@ -567,18 +576,20 @@ impl<'a, 'b> Visitor for BuildReducedGraphVisitor<'a, 'b> {
567
576
}
568
577
569
578
fn visit_block ( & mut self , block : & Block ) {
570
- let parent = self . resolver . current_module ;
579
+ let ( parent, legacy_scope ) = ( self . resolver . current_module , self . legacy_scope ) ;
571
580
self . resolver . build_reduced_graph_for_block ( block) ;
572
581
visit:: walk_block ( self , block) ;
573
582
self . resolver . current_module = parent;
583
+ self . legacy_scope = legacy_scope;
574
584
}
575
585
576
586
fn visit_trait_item ( & mut self , item : & TraitItem ) {
577
587
let parent = self . resolver . current_module ;
578
588
let def_id = parent. def_id ( ) . unwrap ( ) ;
579
589
580
590
if let TraitItemKind :: Macro ( _) = item. node {
581
- return self . visit_invoc ( item. id ) ;
591
+ self . visit_invoc ( item. id ) ;
592
+ return
582
593
}
583
594
584
595
// Add the item to the trait info.
0 commit comments