@@ -25,8 +25,6 @@ use parse::token::{intern, keywords};
25
25
use ptr:: P ;
26
26
use tokenstream:: TokenTree ;
27
27
use util:: small_vector:: SmallVector ;
28
- use visit;
29
- use visit:: Visitor ;
30
28
31
29
use std:: collections:: HashMap ;
32
30
use std:: mem;
@@ -35,8 +33,7 @@ use std::rc::Rc;
35
33
36
34
macro_rules! expansions {
37
35
( $( $kind: ident: $ty: ty [ $( $vec: ident, $ty_elt: ty) * ] , $kind_name: expr, . $make: ident,
38
- $( . $fold: ident) * $( lift . $fold_elt: ident) * ,
39
- $( . $visit: ident) * $( lift . $visit_elt: ident) * ; ) * ) => {
36
+ $( . $fold: ident) * $( lift . $fold_elt: ident) * ; ) * ) => {
40
37
#[ derive( Copy , Clone ) ]
41
38
pub enum ExpansionKind { OptExpr , $( $kind, ) * }
42
39
pub enum Expansion { OptExpr ( Option <P <ast:: Expr >>) , $( $kind( $ty) , ) * }
@@ -81,17 +78,6 @@ macro_rules! expansions {
81
78
} , ) * ) *
82
79
}
83
80
}
84
-
85
- fn visit_with<V : Visitor >( & self , visitor: & mut V ) {
86
- match * self {
87
- Expansion :: OptExpr ( Some ( ref expr) ) => visitor. visit_expr( expr) ,
88
- $( $( Expansion :: $kind( ref ast) => visitor. $visit( ast) , ) * ) *
89
- $( $( Expansion :: $kind( ref ast) => for ast in ast. as_slice( ) {
90
- visitor. $visit_elt( ast) ;
91
- } , ) * ) *
92
- _ => { }
93
- }
94
- }
95
81
}
96
82
97
83
impl <' a, ' b> Folder for MacroExpander <' a, ' b> {
@@ -109,17 +95,17 @@ macro_rules! expansions {
109
95
}
110
96
111
97
expansions ! {
112
- Expr : P <ast:: Expr > [ ] , "expression" , . make_expr, . fold_expr, . visit_expr ;
113
- Pat : P <ast:: Pat > [ ] , "pattern" , . make_pat, . fold_pat, . visit_pat ;
114
- Ty : P <ast:: Ty > [ ] , "type" , . make_ty, . fold_ty, . visit_ty ;
98
+ Expr : P <ast:: Expr > [ ] , "expression" , . make_expr, . fold_expr;
99
+ Pat : P <ast:: Pat > [ ] , "pattern" , . make_pat, . fold_pat;
100
+ Ty : P <ast:: Ty > [ ] , "type" , . make_ty, . fold_ty;
115
101
Stmts : SmallVector <ast:: Stmt > [ SmallVector , ast:: Stmt ] ,
116
- "statement" , . make_stmts, lift . fold_stmt, lift . visit_stmt ;
102
+ "statement" , . make_stmts, lift . fold_stmt;
117
103
Items : SmallVector <P <ast:: Item >> [ SmallVector , P <ast:: Item >] ,
118
- "item" , . make_items, lift . fold_item, lift . visit_item ;
104
+ "item" , . make_items, lift . fold_item;
119
105
TraitItems : SmallVector <ast:: TraitItem > [ SmallVector , ast:: TraitItem ] ,
120
- "trait item" , . make_trait_items, lift . fold_trait_item, lift . visit_trait_item ;
106
+ "trait item" , . make_trait_items, lift . fold_trait_item;
121
107
ImplItems : SmallVector <ast:: ImplItem > [ SmallVector , ast:: ImplItem ] ,
122
- "impl item" , . make_impl_items, lift . fold_impl_item, lift . visit_impl_item ;
108
+ "impl item" , . make_impl_items, lift . fold_impl_item;
123
109
}
124
110
125
111
impl ExpansionKind {
@@ -228,50 +214,10 @@ impl<'a, 'b> MacroExpander<'a, 'b> {
228
214
sess : self . cx . parse_sess ,
229
215
features : self . cx . ecfg . features ,
230
216
} ) ;
231
- self . load_macros ( & expansion) ;
232
217
let mut collector = InvocationCollector { cx : self . cx , invocations : Vec :: new ( ) } ;
233
218
( expansion. fold_with ( & mut collector) , collector. invocations )
234
219
}
235
220
236
- fn load_macros ( & mut self , node : & Expansion ) {
237
- struct MacroLoadingVisitor < ' a , ' b : ' a > {
238
- cx : & ' a mut ExtCtxt < ' b > ,
239
- at_crate_root : bool ,
240
- }
241
-
242
- impl < ' a , ' b > Visitor for MacroLoadingVisitor < ' a , ' b > {
243
- fn visit_mac ( & mut self , _: & ast:: Mac ) { }
244
- fn visit_item ( & mut self , item : & ast:: Item ) {
245
- if let ast:: ItemKind :: ExternCrate ( ..) = item. node {
246
- // We need to error on `#[macro_use] extern crate` when it isn't at the
247
- // crate root, because `$crate` won't work properly.
248
- for def in self . cx . loader . load_crate ( item, self . at_crate_root ) {
249
- match def {
250
- LoadedMacro :: Def ( def) => self . cx . insert_macro ( def) ,
251
- LoadedMacro :: CustomDerive ( name, ext) => {
252
- self . cx . insert_custom_derive ( & name, ext, item. span ) ;
253
- }
254
- }
255
- }
256
- } else {
257
- let at_crate_root = :: std:: mem:: replace ( & mut self . at_crate_root , false ) ;
258
- visit:: walk_item ( self , item) ;
259
- self . at_crate_root = at_crate_root;
260
- }
261
- }
262
- fn visit_block ( & mut self , block : & ast:: Block ) {
263
- let at_crate_root = :: std:: mem:: replace ( & mut self . at_crate_root , false ) ;
264
- visit:: walk_block ( self , block) ;
265
- self . at_crate_root = at_crate_root;
266
- }
267
- }
268
-
269
- node. visit_with ( & mut MacroLoadingVisitor {
270
- at_crate_root : self . cx . syntax_env . is_crate_root ( ) ,
271
- cx : self . cx ,
272
- } ) ;
273
- }
274
-
275
221
fn expand_invoc ( & mut self , invoc : Invocation ) -> Expansion {
276
222
match invoc. kind {
277
223
InvocationKind :: Bang { .. } => self . expand_bang_invoc ( invoc) ,
@@ -645,6 +591,20 @@ impl<'a, 'b> Folder for InvocationCollector<'a, 'b> {
645
591
self . cx . syntax_env . current_module = module;
646
592
result
647
593
} ,
594
+ ast:: ItemKind :: ExternCrate ( ..) => {
595
+ // We need to error on `#[macro_use] extern crate` when it isn't at the
596
+ // crate root, because `$crate` won't work properly.
597
+ let is_crate_root = self . cx . syntax_env . is_crate_root ( ) ;
598
+ for def in self . cx . loader . load_crate ( & * item, is_crate_root) {
599
+ match def {
600
+ LoadedMacro :: Def ( def) => self . cx . insert_macro ( def) ,
601
+ LoadedMacro :: CustomDerive ( name, ext) => {
602
+ self . cx . insert_custom_derive ( & name, ext, item. span ) ;
603
+ }
604
+ }
605
+ }
606
+ SmallVector :: one ( item)
607
+ } ,
648
608
_ => noop_fold_item ( item, self ) ,
649
609
}
650
610
}
0 commit comments