@@ -173,6 +173,12 @@ macro_rules! make_ast_visitor {
173
173
}
174
174
}
175
175
176
+ macro_rules! FnKind {
177
+ ( ) => {
178
+ macro_if!{ $( $lt) ? { FnKind <$( $lt) ?> } else { FnKind <' _> } }
179
+ } ;
180
+ }
181
+
176
182
/// Each method of the traits `Visitor` and `MutVisitor` trait is a hook
177
183
/// to be potentially overridden. Each method's default implementation
178
184
/// recursively visits the substructure of the input via the corresponding
@@ -246,11 +252,6 @@ macro_rules! make_ast_visitor {
246
252
walk_flat_map_assoc_item( self , i, ctxt)
247
253
}
248
254
249
- /// `Span` and `NodeId` are mutated at the caller site.
250
- fn visit_fn( & mut self , fk: FnKind <' _>, _: Span , _: NodeId ) {
251
- walk_fn( self , fk)
252
- }
253
-
254
255
fn flat_map_stmt( & mut self , s: Stmt ) -> SmallVec <[ Stmt ; 1 ] > {
255
256
walk_flat_map_stmt( self , s)
256
257
}
@@ -312,9 +313,6 @@ macro_rules! make_ast_visitor {
312
313
fn visit_expr_post( & mut self , _ex: & ' ast Expr ) -> Self :: Result {
313
314
Self :: Result :: output( )
314
315
}
315
- fn visit_fn( & mut self , fk: FnKind <' ast>, _: Span , _: NodeId ) -> Self :: Result {
316
- walk_fn( self , fk)
317
- }
318
316
fn visit_fn_header( & mut self , _header: & ' ast FnHeader ) -> Self :: Result {
319
317
Self :: Result :: output( )
320
318
}
@@ -378,6 +376,10 @@ macro_rules! make_ast_visitor {
378
376
make_visit!{ ForeignItem ; visit_foreign_item, walk_item}
379
377
make_visit!{ Item ; visit_item, walk_item}
380
378
379
+ fn visit_fn( & mut self , fn_kind: FnKind !( ) , _span: Span , _id: NodeId ) -> result!( ) {
380
+ walk_fn( self , fn_kind)
381
+ }
382
+
381
383
fn visit_variant_discr( & mut self , discr: ref_t!( AnonConst ) ) -> result!( ) {
382
384
self . visit_anon_const( discr)
383
385
}
@@ -1263,6 +1265,29 @@ macro_rules! make_ast_visitor {
1263
1265
try_v!( visit_span!( visitor, span) ) ;
1264
1266
return_result!( V )
1265
1267
}
1268
+
1269
+ pub fn walk_fn<$( $lt, ) ? V : $trait$( <$lt>) ?>(
1270
+ visitor: & mut V ,
1271
+ kind: FnKind !( )
1272
+ ) -> result!( V ) {
1273
+ match kind {
1274
+ FnKind :: Fn ( _ctxt, _ident, FnSig { header, decl, span } , _vis, generics, body) => {
1275
+ // Identifier and visibility are visited as a part of the item.
1276
+ try_v!( visitor. visit_fn_header( header) ) ;
1277
+ try_v!( visitor. visit_generics( generics) ) ;
1278
+ try_v!( visitor. visit_fn_decl( decl) ) ;
1279
+ visit_o!( body, |body| visitor. visit_block( body) ) ;
1280
+ try_v!( visit_span!( visitor, span) )
1281
+ }
1282
+ FnKind :: Closure ( binder, coroutine_kind, decl, body) => {
1283
+ visit_o!( coroutine_kind, |ck| visitor. visit_coroutine_kind( ck) ) ;
1284
+ try_v!( visitor. visit_closure_binder( binder) ) ;
1285
+ try_v!( visitor. visit_fn_decl( decl) ) ;
1286
+ try_v!( visitor. visit_expr( body) ) ;
1287
+ }
1288
+ }
1289
+ return_result!( V )
1290
+ }
1266
1291
}
1267
1292
}
1268
1293
@@ -1527,24 +1552,6 @@ pub mod visit {
1527
1552
}
1528
1553
}
1529
1554
1530
- pub fn walk_fn < ' a , V : Visitor < ' a > > ( visitor : & mut V , kind : FnKind < ' a > ) -> V :: Result {
1531
- match kind {
1532
- FnKind :: Fn ( _ctxt, _ident, FnSig { header, decl, span : _ } , _vis, generics, body) => {
1533
- // Identifier and visibility are visited as a part of the item.
1534
- try_visit ! ( visitor. visit_fn_header( header) ) ;
1535
- try_visit ! ( visitor. visit_generics( generics) ) ;
1536
- try_visit ! ( visitor. visit_fn_decl( decl) ) ;
1537
- visit_opt ! ( visitor, visit_block, body) ;
1538
- }
1539
- FnKind :: Closure ( binder, _coroutine_kind, decl, body) => {
1540
- try_visit ! ( visitor. visit_closure_binder( binder) ) ;
1541
- try_visit ! ( visitor. visit_fn_decl( decl) ) ;
1542
- try_visit ! ( visitor. visit_expr( body) ) ;
1543
- }
1544
- }
1545
- V :: Result :: output ( )
1546
- }
1547
-
1548
1555
pub fn walk_assoc_item < ' a , V : Visitor < ' a > > (
1549
1556
visitor : & mut V ,
1550
1557
item : & ' a AssocItem ,
@@ -2108,27 +2115,6 @@ pub mod mut_visit {
2108
2115
}
2109
2116
}
2110
2117
2111
- fn walk_fn < T : MutVisitor > ( vis : & mut T , kind : FnKind < ' _ > ) {
2112
- match kind {
2113
- FnKind :: Fn ( _, _, FnSig { header, decl, span } , _, generics, body) => {
2114
- // Identifier and visibility are visited as a part of the item.
2115
- vis. visit_fn_header ( header) ;
2116
- vis. visit_generics ( generics) ;
2117
- vis. visit_fn_decl ( decl) ;
2118
- if let Some ( body) = body {
2119
- vis. visit_block ( body) ;
2120
- }
2121
- vis. visit_span ( span) ;
2122
- }
2123
- FnKind :: Closure ( binder, coroutine_kind, decl, body) => {
2124
- coroutine_kind. as_mut ( ) . map ( |ck| vis. visit_coroutine_kind ( ck) ) ;
2125
- vis. visit_closure_binder ( binder) ;
2126
- vis. visit_fn_decl ( decl) ;
2127
- vis. visit_expr ( body) ;
2128
- }
2129
- }
2130
- }
2131
-
2132
2118
pub fn walk_flat_map_generic_param < T : MutVisitor > (
2133
2119
vis : & mut T ,
2134
2120
mut param : GenericParam ,
0 commit comments