@@ -139,6 +139,13 @@ macro_rules! mutability_helpers {
139139 } ;
140140 ( $a: expr) => { } ;
141141 }
142+
143+ macro_rules! derive_copy_clone {
144+ ( $i: item) => {
145+ #[ derive( Copy , Clone ) ]
146+ $i
147+ }
148+ }
142149 } ;
143150 ( mut ) => {
144151 macro_rules! if_mut_ty {
@@ -170,6 +177,12 @@ macro_rules! mutability_helpers {
170177 $a
171178 } ;
172179 }
180+
181+ macro_rules! derive_copy_clone {
182+ ( $i: item) => {
183+ $i
184+ }
185+ }
173186 } ;
174187}
175188
@@ -1032,6 +1045,17 @@ macro_rules! make_ast_visitor {
10321045 return_result!( V )
10331046 }
10341047
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+
10351059 make_walk_flat_map!{ Arm , walk_flat_map_arm, visit_arm}
10361060 make_walk_flat_map!{ Attribute , walk_flat_map_attribute, visit_attribute}
10371061 make_walk_flat_map!{ ExprField , walk_flat_map_expr_field, visit_expr_field}
@@ -1111,15 +1135,6 @@ pub mod visit {
11111135 }
11121136 }
11131137
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-
11231138 impl < ' a > FnKind < ' a > {
11241139 pub fn header ( & self ) -> Option < & ' a FnHeader > {
11251140 match * self {
@@ -1775,7 +1790,7 @@ pub mod mut_visit {
17751790 use crate :: ptr:: P ;
17761791 use crate :: token:: { self , Token } ;
17771792 use crate :: tokenstream:: * ;
1778- use crate :: visit:: { AssocCtxt , BoundKind , LifetimeCtxt } ;
1793+ use crate :: visit:: { AssocCtxt , BoundKind , LifetimeCtxt , FnCtxt } ;
17791794
17801795 pub trait ExpectOne < A : Array > {
17811796 fn expect_one ( self , err : & ' static str ) -> A :: Item ;
@@ -2208,7 +2223,7 @@ pub mod mut_visit {
22082223
22092224 fn walk_fn < T : MutVisitor > ( vis : & mut T , kind : FnKind < ' _ > ) {
22102225 match kind {
2211- FnKind :: Fn ( FnSig { header, decl, span } , generics, body) => {
2226+ FnKind :: Fn ( _ , _ , FnSig { header, decl, span } , _ , generics, body) => {
22122227 // Identifier and visibility are visited as a part of the item.
22132228 vis. visit_fn_header ( header) ;
22142229 vis. visit_generics ( generics) ;
@@ -2298,7 +2313,9 @@ pub mod mut_visit {
22982313 }
22992314 ItemKind :: Fn ( box Fn { defaultness, generics, sig, body } ) => {
23002315 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) ;
23022319 }
23032320 ItemKind :: Mod ( safety, mod_kind) => {
23042321 visit_safety ( visitor, safety) ;
@@ -2438,7 +2455,7 @@ pub mod mut_visit {
24382455 smallvec ! [ item]
24392456 }
24402457
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 ) {
24422459 let Item { attrs, id, span, vis, ident, kind, tokens } = item;
24432460 visitor. visit_id ( id) ;
24442461 visit_attrs ( visitor, attrs) ;
@@ -2450,7 +2467,9 @@ pub mod mut_visit {
24502467 }
24512468 AssocItemKind :: Fn ( box Fn { defaultness, generics, sig, body } ) => {
24522469 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) ;
24542473 }
24552474 AssocItemKind :: Type ( box TyAlias {
24562475 defaultness,
@@ -2533,7 +2552,9 @@ pub mod mut_visit {
25332552 }
25342553 ForeignItemKind :: Fn ( box Fn { defaultness, generics, sig, body } ) => {
25352554 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) ;
25372558 }
25382559 ForeignItemKind :: TyAlias ( box TyAlias {
25392560 defaultness,
@@ -2892,13 +2913,4 @@ pub mod mut_visit {
28922913 crate :: ast_traits:: AstNodeWrapper :: new ( N :: dummy ( ) , T :: dummy ( ) )
28932914 }
28942915 }
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- }
29042916}
0 commit comments