@@ -155,6 +155,10 @@ ast_fragments! {
155
155
ForeignItems ( SmallVec <[ ast:: ForeignItem ; 1 ] >) {
156
156
"foreign item" ; many fn flat_map_foreign_item; fn visit_foreign_item; fn make_foreign_items;
157
157
}
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
+ }
158
162
}
159
163
160
164
impl AstFragmentKind {
@@ -181,6 +185,8 @@ impl AstFragmentKind {
181
185
) ,
182
186
AstFragmentKind :: OptExpr =>
183
187
AstFragment :: OptExpr ( items. next ( ) . map ( Annotatable :: expect_expr) ) ,
188
+ AstFragmentKind :: GenericParams =>
189
+ AstFragment :: GenericParams ( items. map ( Annotatable :: expect_generic_param) . collect ( ) ) ,
184
190
AstFragmentKind :: Pat | AstFragmentKind :: Ty =>
185
191
panic ! ( "patterns and types aren't annotatable" ) ,
186
192
}
@@ -189,7 +195,7 @@ impl AstFragmentKind {
189
195
190
196
pub struct Invocation {
191
197
pub kind : InvocationKind ,
192
- fragment_kind : AstFragmentKind ,
198
+ pub fragment_kind : AstFragmentKind ,
193
199
pub expansion_data : ExpansionData ,
194
200
}
195
201
@@ -479,6 +485,9 @@ impl<'a, 'b> MacroExpander<'a, 'b> {
479
485
Annotatable :: Expr ( mut expr) => {
480
486
Annotatable :: Expr ( { cfg. visit_expr ( & mut expr) ; expr } )
481
487
}
488
+ Annotatable :: GenericParam ( param) => {
489
+ Annotatable :: GenericParam ( cfg. flat_map_generic_param ( param) . pop ( ) . unwrap ( ) )
490
+ }
482
491
}
483
492
}
484
493
@@ -540,6 +549,7 @@ impl<'a, 'b> MacroExpander<'a, 'b> {
540
549
Annotatable :: ForeignItem ( item) => token:: NtForeignItem ( item. into_inner ( ) ) ,
541
550
Annotatable :: Stmt ( stmt) => token:: NtStmt ( stmt. into_inner ( ) ) ,
542
551
Annotatable :: Expr ( expr) => token:: NtExpr ( expr) ,
552
+ Annotatable :: GenericParam ( ..) => panic ! ( "unexpected annotatable" )
543
553
} ) ) , DUMMY_SP ) . into ( ) ;
544
554
let input = self . extract_proc_macro_attr_input ( attr. tokens , span) ;
545
555
let tok_result = expander. expand ( self . cx , span, input, item_tok) ;
@@ -623,6 +633,7 @@ impl<'a, 'b> MacroExpander<'a, 'b> {
623
633
Annotatable :: Expr ( _) if self . cx . ecfg . proc_macro_hygiene ( ) => return ,
624
634
Annotatable :: Stmt ( _) => ( "statements" , sym:: proc_macro_hygiene) ,
625
635
Annotatable :: Expr ( _) => ( "expressions" , sym:: proc_macro_hygiene) ,
636
+ Annotatable :: GenericParam ( ..) => panic ! ( "unexpected annotatable" ) ,
626
637
} ;
627
638
emit_feature_err (
628
639
self . cx . parse_sess ,
@@ -679,6 +690,7 @@ impl<'a, 'b> MacroExpander<'a, 'b> {
679
690
AstFragmentKind :: TraitItems => return ,
680
691
AstFragmentKind :: ImplItems => return ,
681
692
AstFragmentKind :: ForeignItems => return ,
693
+ AstFragmentKind :: GenericParams => panic ! ( "unexpected AST fragment kind" ) ,
682
694
} ;
683
695
if self . cx . ecfg . proc_macro_hygiene ( ) {
684
696
return
@@ -767,6 +779,7 @@ impl<'a> Parser<'a> {
767
779
} ,
768
780
AstFragmentKind :: Ty => AstFragment :: Ty ( self . parse_ty ( ) ?) ,
769
781
AstFragmentKind :: Pat => AstFragment :: Pat ( self . parse_pat ( None ) ?) ,
782
+ AstFragmentKind :: GenericParams => panic ! ( "unexpected AST fragment kind" ) ,
770
783
} )
771
784
}
772
785
@@ -1220,9 +1233,17 @@ impl<'a, 'b> MutVisitor for InvocationCollector<'a, 'b> {
1220
1233
}
1221
1234
}
1222
1235
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 )
1226
1247
}
1227
1248
1228
1249
fn visit_attribute ( & mut self , at : & mut ast:: Attribute ) {
0 commit comments