@@ -155,6 +155,10 @@ ast_fragments! {
155155 ForeignItems ( SmallVec <[ ast:: ForeignItem ; 1 ] >) {
156156 "foreign item" ; many fn flat_map_foreign_item; fn visit_foreign_item; fn make_foreign_items;
157157 }
158+ // New
159+ GenericParams ( SmallVec <[ ast:: GenericParam ; 1 ] >) {
160+ "generic parameter" ; many fn flat_map_generic_param; fn visit_generic_param; fn make_generic_params;
161+ }
158162}
159163
160164impl AstFragmentKind {
@@ -181,6 +185,8 @@ impl AstFragmentKind {
181185 ) ,
182186 AstFragmentKind :: OptExpr =>
183187 AstFragment :: OptExpr ( items. next ( ) . map ( Annotatable :: expect_expr) ) ,
188+ AstFragmentKind :: GenericParams =>
189+ AstFragment :: GenericParams ( items. map ( Annotatable :: expect_generic_param) . collect ( ) ) ,
184190 AstFragmentKind :: Pat | AstFragmentKind :: Ty =>
185191 panic ! ( "patterns and types aren't annotatable" ) ,
186192 }
@@ -189,7 +195,7 @@ impl AstFragmentKind {
189195
190196pub struct Invocation {
191197 pub kind : InvocationKind ,
192- fragment_kind : AstFragmentKind ,
198+ pub fragment_kind : AstFragmentKind ,
193199 pub expansion_data : ExpansionData ,
194200}
195201
@@ -479,6 +485,9 @@ impl<'a, 'b> MacroExpander<'a, 'b> {
479485 Annotatable :: Expr ( mut expr) => {
480486 Annotatable :: Expr ( { cfg. visit_expr ( & mut expr) ; expr } )
481487 }
488+ Annotatable :: GenericParam ( param) => {
489+ Annotatable :: GenericParam ( cfg. flat_map_generic_param ( param) . pop ( ) . unwrap ( ) )
490+ }
482491 }
483492 }
484493
@@ -540,6 +549,7 @@ impl<'a, 'b> MacroExpander<'a, 'b> {
540549 Annotatable :: ForeignItem ( item) => token:: NtForeignItem ( item. into_inner ( ) ) ,
541550 Annotatable :: Stmt ( stmt) => token:: NtStmt ( stmt. into_inner ( ) ) ,
542551 Annotatable :: Expr ( expr) => token:: NtExpr ( expr) ,
552+ Annotatable :: GenericParam ( ..) => panic ! ( "unexpected annotatable" )
543553 } ) ) , DUMMY_SP ) . into ( ) ;
544554 let input = self . extract_proc_macro_attr_input ( attr. tokens , span) ;
545555 let tok_result = expander. expand ( self . cx , span, input, item_tok) ;
@@ -623,6 +633,7 @@ impl<'a, 'b> MacroExpander<'a, 'b> {
623633 Annotatable :: Expr ( _) if self . cx . ecfg . proc_macro_hygiene ( ) => return ,
624634 Annotatable :: Stmt ( _) => ( "statements" , sym:: proc_macro_hygiene) ,
625635 Annotatable :: Expr ( _) => ( "expressions" , sym:: proc_macro_hygiene) ,
636+ Annotatable :: GenericParam ( ..) => panic ! ( "unexpected annotatable" ) ,
626637 } ;
627638 emit_feature_err (
628639 self . cx . parse_sess ,
@@ -679,6 +690,7 @@ impl<'a, 'b> MacroExpander<'a, 'b> {
679690 AstFragmentKind :: TraitItems => return ,
680691 AstFragmentKind :: ImplItems => return ,
681692 AstFragmentKind :: ForeignItems => return ,
693+ AstFragmentKind :: GenericParams => panic ! ( "unexpected AST fragment kind" ) ,
682694 } ;
683695 if self . cx . ecfg . proc_macro_hygiene ( ) {
684696 return
@@ -767,6 +779,7 @@ impl<'a> Parser<'a> {
767779 } ,
768780 AstFragmentKind :: Ty => AstFragment :: Ty ( self . parse_ty ( ) ?) ,
769781 AstFragmentKind :: Pat => AstFragment :: Pat ( self . parse_pat ( None ) ?) ,
782+ AstFragmentKind :: GenericParams => panic ! ( "unexpected AST fragment kind" ) ,
770783 } )
771784 }
772785
@@ -1220,9 +1233,17 @@ impl<'a, 'b> MutVisitor for InvocationCollector<'a, 'b> {
12201233 }
12211234 }
12221235
1223- fn visit_generic_params ( & mut self , params : & mut Vec < ast:: GenericParam > ) {
1224- self . cfg . configure_generic_params ( params) ;
1225- noop_visit_generic_params ( params, self ) ;
1236+ fn flat_map_generic_param ( & mut self , param : ast:: GenericParam ) -> SmallVec < [ ast:: GenericParam ; 1 ] > {
1237+ let mut param = configure ! ( self , param) ;
1238+
1239+ let ( attr, traits, after_derive) = self . classify_item ( & mut param) ;
1240+ if attr. is_some ( ) || !traits. is_empty ( ) {
1241+ return self . collect_attr ( attr, traits, Annotatable :: GenericParam ( param) ,
1242+ AstFragmentKind :: GenericParams , after_derive)
1243+ . make_generic_params ( ) ;
1244+ }
1245+
1246+ noop_flat_map_generic_param ( param, self )
12261247 }
12271248
12281249 fn visit_attribute ( & mut self , at : & mut ast:: Attribute ) {
0 commit comments