@@ -139,6 +139,13 @@ macro_rules! mutability_helpers {
139
139
} ;
140
140
( $a: expr) => { } ;
141
141
}
142
+
143
+ macro_rules! derive_copy_clone {
144
+ ( $i: item) => {
145
+ #[ derive( Copy , Clone ) ]
146
+ $i
147
+ }
148
+ }
142
149
} ;
143
150
( mut ) => {
144
151
macro_rules! if_mut_ty {
@@ -170,6 +177,12 @@ macro_rules! mutability_helpers {
170
177
$a
171
178
} ;
172
179
}
180
+
181
+ macro_rules! derive_copy_clone {
182
+ ( $i: item) => {
183
+ $i
184
+ }
185
+ }
173
186
} ;
174
187
}
175
188
@@ -1032,6 +1045,17 @@ macro_rules! make_ast_visitor {
1032
1045
return_result!( V )
1033
1046
}
1034
1047
1048
+ derive_copy_clone!{
1049
+ #[ derive( Debug ) ]
1050
+ pub enum FnKind <' a> {
1051
+ /// E.g., `fn foo()`, `fn foo(&self)`, or `extern "Abi" fn foo()`.
1052
+ Fn ( FnCtxt , Ident , & ' a $( $mut) ? FnSig , & ' a $( $mut) ? Visibility , & ' a $( $mut) ? Generics , Option <& ' a $( $mut) ? Block >) ,
1053
+
1054
+ /// E.g., `|x, y| body`.
1055
+ Closure ( & ' a $( $mut) ? ClosureBinder , & ' a $( $mut) ? P !( FnDecl ) , & ' a $( $mut) ? P !( Expr ) ) ,
1056
+ }
1057
+ }
1058
+
1035
1059
make_walk_flat_map!{ Arm , walk_flat_map_arm, visit_arm}
1036
1060
make_walk_flat_map!{ Attribute , walk_flat_map_attribute, visit_attribute}
1037
1061
make_walk_flat_map!{ ExprField , walk_flat_map_expr_field, visit_expr_field}
@@ -1111,15 +1135,6 @@ pub mod visit {
1111
1135
}
1112
1136
}
1113
1137
1114
- #[ derive( Copy , Clone , Debug ) ]
1115
- pub enum FnKind < ' a > {
1116
- /// E.g., `fn foo()`, `fn foo(&self)`, or `extern "Abi" fn foo()`.
1117
- Fn ( FnCtxt , Ident , & ' a FnSig , & ' a Visibility , & ' a Generics , Option < & ' a Block > ) ,
1118
-
1119
- /// E.g., `|x, y| body`.
1120
- Closure ( & ' a ClosureBinder , & ' a FnDecl , & ' a Expr ) ,
1121
- }
1122
-
1123
1138
impl < ' a > FnKind < ' a > {
1124
1139
pub fn header ( & self ) -> Option < & ' a FnHeader > {
1125
1140
match * self {
@@ -1775,7 +1790,7 @@ pub mod mut_visit {
1775
1790
use crate :: ptr:: P ;
1776
1791
use crate :: token:: { self , Token } ;
1777
1792
use crate :: tokenstream:: * ;
1778
- use crate :: visit:: { AssocCtxt , BoundKind , LifetimeCtxt } ;
1793
+ use crate :: visit:: { AssocCtxt , BoundKind , LifetimeCtxt , FnCtxt } ;
1779
1794
1780
1795
pub trait ExpectOne < A : Array > {
1781
1796
fn expect_one ( self , err : & ' static str ) -> A :: Item ;
@@ -2208,7 +2223,7 @@ pub mod mut_visit {
2208
2223
2209
2224
fn walk_fn < T : MutVisitor > ( vis : & mut T , kind : FnKind < ' _ > ) {
2210
2225
match kind {
2211
- FnKind :: Fn ( FnSig { header, decl, span } , generics, body) => {
2226
+ FnKind :: Fn ( _ , _ , FnSig { header, decl, span } , _ , generics, body) => {
2212
2227
// Identifier and visibility are visited as a part of the item.
2213
2228
vis. visit_fn_header ( header) ;
2214
2229
vis. visit_generics ( generics) ;
@@ -2298,7 +2313,9 @@ pub mod mut_visit {
2298
2313
}
2299
2314
ItemKind :: Fn ( box Fn { defaultness, generics, sig, body } ) => {
2300
2315
visit_defaultness ( visitor, defaultness) ;
2301
- visitor. visit_fn ( FnKind :: Fn ( sig, generics, body) , * span, * id) ;
2316
+ let kind =
2317
+ FnKind :: Fn ( FnCtxt :: Free , * ident, sig, vis, generics, body. as_deref_mut ( ) ) ;
2318
+ visitor. visit_fn ( kind, * span, * id) ;
2302
2319
}
2303
2320
ItemKind :: Mod ( safety, mod_kind) => {
2304
2321
visit_safety ( visitor, safety) ;
@@ -2438,7 +2455,7 @@ pub mod mut_visit {
2438
2455
smallvec ! [ item]
2439
2456
}
2440
2457
2441
- pub fn walk_assoc_item ( visitor : & mut impl MutVisitor , item : & mut Item < AssocItemKind > , _ctxt : AssocCtxt ) {
2458
+ pub fn walk_assoc_item ( visitor : & mut impl MutVisitor , item : & mut Item < AssocItemKind > , ctxt : AssocCtxt ) {
2442
2459
let Item { attrs, id, span, vis, ident, kind, tokens } = item;
2443
2460
visitor. visit_id ( id) ;
2444
2461
visit_attrs ( visitor, attrs) ;
@@ -2450,7 +2467,9 @@ pub mod mut_visit {
2450
2467
}
2451
2468
AssocItemKind :: Fn ( box Fn { defaultness, generics, sig, body } ) => {
2452
2469
visit_defaultness ( visitor, defaultness) ;
2453
- visitor. visit_fn ( FnKind :: Fn ( sig, generics, body) , * span, * id) ;
2470
+ let kind =
2471
+ FnKind :: Fn ( FnCtxt :: Assoc ( ctxt) , * ident, sig, vis, generics, body. as_deref_mut ( ) ) ;
2472
+ visitor. visit_fn ( kind, * span, * id) ;
2454
2473
}
2455
2474
AssocItemKind :: Type ( box TyAlias {
2456
2475
defaultness,
@@ -2533,7 +2552,9 @@ pub mod mut_visit {
2533
2552
}
2534
2553
ForeignItemKind :: Fn ( box Fn { defaultness, generics, sig, body } ) => {
2535
2554
visit_defaultness ( visitor, defaultness) ;
2536
- visitor. visit_fn ( FnKind :: Fn ( sig, generics, body) , * span, * id) ;
2555
+ let kind =
2556
+ FnKind :: Fn ( FnCtxt :: Foreign , * ident, sig, vis, generics, body. as_deref_mut ( ) ) ;
2557
+ visitor. visit_fn ( kind, * span, * id) ;
2537
2558
}
2538
2559
ForeignItemKind :: TyAlias ( box TyAlias {
2539
2560
defaultness,
@@ -2892,13 +2913,4 @@ pub mod mut_visit {
2892
2913
crate :: ast_traits:: AstNodeWrapper :: new ( N :: dummy ( ) , T :: dummy ( ) )
2893
2914
}
2894
2915
}
2895
-
2896
- #[ derive( Debug ) ]
2897
- pub enum FnKind < ' a > {
2898
- /// E.g., `fn foo()`, `fn foo(&self)`, or `extern "Abi" fn foo()`.
2899
- Fn ( & ' a mut FnSig , & ' a mut Generics , & ' a mut Option < P < Block > > ) ,
2900
-
2901
- /// E.g., `|x, y| body`.
2902
- Closure ( & ' a mut ClosureBinder , & ' a mut P < FnDecl > , & ' a mut P < Expr > ) ,
2903
- }
2904
2916
}
0 commit comments