@@ -691,7 +691,7 @@ impl<'a> Folder for PatIdentRenamer<'a> {
691
691
}
692
692
693
693
fn expand_multi_modified ( a : Annotatable , fld : & mut MacroExpander ) -> SmallVector < Annotatable > {
694
- let new_items : SmallVector < Annotatable > = match a {
694
+ match a {
695
695
Annotatable :: Item ( it) => match it. node {
696
696
ast:: ItemKind :: Mac ( ..) => {
697
697
it. and_then ( |it| match it. node {
@@ -728,63 +728,6 @@ fn expand_multi_modified(a: Annotatable, fld: &mut MacroExpander) -> SmallVector
728
728
expand_impl_item ( ii. unwrap ( ) , fld) . into_iter ( ) .
729
729
map ( |ii| Annotatable :: ImplItem ( P ( ii) ) ) . collect ( )
730
730
}
731
- } ;
732
-
733
- new_items. into_iter ( ) . flat_map ( |a| decorate ( a, fld) ) . collect ( )
734
- }
735
-
736
- fn decorate ( a : Annotatable , fld : & mut MacroExpander ) -> SmallVector < Annotatable > {
737
- let mut decorator_items = SmallVector :: zero ( ) ;
738
- let mut new_attrs = Vec :: new ( ) ;
739
- expand_decorators ( a. clone ( ) , fld, & mut decorator_items, & mut new_attrs) ;
740
-
741
- let mut new_items = SmallVector :: one ( a. fold_attrs ( new_attrs) ) ;
742
- new_items. push_all ( decorator_items) ;
743
- new_items
744
- }
745
-
746
- fn expand_decorators ( a : Annotatable ,
747
- fld : & mut MacroExpander ,
748
- decorator_items : & mut SmallVector < Annotatable > ,
749
- new_attrs : & mut Vec < ast:: Attribute > )
750
- {
751
- for attr in a. attrs ( ) {
752
- let mname = intern ( & attr. name ( ) ) ;
753
- match fld. cx . syntax_env . find ( mname) {
754
- Some ( rc) => match * rc {
755
- MultiDecorator ( ref dec) => {
756
- attr:: mark_used ( & attr) ;
757
-
758
- fld. cx . bt_push ( ExpnInfo {
759
- call_site : attr. span ,
760
- callee : NameAndSpan {
761
- format : MacroAttribute ( mname) ,
762
- span : Some ( attr. span ) ,
763
- // attributes can do whatever they like,
764
- // for now.
765
- allow_internal_unstable : true ,
766
- }
767
- } ) ;
768
-
769
- let mut items: SmallVector < Annotatable > = SmallVector :: zero ( ) ;
770
- dec. expand ( fld. cx ,
771
- attr. span ,
772
- & attr. node . value ,
773
- & a,
774
- & mut |ann| items. push ( ann) ) ;
775
-
776
- for item in items {
777
- for configured_item in item. fold_with ( & mut fld. strip_unconfigured ( ) ) {
778
- decorator_items. extend ( expand_annotatable ( configured_item, fld) ) ;
779
- }
780
- }
781
-
782
- fld. cx . bt_pop ( ) ;
783
- }
784
- _ => new_attrs. push ( ( * attr) . clone ( ) ) ,
785
- } ,
786
- _ => new_attrs. push ( ( * attr) . clone ( ) ) ,
787
- }
788
731
}
789
732
}
790
733
@@ -793,9 +736,12 @@ fn expand_annotatable(mut item: Annotatable, fld: &mut MacroExpander) -> SmallVe
793
736
item = item. map_attrs ( |mut attrs| {
794
737
for i in 0 ..attrs. len ( ) {
795
738
if let Some ( extension) = fld. cx . syntax_env . find ( intern ( & attrs[ i] . name ( ) ) ) {
796
- if let MultiModifier ( ..) = * extension {
797
- multi_modifier = Some ( ( attrs. remove ( i) , extension) ) ;
798
- break ;
739
+ match * extension {
740
+ MultiModifier ( ..) | MultiDecorator ( ..) => {
741
+ multi_modifier = Some ( ( attrs. remove ( i) , extension) ) ;
742
+ break ;
743
+ }
744
+ _ => { }
799
745
}
800
746
}
801
747
}
@@ -804,23 +750,32 @@ fn expand_annotatable(mut item: Annotatable, fld: &mut MacroExpander) -> SmallVe
804
750
805
751
match multi_modifier {
806
752
None => expand_multi_modified ( item, fld) ,
807
- Some ( ( attr, extension) ) => match * extension {
808
- MultiModifier ( ref mac) => {
809
- attr:: mark_used ( & attr) ;
810
- fld. cx . bt_push ( ExpnInfo {
811
- call_site : attr. span ,
812
- callee : NameAndSpan {
813
- format : MacroAttribute ( intern ( & attr. name ( ) ) ) ,
814
- span : Some ( attr. span ) ,
815
- // attributes can do whatever they like, for now
816
- allow_internal_unstable : true ,
817
- }
818
- } ) ;
819
- let modified = mac. expand ( fld. cx , attr. span , & attr. node . value , item) ;
820
- fld. cx . bt_pop ( ) ;
821
- modified. into_iter ( ) . flat_map ( |it| expand_annotatable ( it, fld) ) . collect ( )
822
- }
823
- _ => unreachable ! ( ) ,
753
+ Some ( ( attr, extension) ) => {
754
+ attr:: mark_used ( & attr) ;
755
+ fld. cx . bt_push ( ExpnInfo {
756
+ call_site : attr. span ,
757
+ callee : NameAndSpan {
758
+ format : MacroAttribute ( intern ( & attr. name ( ) ) ) ,
759
+ span : Some ( attr. span ) ,
760
+ // attributes can do whatever they like, for now
761
+ allow_internal_unstable : true ,
762
+ }
763
+ } ) ;
764
+
765
+ let modified = match * extension {
766
+ MultiModifier ( ref mac) => mac. expand ( fld. cx , attr. span , & attr. node . value , item) ,
767
+ MultiDecorator ( ref mac) => {
768
+ let mut items = Vec :: new ( ) ;
769
+ mac. expand ( fld. cx , attr. span , & attr. node . value , & item,
770
+ & mut |item| items. push ( item) ) ;
771
+ items. push ( item) ;
772
+ items
773
+ }
774
+ _ => unreachable ! ( ) ,
775
+ } ;
776
+
777
+ fld. cx . bt_pop ( ) ;
778
+ modified. into_iter ( ) . flat_map ( |it| expand_annotatable ( it, fld) ) . collect ( )
824
779
}
825
780
}
826
781
}
0 commit comments