@@ -208,14 +208,23 @@ impl<'a, 'b> MacroExpander<'a, 'b> {
208
208
}
209
209
210
210
fn collect_invocations ( & mut self , expansion : Expansion ) -> ( Expansion , Vec < Invocation > ) {
211
- let expansion = expansion. fold_with ( & mut StripUnconfigured {
212
- config : & self . cx . cfg ,
213
- should_test : self . cx . ecfg . should_test ,
214
- sess : self . cx . parse_sess ,
215
- features : self . cx . ecfg . features ,
216
- } ) ;
217
- let mut collector = InvocationCollector { cx : self . cx , invocations : Vec :: new ( ) } ;
218
- ( expansion. fold_with ( & mut collector) , collector. invocations )
211
+ let crate_config = mem:: replace ( & mut self . cx . cfg , Vec :: new ( ) ) ;
212
+ let result = {
213
+ let mut collector = InvocationCollector {
214
+ cfg : StripUnconfigured {
215
+ config : & crate_config,
216
+ should_test : self . cx . ecfg . should_test ,
217
+ sess : self . cx . parse_sess ,
218
+ features : self . cx . ecfg . features ,
219
+ } ,
220
+ cx : self . cx ,
221
+ invocations : Vec :: new ( ) ,
222
+ } ;
223
+ ( expansion. fold_with ( & mut collector) , collector. invocations )
224
+ } ;
225
+
226
+ self . cx . cfg = crate_config;
227
+ result
219
228
}
220
229
221
230
fn expand_invoc ( & mut self , invoc : Invocation ) -> Expansion {
@@ -403,9 +412,19 @@ impl<'a, 'b> MacroExpander<'a, 'b> {
403
412
404
413
struct InvocationCollector < ' a , ' b : ' a > {
405
414
cx : & ' a mut ExtCtxt < ' b > ,
415
+ cfg : StripUnconfigured < ' a > ,
406
416
invocations : Vec < Invocation > ,
407
417
}
408
418
419
+ macro_rules! fully_configure {
420
+ ( $this: ident, $node: ident, $noop_fold: ident) => {
421
+ match $noop_fold( $node, & mut $this. cfg) . pop( ) {
422
+ Some ( node) => node,
423
+ None => return SmallVector :: zero( ) ,
424
+ }
425
+ }
426
+ }
427
+
409
428
impl < ' a , ' b > InvocationCollector < ' a , ' b > {
410
429
fn collect ( & mut self , expansion_kind : ExpansionKind , kind : InvocationKind ) -> Expansion {
411
430
let mark = Mark :: fresh ( ) ;
@@ -475,11 +494,17 @@ impl<'a, 'b> InvocationCollector<'a, 'b> {
475
494
}
476
495
false
477
496
}
497
+
498
+ fn configure < T : HasAttrs > ( & mut self , node : T ) -> Option < T > {
499
+ self . cfg . configure ( node)
500
+ }
478
501
}
479
502
480
503
impl < ' a , ' b > Folder for InvocationCollector < ' a , ' b > {
481
504
fn fold_expr ( & mut self , expr : P < ast:: Expr > ) -> P < ast:: Expr > {
482
- let expr = expr. unwrap ( ) ;
505
+ let mut expr = self . cfg . configure_expr ( expr) . unwrap ( ) ;
506
+ expr. node = self . cfg . configure_expr_kind ( expr. node ) ;
507
+
483
508
if let ast:: ExprKind :: Mac ( mac) = expr. node {
484
509
self . collect_bang ( mac, expr. attrs . into ( ) , expr. span , ExpansionKind :: Expr ) . make_expr ( )
485
510
} else {
@@ -488,7 +513,9 @@ impl<'a, 'b> Folder for InvocationCollector<'a, 'b> {
488
513
}
489
514
490
515
fn fold_opt_expr ( & mut self , expr : P < ast:: Expr > ) -> Option < P < ast:: Expr > > {
491
- let expr = expr. unwrap ( ) ;
516
+ let mut expr = configure ! ( self , expr) . unwrap ( ) ;
517
+ expr. node = self . cfg . configure_expr_kind ( expr. node ) ;
518
+
492
519
if let ast:: ExprKind :: Mac ( mac) = expr. node {
493
520
self . collect_bang ( mac, expr. attrs . into ( ) , expr. span , ExpansionKind :: OptExpr )
494
521
. make_opt_expr ( )
@@ -511,6 +538,11 @@ impl<'a, 'b> Folder for InvocationCollector<'a, 'b> {
511
538
}
512
539
513
540
fn fold_stmt ( & mut self , stmt : ast:: Stmt ) -> SmallVector < ast:: Stmt > {
541
+ let stmt = match self . cfg . configure_stmt ( stmt) {
542
+ Some ( stmt) => stmt,
543
+ None => return SmallVector :: zero ( ) ,
544
+ } ;
545
+
514
546
let ( mac, style, attrs) = match stmt. node {
515
547
StmtKind :: Mac ( mac) => mac. unwrap ( ) ,
516
548
_ => return noop_fold_stmt ( stmt, self ) ,
@@ -540,9 +572,11 @@ impl<'a, 'b> Folder for InvocationCollector<'a, 'b> {
540
572
}
541
573
542
574
fn fold_item ( & mut self , item : P < ast:: Item > ) -> SmallVector < P < ast:: Item > > {
575
+ let item = configure ! ( self , item) ;
576
+
543
577
let ( item, attr) = self . classify_item ( item) ;
544
578
if let Some ( attr) = attr {
545
- let item = Annotatable :: Item ( item) ;
579
+ let item = Annotatable :: Item ( fully_configure ! ( self , item, noop_fold_item ) ) ;
546
580
return self . collect_attr ( attr, item, ExpansionKind :: Items ) . make_items ( ) ;
547
581
}
548
582
@@ -610,9 +644,12 @@ impl<'a, 'b> Folder for InvocationCollector<'a, 'b> {
610
644
}
611
645
612
646
fn fold_trait_item ( & mut self , item : ast:: TraitItem ) -> SmallVector < ast:: TraitItem > {
647
+ let item = configure ! ( self , item) ;
648
+
613
649
let ( item, attr) = self . classify_item ( item) ;
614
650
if let Some ( attr) = attr {
615
- let item = Annotatable :: TraitItem ( P ( item) ) ;
651
+ let item =
652
+ Annotatable :: TraitItem ( P ( fully_configure ! ( self , item, noop_fold_trait_item) ) ) ;
616
653
return self . collect_attr ( attr, item, ExpansionKind :: TraitItems ) . make_trait_items ( )
617
654
}
618
655
@@ -626,9 +663,11 @@ impl<'a, 'b> Folder for InvocationCollector<'a, 'b> {
626
663
}
627
664
628
665
fn fold_impl_item ( & mut self , item : ast:: ImplItem ) -> SmallVector < ast:: ImplItem > {
666
+ let item = configure ! ( self , item) ;
667
+
629
668
let ( item, attr) = self . classify_item ( item) ;
630
669
if let Some ( attr) = attr {
631
- let item = Annotatable :: ImplItem ( P ( item) ) ;
670
+ let item = Annotatable :: ImplItem ( P ( fully_configure ! ( self , item, noop_fold_impl_item ) ) ) ;
632
671
return self . collect_attr ( attr, item, ExpansionKind :: ImplItems ) . make_impl_items ( ) ;
633
672
}
634
673
@@ -653,6 +692,14 @@ impl<'a, 'b> Folder for InvocationCollector<'a, 'b> {
653
692
_ => unreachable ! ( ) ,
654
693
}
655
694
}
695
+
696
+ fn fold_foreign_mod ( & mut self , foreign_mod : ast:: ForeignMod ) -> ast:: ForeignMod {
697
+ noop_fold_foreign_mod ( self . cfg . configure_foreign_mod ( foreign_mod) , self )
698
+ }
699
+
700
+ fn fold_item_kind ( & mut self , item : ast:: ItemKind ) -> ast:: ItemKind {
701
+ noop_fold_item_kind ( self . cfg . configure_item_kind ( item) , self )
702
+ }
656
703
}
657
704
658
705
pub struct ExpansionConfig < ' feat > {
0 commit comments