Skip to content

Commit afe0d43

Browse files
committed
Unify FnKind
1 parent df0610f commit afe0d43

File tree

1 file changed

+36
-24
lines changed

1 file changed

+36
-24
lines changed

compiler/rustc_ast/src/visitors.rs

Lines changed: 36 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)