Skip to content

Commit 1236656

Browse files
committed
Make Visitor::FnKind and MutVisitor::FnKind compatible
1 parent 6295686 commit 1236656

File tree

6 files changed

+114
-62
lines changed

6 files changed

+114
-62
lines changed

compiler/rustc_ast/src/mut_visit.rs

+85-19
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ use crate::ast::*;
2323
use crate::ptr::P;
2424
use crate::token::{self, Token};
2525
use crate::tokenstream::*;
26-
use crate::visit::{AssocCtxt, BoundKind};
26+
use crate::visit::{AssocCtxt, BoundKind, FnCtxt};
2727

2828
pub trait ExpectOne<A: Array> {
2929
fn expect_one(self, err: &'static str) -> A::Item;
@@ -37,7 +37,15 @@ impl<A: Array> ExpectOne<A> for SmallVec<A> {
3737
}
3838

3939
pub trait WalkItemKind {
40-
fn walk(&mut self, span: Span, id: NodeId, visitor: &mut impl MutVisitor);
40+
fn walk(
41+
&mut self,
42+
span: Span,
43+
id: NodeId,
44+
ident: &mut Ident,
45+
visibility: &mut Visibility,
46+
ctxt: AssocCtxt,
47+
visitor: &mut impl MutVisitor,
48+
);
4149
}
4250

4351
pub trait MutVisitor: Sized {
@@ -114,9 +122,9 @@ pub trait MutVisitor: Sized {
114122
fn flat_map_assoc_item(
115123
&mut self,
116124
i: P<AssocItem>,
117-
_ctxt: AssocCtxt,
125+
ctxt: AssocCtxt,
118126
) -> SmallVec<[P<AssocItem>; 1]> {
119-
walk_flat_map_item(self, i)
127+
walk_flat_map_assoc_item(self, i, ctxt)
120128
}
121129

122130
fn visit_fn_decl(&mut self, d: &mut P<FnDecl>) {
@@ -880,7 +888,7 @@ fn walk_coroutine_kind<T: MutVisitor>(vis: &mut T, coroutine_kind: &mut Coroutin
880888

881889
fn walk_fn<T: MutVisitor>(vis: &mut T, kind: FnKind<'_>) {
882890
match kind {
883-
FnKind::Fn(FnSig { header, decl, span }, generics, body) => {
891+
FnKind::Fn(_ctxt, _ident, FnSig { header, decl, span }, _visibility, generics, body) => {
884892
// Identifier and visibility are visited as a part of the item.
885893
vis.visit_fn_header(header);
886894
vis.visit_generics(generics);
@@ -890,8 +898,9 @@ fn walk_fn<T: MutVisitor>(vis: &mut T, kind: FnKind<'_>) {
890898
}
891899
vis.visit_span(span);
892900
}
893-
FnKind::Closure(binder, decl, body) => {
901+
FnKind::Closure(binder, coroutine_kind, decl, body) => {
894902
vis.visit_closure_binder(binder);
903+
coroutine_kind.as_mut().map(|coroutine_kind| vis.visit_coroutine_kind(coroutine_kind));
895904
vis.visit_fn_decl(decl);
896905
vis.visit_expr(body);
897906
}
@@ -1083,13 +1092,24 @@ pub fn walk_item_kind(
10831092
kind: &mut impl WalkItemKind,
10841093
span: Span,
10851094
id: NodeId,
1095+
ident: &mut Ident,
1096+
visibility: &mut Visibility,
1097+
ctxt: AssocCtxt,
10861098
vis: &mut impl MutVisitor,
10871099
) {
1088-
kind.walk(span, id, vis)
1100+
kind.walk(span, id, ident, visibility, ctxt, vis)
10891101
}
10901102

10911103
impl WalkItemKind for ItemKind {
1092-
fn walk(&mut self, span: Span, id: NodeId, vis: &mut impl MutVisitor) {
1104+
fn walk(
1105+
&mut self,
1106+
span: Span,
1107+
id: NodeId,
1108+
ident: &mut Ident,
1109+
visibility: &mut Visibility,
1110+
_ctxt: AssocCtxt,
1111+
vis: &mut impl MutVisitor,
1112+
) {
10931113
match self {
10941114
ItemKind::ExternCrate(_orig_name) => {}
10951115
ItemKind::Use(use_tree) => vis.visit_use_tree(use_tree),
@@ -1102,7 +1122,11 @@ impl WalkItemKind for ItemKind {
11021122
}
11031123
ItemKind::Fn(box Fn { defaultness, generics, sig, body }) => {
11041124
visit_defaultness(vis, defaultness);
1105-
vis.visit_fn(FnKind::Fn(sig, generics, body), span, id);
1125+
vis.visit_fn(
1126+
FnKind::Fn(FnCtxt::Free, ident, sig, visibility, generics, body),
1127+
span,
1128+
id,
1129+
);
11061130
}
11071131
ItemKind::Mod(safety, mod_kind) => {
11081132
visit_safety(vis, safety);
@@ -1201,14 +1225,26 @@ impl WalkItemKind for ItemKind {
12011225
}
12021226

12031227
impl WalkItemKind for AssocItemKind {
1204-
fn walk(&mut self, span: Span, id: NodeId, visitor: &mut impl MutVisitor) {
1228+
fn walk(
1229+
&mut self,
1230+
span: Span,
1231+
id: NodeId,
1232+
ident: &mut Ident,
1233+
visibility: &mut Visibility,
1234+
ctxt: AssocCtxt,
1235+
visitor: &mut impl MutVisitor,
1236+
) {
12051237
match self {
12061238
AssocItemKind::Const(item) => {
12071239
visit_const_item(item, visitor);
12081240
}
12091241
AssocItemKind::Fn(box Fn { defaultness, generics, sig, body }) => {
12101242
visit_defaultness(visitor, defaultness);
1211-
visitor.visit_fn(FnKind::Fn(sig, generics, body), span, id);
1243+
visitor.visit_fn(
1244+
FnKind::Fn(FnCtxt::Assoc(ctxt), ident, sig, visibility, generics, body),
1245+
span,
1246+
id,
1247+
);
12121248
}
12131249
AssocItemKind::Type(box TyAlias {
12141250
defaultness,
@@ -1288,32 +1324,51 @@ pub fn walk_crate<T: MutVisitor>(vis: &mut T, krate: &mut Crate) {
12881324
vis.visit_span(inject_use_span);
12891325
}
12901326

1291-
/// Mutates one item, returning the item again.
12921327
pub fn walk_flat_map_item<K: WalkItemKind>(
1328+
visitor: &mut impl MutVisitor,
1329+
item: P<Item<K>>,
1330+
) -> SmallVec<[P<Item<K>>; 1]> {
1331+
walk_flat_map_assoc_item(visitor, item, AssocCtxt::Trait /* ignored */)
1332+
}
1333+
1334+
pub fn walk_flat_map_assoc_item<K: WalkItemKind>(
12931335
visitor: &mut impl MutVisitor,
12941336
mut item: P<Item<K>>,
1337+
ctxt: AssocCtxt,
12951338
) -> SmallVec<[P<Item<K>>; 1]> {
12961339
let Item { ident, attrs, id, kind, vis, span, tokens } = item.deref_mut();
12971340
visitor.visit_id(id);
12981341
visit_attrs(visitor, attrs);
12991342
visitor.visit_vis(vis);
13001343
visitor.visit_ident(ident);
1301-
kind.walk(*span, *id, visitor);
1344+
kind.walk(*span, *id, ident, vis, ctxt, visitor);
13021345
visit_lazy_tts(visitor, tokens);
13031346
visitor.visit_span(span);
13041347
smallvec![item]
13051348
}
13061349

13071350
impl WalkItemKind for ForeignItemKind {
1308-
fn walk(&mut self, span: Span, id: NodeId, visitor: &mut impl MutVisitor) {
1351+
fn walk(
1352+
&mut self,
1353+
span: Span,
1354+
id: NodeId,
1355+
ident: &mut Ident,
1356+
visibility: &mut Visibility,
1357+
_ctxt: AssocCtxt,
1358+
visitor: &mut impl MutVisitor,
1359+
) {
13091360
match self {
13101361
ForeignItemKind::Static(box StaticItem { ty, mutability: _, expr, safety: _ }) => {
13111362
visitor.visit_ty(ty);
13121363
visit_opt(expr, |expr| visitor.visit_expr(expr));
13131364
}
13141365
ForeignItemKind::Fn(box Fn { defaultness, generics, sig, body }) => {
13151366
visit_defaultness(visitor, defaultness);
1316-
visitor.visit_fn(FnKind::Fn(sig, generics, body), span, id);
1367+
visitor.visit_fn(
1368+
FnKind::Fn(FnCtxt::Foreign, ident, sig, visibility, generics, body),
1369+
span,
1370+
id,
1371+
);
13171372
}
13181373
ForeignItemKind::TyAlias(box TyAlias {
13191374
defaultness,
@@ -1522,9 +1577,8 @@ pub fn walk_expr<T: MutVisitor>(vis: &mut T, Expr { kind, id, span, attrs, token
15221577
fn_arg_span,
15231578
}) => {
15241579
visit_constness(vis, constness);
1525-
coroutine_kind.as_mut().map(|coroutine_kind| vis.visit_coroutine_kind(coroutine_kind));
15261580
vis.visit_capture_by(capture_clause);
1527-
vis.visit_fn(FnKind::Closure(binder, fn_decl, body), *span, *id);
1581+
vis.visit_fn(FnKind::Closure(binder, coroutine_kind, fn_decl, body), *span, *id);
15281582
vis.visit_span(fn_decl_span);
15291583
vis.visit_span(fn_arg_span);
15301584
}
@@ -1785,8 +1839,20 @@ impl<N: DummyAstNode, T: DummyAstNode> DummyAstNode for crate::ast_traits::AstNo
17851839
#[derive(Debug)]
17861840
pub enum FnKind<'a> {
17871841
/// E.g., `fn foo()`, `fn foo(&self)`, or `extern "Abi" fn foo()`.
1788-
Fn(&'a mut FnSig, &'a mut Generics, &'a mut Option<P<Block>>),
1842+
Fn(
1843+
FnCtxt,
1844+
&'a mut Ident,
1845+
&'a mut FnSig,
1846+
&'a mut Visibility,
1847+
&'a mut Generics,
1848+
&'a mut Option<P<Block>>,
1849+
),
17891850

17901851
/// E.g., `|x, y| body`.
1791-
Closure(&'a mut ClosureBinder, &'a mut P<FnDecl>, &'a mut P<Expr>),
1852+
Closure(
1853+
&'a mut ClosureBinder,
1854+
&'a mut Option<CoroutineKind>,
1855+
&'a mut P<FnDecl>,
1856+
&'a mut P<Expr>,
1857+
),
17921858
}

compiler/rustc_ast/src/visit.rs

+9-10
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ impl BoundKind {
6666
#[derive(Copy, Clone, Debug)]
6767
pub enum FnKind<'a> {
6868
/// E.g., `fn foo()`, `fn foo(&self)`, or `extern "Abi" fn foo()`.
69-
Fn(FnCtxt, Ident, &'a FnSig, &'a Visibility, &'a Generics, Option<&'a Block>),
69+
Fn(FnCtxt, &'a Ident, &'a FnSig, &'a Visibility, &'a Generics, &'a Option<P<Block>>),
7070

7171
/// E.g., `|x, y| body`.
7272
Closure(&'a ClosureBinder, &'a Option<CoroutineKind>, &'a FnDecl, &'a Expr),
@@ -357,7 +357,7 @@ impl WalkItemKind for ItemKind {
357357
visit_opt!(visitor, visit_expr, expr);
358358
}
359359
ItemKind::Fn(box Fn { defaultness: _, generics, sig, body }) => {
360-
let kind = FnKind::Fn(FnCtxt::Free, *ident, sig, vis, generics, body.as_deref());
360+
let kind = FnKind::Fn(FnCtxt::Free, ident, sig, vis, generics, body);
361361
try_visit!(visitor.visit_fn(kind, *span, *id));
362362
}
363363
ItemKind::Mod(_unsafety, mod_kind) => match mod_kind {
@@ -687,15 +687,15 @@ impl WalkItemKind for ForeignItemKind {
687687
_ctxt: AssocCtxt,
688688
visitor: &mut V,
689689
) -> V::Result {
690-
let &Item { id, span, ident, ref vis, .. } = item;
690+
let Item { id, span, ident, vis, .. } = item;
691691
match self {
692692
ForeignItemKind::Static(box StaticItem { ty, mutability: _, expr, safety: _ }) => {
693693
try_visit!(visitor.visit_ty(ty));
694694
visit_opt!(visitor, visit_expr, expr);
695695
}
696696
ForeignItemKind::Fn(box Fn { defaultness: _, generics, sig, body }) => {
697-
let kind = FnKind::Fn(FnCtxt::Foreign, ident, sig, vis, generics, body.as_deref());
698-
try_visit!(visitor.visit_fn(kind, span, id));
697+
let kind = FnKind::Fn(FnCtxt::Foreign, ident, sig, vis, generics, body);
698+
try_visit!(visitor.visit_fn(kind, *span, *id));
699699
}
700700
ForeignItemKind::TyAlias(box TyAlias {
701701
generics,
@@ -850,17 +850,16 @@ impl WalkItemKind for AssocItemKind {
850850
ctxt: AssocCtxt,
851851
visitor: &mut V,
852852
) -> V::Result {
853-
let &Item { id, span, ident, ref vis, .. } = item;
853+
let Item { id, span, ident, vis, .. } = item;
854854
match self {
855855
AssocItemKind::Const(box ConstItem { defaultness: _, generics, ty, expr }) => {
856856
try_visit!(visitor.visit_generics(generics));
857857
try_visit!(visitor.visit_ty(ty));
858858
visit_opt!(visitor, visit_expr, expr);
859859
}
860860
AssocItemKind::Fn(box Fn { defaultness: _, generics, sig, body }) => {
861-
let kind =
862-
FnKind::Fn(FnCtxt::Assoc(ctxt), ident, sig, vis, generics, body.as_deref());
863-
try_visit!(visitor.visit_fn(kind, span, id));
861+
let kind = FnKind::Fn(FnCtxt::Assoc(ctxt), ident, sig, vis, generics, body);
862+
try_visit!(visitor.visit_fn(kind, *span, *id));
864863
}
865864
AssocItemKind::Type(box TyAlias {
866865
generics,
@@ -891,7 +890,7 @@ impl WalkItemKind for AssocItemKind {
891890
}
892891
AssocItemKind::DelegationMac(box DelegationMac { qself, prefix, suffixes, body }) => {
893892
try_visit!(walk_qself(visitor, qself));
894-
try_visit!(visitor.visit_path(prefix, id));
893+
try_visit!(visitor.visit_path(prefix, *id));
895894
if let Some(suffixes) = suffixes {
896895
for (ident, rename) in suffixes {
897896
visitor.visit_ident(ident);

compiler/rustc_ast_passes/src/ast_validation.rs

+3-10
Original file line numberDiff line numberDiff line change
@@ -946,8 +946,7 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
946946

947947
self.visit_vis(&item.vis);
948948
self.visit_ident(&item.ident);
949-
let kind =
950-
FnKind::Fn(FnCtxt::Free, item.ident, sig, &item.vis, generics, body.as_deref());
949+
let kind = FnKind::Fn(FnCtxt::Free, &item.ident, sig, &item.vis, generics, body);
951950
self.visit_fn(kind, item.span, item.id);
952951
walk_list!(self, visit_attribute, &item.attrs);
953952
return; // Avoid visiting again.
@@ -1476,14 +1475,8 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
14761475
{
14771476
self.visit_vis(&item.vis);
14781477
self.visit_ident(&item.ident);
1479-
let kind = FnKind::Fn(
1480-
FnCtxt::Assoc(ctxt),
1481-
item.ident,
1482-
sig,
1483-
&item.vis,
1484-
generics,
1485-
body.as_deref(),
1486-
);
1478+
let kind =
1479+
FnKind::Fn(FnCtxt::Assoc(ctxt), &item.ident, sig, &item.vis, generics, body);
14871480
walk_list!(self, visit_attribute, &item.attrs);
14881481
self.visit_fn(kind, item.span, item.id);
14891482
}

compiler/rustc_builtin_macros/src/test_harness.rs

+10-2
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use rustc_ast as ast;
66
use rustc_ast::entry::EntryPointType;
77
use rustc_ast::mut_visit::*;
88
use rustc_ast::ptr::P;
9-
use rustc_ast::visit::{Visitor, walk_item};
9+
use rustc_ast::visit::{AssocCtxt, Visitor, walk_item};
1010
use rustc_ast::{ModKind, attr};
1111
use rustc_errors::DiagCtxtHandle;
1212
use rustc_expand::base::{ExtCtxt, ResolverExpand};
@@ -144,7 +144,15 @@ impl<'a> MutVisitor for TestHarnessGenerator<'a> {
144144
item.kind
145145
{
146146
let prev_tests = mem::take(&mut self.tests);
147-
walk_item_kind(&mut item.kind, item.span, item.id, self);
147+
walk_item_kind(
148+
&mut item.kind,
149+
item.span,
150+
item.id,
151+
&mut item.ident,
152+
&mut item.vis,
153+
AssocCtxt::Trait, /* ignored */
154+
self,
155+
);
148156
self.add_test_cases(item.id, span, prev_tests);
149157
} else {
150158
// But in those cases, we emit a lint to warn the user of these missing tests.

src/tools/rustfmt/src/items.rs

+2-9
Original file line numberDiff line numberDiff line change
@@ -3449,21 +3449,14 @@ impl Rewrite for ast::ForeignItem {
34493449
ref generics,
34503450
ref body,
34513451
} = **fn_kind;
3452-
if let Some(ref body) = body {
3452+
if body.is_some() {
34533453
let mut visitor = FmtVisitor::from_context(context);
34543454
visitor.block_indent = shape.indent;
34553455
visitor.last_pos = self.span.lo();
34563456
let inner_attrs = inner_attributes(&self.attrs);
34573457
let fn_ctxt = visit::FnCtxt::Foreign;
34583458
visitor.visit_fn(
3459-
visit::FnKind::Fn(
3460-
fn_ctxt,
3461-
self.ident,
3462-
sig,
3463-
&self.vis,
3464-
generics,
3465-
Some(body),
3466-
),
3459+
visit::FnKind::Fn(fn_ctxt, &self.ident, sig, &self.vis, generics, body),
34673460
&sig.decl,
34683461
self.span,
34693462
defaultness,

0 commit comments

Comments
 (0)