@@ -13,6 +13,7 @@ use ast::{Local, Ident, Mac_, Name, SpannedIdent};
13
13
use ast:: { MacStmtStyle , Mrk , Stmt , StmtKind , ItemKind } ;
14
14
use ast:: TokenTree ;
15
15
use ast;
16
+ use attr:: HasAttrs ;
16
17
use ext:: mtwt;
17
18
use ext:: build:: AstBuilder ;
18
19
use attr;
@@ -712,11 +713,7 @@ impl<'a> Folder for PatIdentRenamer<'a> {
712
713
}
713
714
}
714
715
715
- fn expand_annotatable ( a : Annotatable ,
716
- fld : & mut MacroExpander )
717
- -> SmallVector < Annotatable > {
718
- let a = expand_item_multi_modifier ( a, fld) ;
719
-
716
+ fn expand_multi_modified ( a : Annotatable , fld : & mut MacroExpander ) -> SmallVector < Annotatable > {
720
717
let new_items: SmallVector < Annotatable > = match a {
721
718
Annotatable :: Item ( it) => match it. node {
722
719
ast:: ItemKind :: Mac ( ..) => {
@@ -795,29 +792,6 @@ fn decorate(a: Annotatable, fld: &mut MacroExpander) -> SmallVector<Annotatable>
795
792
new_items
796
793
}
797
794
798
- // Partition a set of attributes into one kind of attribute, and other kinds.
799
- macro_rules! partition {
800
- ( $fn_name: ident, $variant: ident) => {
801
- #[ allow( deprecated) ] // The `allow` is needed because the `Modifier` variant might be used.
802
- fn $fn_name( attrs: & [ ast:: Attribute ] ,
803
- fld: & MacroExpander )
804
- -> ( Vec <ast:: Attribute >, Vec <ast:: Attribute >) {
805
- attrs. iter( ) . cloned( ) . partition( |attr| {
806
- match fld. cx. syntax_env. find( intern( & attr. name( ) ) ) {
807
- Some ( rc) => match * rc {
808
- $variant( ..) => true ,
809
- _ => false
810
- } ,
811
- _ => false
812
- }
813
- } )
814
- }
815
- }
816
- }
817
-
818
- partition ! ( multi_modifiers, MultiModifier ) ;
819
-
820
-
821
795
fn expand_decorators ( a : Annotatable ,
822
796
fld : & mut MacroExpander ,
823
797
decorator_items : & mut SmallVector < Annotatable > ,
@@ -861,46 +835,41 @@ fn expand_decorators(a: Annotatable,
861
835
}
862
836
}
863
837
864
- fn expand_item_multi_modifier ( mut it : Annotatable ,
865
- fld : & mut MacroExpander )
866
- -> Annotatable {
867
- let ( modifiers, other_attrs) = multi_modifiers ( it. attrs ( ) , fld) ;
868
-
869
- // Update the attrs, leave everything else alone. Is this mutation really a good idea?
870
- it = it. fold_attrs ( other_attrs) ;
871
-
872
- if modifiers. is_empty ( ) {
873
- return it
874
- }
875
-
876
- for attr in & modifiers {
877
- let mname = intern ( & attr. name ( ) ) ;
878
-
879
- match fld. cx . syntax_env . find ( mname) {
880
- Some ( rc) => match * rc {
881
- MultiModifier ( ref mac) => {
882
- attr:: mark_used ( attr) ;
883
- fld. cx . bt_push ( ExpnInfo {
884
- call_site : attr. span ,
885
- callee : NameAndSpan {
886
- format : MacroAttribute ( mname) ,
887
- span : Some ( attr. span ) ,
888
- // attributes can do whatever they like,
889
- // for now
890
- allow_internal_unstable : true ,
891
- }
892
- } ) ;
893
- it = mac. expand ( fld. cx , attr. span , & attr. node . value , it) ;
894
- fld. cx . bt_pop ( ) ;
838
+ fn expand_annotatable ( mut item : Annotatable , fld : & mut MacroExpander ) -> SmallVector < Annotatable > {
839
+ let mut multi_modifier = None ;
840
+ item = item. map_attrs ( |mut attrs| {
841
+ for i in 0 ..attrs. len ( ) {
842
+ if let Some ( extension) = fld. cx . syntax_env . find ( intern ( & attrs[ i] . name ( ) ) ) {
843
+ if let MultiModifier ( ..) = * extension {
844
+ multi_modifier = Some ( ( attrs. remove ( i) , extension) ) ;
845
+ break ;
895
846
}
896
- _ => unreachable ! ( )
897
- } ,
898
- _ => unreachable ! ( )
847
+ }
899
848
}
900
- }
849
+ attrs
850
+ } ) ;
901
851
902
- // Expansion may have added new ItemKind::Modifiers.
903
- expand_item_multi_modifier ( it, fld)
852
+ match multi_modifier {
853
+ None => expand_multi_modified ( item, fld) ,
854
+ Some ( ( attr, extension) ) => match * extension {
855
+ MultiModifier ( ref mac) => {
856
+ attr:: mark_used ( & attr) ;
857
+ fld. cx . bt_push ( ExpnInfo {
858
+ call_site : attr. span ,
859
+ callee : NameAndSpan {
860
+ format : MacroAttribute ( intern ( & attr. name ( ) ) ) ,
861
+ span : Some ( attr. span ) ,
862
+ // attributes can do whatever they like, for now
863
+ allow_internal_unstable : true ,
864
+ }
865
+ } ) ;
866
+ let modified = mac. expand ( fld. cx , attr. span , & attr. node . value , item) ;
867
+ fld. cx . bt_pop ( ) ;
868
+ expand_annotatable ( modified, fld)
869
+ }
870
+ _ => unreachable ! ( ) ,
871
+ }
872
+ }
904
873
}
905
874
906
875
fn expand_impl_item ( ii : ast:: ImplItem , fld : & mut MacroExpander )
0 commit comments