Skip to content

Commit 8a5b539

Browse files
committed
Unify FnKind
1 parent 5dd53f3 commit 8a5b539

File tree

1 file changed

+40
-28
lines changed

1 file changed

+40
-28
lines changed

compiler/rustc_ast/src/visitors.rs

Lines changed: 40 additions & 28 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 {
@@ -1783,7 +1798,7 @@ pub mod mut_visit {
17831798
use crate::ptr::P;
17841799
use crate::token::{self, Token};
17851800
use crate::tokenstream::*;
1786-
use crate::visit::{AssocCtxt, BoundKind, LifetimeCtxt};
1801+
use crate::visit::{AssocCtxt, BoundKind, LifetimeCtxt, FnCtxt};
17871802

17881803
pub trait ExpectOne<A: Array> {
17891804
fn expect_one(self, err: &'static str) -> A::Item;
@@ -2223,7 +2238,7 @@ pub mod mut_visit {
22232238

22242239
fn walk_fn<T: MutVisitor>(vis: &mut T, kind: FnKind<'_>) {
22252240
match kind {
2226-
FnKind::Fn(FnSig { header, decl, span }, generics, body) => {
2241+
FnKind::Fn(_, _, FnSig { header, decl, span }, _, generics, body) => {
22272242
// Identifier and visibility are visited as a part of the item.
22282243
vis.visit_fn_header(header);
22292244
vis.visit_generics(generics);
@@ -2299,8 +2314,8 @@ pub mod mut_visit {
22992314
&mut self,
23002315
id: NodeId,
23012316
span: Span,
2302-
_vis: &mut Visibility,
2303-
_ident: &mut Ident,
2317+
vis: &mut Visibility,
2318+
ident: &mut Ident,
23042319
visitor: &mut impl MutVisitor
23052320
) {
23062321
match self {
@@ -2315,7 +2330,9 @@ pub mod mut_visit {
23152330
}
23162331
ItemKind::Fn(box Fn { defaultness, generics, sig, body }) => {
23172332
visit_defaultness(visitor, defaultness);
2318-
visitor.visit_fn(FnKind::Fn(sig, generics, body), span, id);
2333+
let kind =
2334+
FnKind::Fn(FnCtxt::Free, *ident, sig, vis, generics, body.as_deref_mut());
2335+
visitor.visit_fn(kind, span, id);
23192336
}
23202337
ItemKind::Mod(safety, mod_kind) => {
23212338
visit_safety(visitor, safety);
@@ -2457,7 +2474,7 @@ pub mod mut_visit {
24572474
smallvec![item]
24582475
}
24592476

2460-
pub fn walk_assoc_item(visitor: &mut impl MutVisitor, item: &mut Item<AssocItemKind>, _ctxt: AssocCtxt) {
2477+
pub fn walk_assoc_item(visitor: &mut impl MutVisitor, item: &mut Item<AssocItemKind>, ctxt: AssocCtxt) {
24612478
let Item { attrs, id, span, vis, ident, kind, tokens } = item;
24622479
visitor.visit_id(id);
24632480
visit_attrs(visitor, attrs);
@@ -2469,7 +2486,9 @@ pub mod mut_visit {
24692486
}
24702487
AssocItemKind::Fn(box Fn { defaultness, generics, sig, body }) => {
24712488
visit_defaultness(visitor, defaultness);
2472-
visitor.visit_fn(FnKind::Fn(sig, generics, body), *span, *id);
2489+
let kind =
2490+
FnKind::Fn(FnCtxt::Assoc(ctxt), *ident, sig, vis, generics, body.as_deref_mut());
2491+
visitor.visit_fn(kind, *span, *id);
24732492
}
24742493
AssocItemKind::Type(box TyAlias {
24752494
defaultness,
@@ -2543,8 +2562,8 @@ pub mod mut_visit {
25432562
&mut self,
25442563
id: NodeId,
25452564
span: Span,
2546-
_vis: &mut Visibility,
2547-
_ident: &mut Ident,
2565+
vis: &mut Visibility,
2566+
ident: &mut Ident,
25482567
visitor: &mut impl MutVisitor) {
25492568
match self {
25502569
ForeignItemKind::Static(box StaticItem { ty, mutability: _, expr, safety: _ }) => {
@@ -2553,7 +2572,9 @@ pub mod mut_visit {
25532572
}
25542573
ForeignItemKind::Fn(box Fn { defaultness, generics, sig, body }) => {
25552574
visit_defaultness(visitor, defaultness);
2556-
visitor.visit_fn(FnKind::Fn(sig, generics, body), span, id);
2575+
let kind =
2576+
FnKind::Fn(FnCtxt::Foreign, *ident, sig, vis, generics, body.as_deref_mut());
2577+
visitor.visit_fn(kind, span, id);
25572578
}
25582579
ForeignItemKind::TyAlias(box TyAlias {
25592580
defaultness,
@@ -2910,13 +2931,4 @@ pub mod mut_visit {
29102931
crate::ast_traits::AstNodeWrapper::new(N::dummy(), T::dummy())
29112932
}
29122933
}
2913-
2914-
#[derive(Debug)]
2915-
pub enum FnKind<'a> {
2916-
/// E.g., `fn foo()`, `fn foo(&self)`, or `extern "Abi" fn foo()`.
2917-
Fn(&'a mut FnSig, &'a mut Generics, &'a mut Option<P<Block>>),
2918-
2919-
/// E.g., `|x, y| body`.
2920-
Closure(&'a mut ClosureBinder, &'a mut P<FnDecl>, &'a mut P<Expr>),
2921-
}
29222934
}

0 commit comments

Comments
 (0)