@@ -151,6 +151,28 @@ macro_rules! make_ast_visitor {
151
151
} ;
152
152
}
153
153
154
+ macro_rules! fn_kind_derives {
155
+ ( $i: item) => {
156
+ macro_if!{ $( $mut) ? {
157
+ #[ derive( Debug ) ]
158
+ $i
159
+ } else {
160
+ #[ derive( Debug , Copy , Clone ) ]
161
+ $i
162
+ } }
163
+ }
164
+ }
165
+
166
+ fn_kind_derives!{
167
+ pub enum FnKind <' a> {
168
+ /// E.g., `fn foo()`, `fn foo(&self)`, or `extern "Abi" fn foo()`.
169
+ Fn ( FnCtxt , & ' a $( $mut) ? Ident , & ' a $( $mut) ? FnSig , & ' a $( $mut) ? Visibility , & ' a $( $mut) ? Generics , & ' a $( $mut) ? Option <P <Block >>) ,
170
+
171
+ /// E.g., `|x, y| body`.
172
+ Closure ( & ' a $( $mut) ? ClosureBinder , & ' a $( $mut) ? Option <CoroutineKind >, & ' a $( $mut) ? P !( FnDecl ) , & ' a $( $mut) ? P !( Expr ) ) ,
173
+ }
174
+ }
175
+
154
176
/// Each method of the traits `Visitor` and `MutVisitor` trait is a hook
155
177
/// to be potentially overridden. Each method's default implementation
156
178
/// recursively visits the substructure of the input via the corresponding
@@ -1291,15 +1313,6 @@ pub mod visit {
1291
1313
}
1292
1314
}
1293
1315
1294
- #[ derive( Copy , Clone , Debug ) ]
1295
- pub enum FnKind < ' a > {
1296
- /// E.g., `fn foo()`, `fn foo(&self)`, or `extern "Abi" fn foo()`.
1297
- Fn ( FnCtxt , & ' a Ident , & ' a FnSig , & ' a Visibility , & ' a Generics , Option < & ' a Block > ) ,
1298
-
1299
- /// E.g., `|x, y| body`.
1300
- Closure ( & ' a ClosureBinder , & ' a Option < CoroutineKind > , & ' a FnDecl , & ' a Expr ) ,
1301
- }
1302
-
1303
1316
impl < ' a > FnKind < ' a > {
1304
1317
pub fn header ( & self ) -> Option < & ' a FnHeader > {
1305
1318
match * self {
@@ -1364,7 +1377,7 @@ pub mod visit {
1364
1377
visit_opt ! ( visitor, visit_expr, expr) ;
1365
1378
}
1366
1379
ItemKind :: Fn ( box Fn { defaultness : _, generics, sig, body } ) => {
1367
- let kind = FnKind :: Fn ( FnCtxt :: Free , ident, sig, vis, generics, body. as_deref ( ) ) ;
1380
+ let kind = FnKind :: Fn ( FnCtxt :: Free , ident, sig, vis, generics, body) ;
1368
1381
try_visit ! ( visitor. visit_fn( kind, span, id) ) ;
1369
1382
}
1370
1383
ItemKind :: Mod ( safety, mod_kind) => {
@@ -1475,8 +1488,7 @@ pub mod visit {
1475
1488
visit_opt ! ( visitor, visit_expr, expr) ;
1476
1489
}
1477
1490
ForeignItemKind :: Fn ( box Fn { defaultness : _, generics, sig, body } ) => {
1478
- let kind =
1479
- FnKind :: Fn ( FnCtxt :: Foreign , ident, sig, vis, generics, body. as_deref ( ) ) ;
1491
+ let kind = FnKind :: Fn ( FnCtxt :: Foreign , ident, sig, vis, generics, body) ;
1480
1492
try_visit ! ( visitor. visit_fn( kind, span, id) ) ;
1481
1493
}
1482
1494
ForeignItemKind :: TyAlias ( box TyAlias {
@@ -1533,8 +1545,7 @@ pub mod visit {
1533
1545
visit_opt ! ( visitor, visit_expr, expr) ;
1534
1546
}
1535
1547
AssocItemKind :: Fn ( box Fn { defaultness : _, generics, sig, body } ) => {
1536
- let kind =
1537
- FnKind :: Fn ( FnCtxt :: Assoc ( ctxt) , ident, sig, vis, generics, body. as_deref ( ) ) ;
1548
+ let kind = FnKind :: Fn ( FnCtxt :: Assoc ( ctxt) , ident, sig, vis, generics, body) ;
1538
1549
try_visit ! ( visitor. visit_fn( kind, * span, * id) ) ;
1539
1550
}
1540
1551
AssocItemKind :: Type ( box TyAlias {
@@ -1772,7 +1783,7 @@ pub mod mut_visit {
1772
1783
//! that are created by the expansion of a macro.
1773
1784
1774
1785
use super :: * ;
1775
- use crate :: visit:: { AssocCtxt , BoundKind , LifetimeCtxt } ;
1786
+ use crate :: visit:: { AssocCtxt , BoundKind , FnCtxt , LifetimeCtxt } ;
1776
1787
1777
1788
pub trait ExpectOne < A : Array > {
1778
1789
fn expect_one ( self , err : & ' static str ) -> A :: Item ;
@@ -2095,7 +2106,7 @@ pub mod mut_visit {
2095
2106
2096
2107
fn walk_fn < T : MutVisitor > ( vis : & mut T , kind : FnKind < ' _ > ) {
2097
2108
match kind {
2098
- FnKind :: Fn ( FnSig { header, decl, span } , generics, body) => {
2109
+ FnKind :: Fn ( _ , _ , FnSig { header, decl, span } , _ , generics, body) => {
2099
2110
// Identifier and visibility are visited as a part of the item.
2100
2111
vis. visit_fn_header ( header) ;
2101
2112
vis. visit_generics ( generics) ;
@@ -2105,7 +2116,8 @@ pub mod mut_visit {
2105
2116
}
2106
2117
vis. visit_span ( span) ;
2107
2118
}
2108
- FnKind :: Closure ( binder, decl, body) => {
2119
+ FnKind :: Closure ( binder, coroutine_kind, decl, body) => {
2120
+ coroutine_kind. as_mut ( ) . map ( |ck| vis. visit_coroutine_kind ( ck) ) ;
2109
2121
vis. visit_closure_binder ( binder) ;
2110
2122
vis. visit_fn_decl ( decl) ;
2111
2123
vis. visit_expr ( body) ;
@@ -2146,8 +2158,8 @@ pub mod mut_visit {
2146
2158
& mut self ,
2147
2159
id : NodeId ,
2148
2160
span : Span ,
2149
- _vis : & mut Visibility ,
2150
- _ident : & mut Ident ,
2161
+ vis : & mut Visibility ,
2162
+ ident : & mut Ident ,
2151
2163
visitor : & mut V ,
2152
2164
) {
2153
2165
match self {
@@ -2162,7 +2174,11 @@ pub mod mut_visit {
2162
2174
}
2163
2175
ItemKind :: Fn ( box Fn { defaultness, generics, sig, body } ) => {
2164
2176
visit_defaultness ( visitor, defaultness) ;
2165
- visitor. visit_fn ( FnKind :: Fn ( sig, generics, body) , span, id) ;
2177
+ visitor. visit_fn (
2178
+ FnKind :: Fn ( FnCtxt :: Free , ident, sig, vis, generics, body) ,
2179
+ span,
2180
+ id,
2181
+ ) ;
2166
2182
}
2167
2183
ItemKind :: Mod ( safety, mod_kind) => {
2168
2184
visitor. visit_safety ( safety) ;
@@ -2313,7 +2329,7 @@ pub mod mut_visit {
2313
2329
pub fn walk_flat_map_assoc_item (
2314
2330
visitor : & mut impl MutVisitor ,
2315
2331
mut item : P < AssocItem > ,
2316
- _ctxt : AssocCtxt ,
2332
+ ctxt : AssocCtxt ,
2317
2333
) -> SmallVec < [ P < AssocItem > ; 1 ] > {
2318
2334
let Item { ident, attrs, id, kind, vis, span, tokens } = item. deref_mut ( ) ;
2319
2335
visitor. visit_id ( id) ;
@@ -2326,7 +2342,11 @@ pub mod mut_visit {
2326
2342
}
2327
2343
AssocItemKind :: Fn ( box Fn { defaultness, generics, sig, body } ) => {
2328
2344
visit_defaultness ( visitor, defaultness) ;
2329
- visitor. visit_fn ( FnKind :: Fn ( sig, generics, body) , * span, * id) ;
2345
+ visitor. visit_fn (
2346
+ FnKind :: Fn ( FnCtxt :: Assoc ( ctxt) , ident, sig, vis, generics, body) ,
2347
+ * span,
2348
+ * id,
2349
+ ) ;
2330
2350
}
2331
2351
AssocItemKind :: Type ( box TyAlias {
2332
2352
defaultness,
@@ -2386,8 +2406,8 @@ pub mod mut_visit {
2386
2406
& mut self ,
2387
2407
id : NodeId ,
2388
2408
span : Span ,
2389
- _vis : & mut Visibility ,
2390
- _ident : & mut Ident ,
2409
+ vis : & mut Visibility ,
2410
+ ident : & mut Ident ,
2391
2411
visitor : & mut V ,
2392
2412
) {
2393
2413
match self {
@@ -2397,7 +2417,11 @@ pub mod mut_visit {
2397
2417
}
2398
2418
ForeignItemKind :: Fn ( box Fn { defaultness, generics, sig, body } ) => {
2399
2419
visit_defaultness ( visitor, defaultness) ;
2400
- visitor. visit_fn ( FnKind :: Fn ( sig, generics, body) , span, id) ;
2420
+ visitor. visit_fn (
2421
+ FnKind :: Fn ( FnCtxt :: Foreign , ident, sig, vis, generics, body) ,
2422
+ span,
2423
+ id,
2424
+ ) ;
2401
2425
}
2402
2426
ForeignItemKind :: TyAlias ( box TyAlias {
2403
2427
defaultness,
@@ -2506,11 +2530,8 @@ pub mod mut_visit {
2506
2530
fn_arg_span,
2507
2531
} ) => {
2508
2532
visit_constness ( vis, constness) ;
2509
- coroutine_kind
2510
- . as_mut ( )
2511
- . map ( |coroutine_kind| vis. visit_coroutine_kind ( coroutine_kind) ) ;
2512
2533
vis. visit_capture_by ( capture_clause) ;
2513
- vis. visit_fn ( FnKind :: Closure ( binder, fn_decl, body) , * span, * id) ;
2534
+ vis. visit_fn ( FnKind :: Closure ( binder, coroutine_kind , fn_decl, body) , * span, * id) ;
2514
2535
vis. visit_span ( fn_decl_span) ;
2515
2536
vis. visit_span ( fn_arg_span) ;
2516
2537
}
@@ -2754,13 +2775,4 @@ pub mod mut_visit {
2754
2775
crate :: ast_traits:: AstNodeWrapper :: new ( N :: dummy ( ) , T :: dummy ( ) )
2755
2776
}
2756
2777
}
2757
-
2758
- #[ derive( Debug ) ]
2759
- pub enum FnKind < ' a > {
2760
- /// E.g., `fn foo()`, `fn foo(&self)`, or `extern "Abi" fn foo()`.
2761
- Fn ( & ' a mut FnSig , & ' a mut Generics , & ' a mut Option < P < Block > > ) ,
2762
-
2763
- /// E.g., `|x, y| body`.
2764
- Closure ( & ' a mut ClosureBinder , & ' a mut P < FnDecl > , & ' a mut P < Expr > ) ,
2765
- }
2766
2778
}
0 commit comments