Skip to content

Commit b63d35b

Browse files
committed
Mutable
1 parent 6f16b45 commit b63d35b

File tree

2 files changed

+20
-17
lines changed

2 files changed

+20
-17
lines changed

compiler/rustc_ast/src/mut_visit.rs

Lines changed: 19 additions & 16 deletions
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,7 @@ 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(&mut self, span: Span, id: NodeId, ident: &mut Ident, visibility: &mut Visibility, visitor: &mut impl MutVisitor);
4141
}
4242

4343
pub trait MutVisitor: Sized {
@@ -880,7 +880,7 @@ fn walk_coroutine_kind<T: MutVisitor>(vis: &mut T, coroutine_kind: &mut Coroutin
880880

881881
fn walk_fn<T: MutVisitor>(vis: &mut T, kind: FnKind<'_>) {
882882
match kind {
883-
FnKind::Fn(FnSig { header, decl, span }, generics, body) => {
883+
FnKind::Fn(_ctxt, _ident, FnSig { header, decl, span }, _visibility, generics, body) => {
884884
// Identifier and visibility are visited as a part of the item.
885885
vis.visit_fn_header(header);
886886
vis.visit_generics(generics);
@@ -890,8 +890,9 @@ fn walk_fn<T: MutVisitor>(vis: &mut T, kind: FnKind<'_>) {
890890
}
891891
vis.visit_span(span);
892892
}
893-
FnKind::Closure(binder, decl, body) => {
893+
FnKind::Closure(binder, coroutine_kind, decl, body) => {
894894
vis.visit_closure_binder(binder);
895+
coroutine_kind.as_mut().map(|coroutine_kind| vis.visit_coroutine_kind(coroutine_kind));
895896
vis.visit_fn_decl(decl);
896897
vis.visit_expr(body);
897898
}
@@ -1083,13 +1084,15 @@ pub fn walk_item_kind(
10831084
kind: &mut impl WalkItemKind,
10841085
span: Span,
10851086
id: NodeId,
1087+
ident: &mut Ident,
1088+
visibility: &mut Visibility,
10861089
vis: &mut impl MutVisitor,
10871090
) {
1088-
kind.walk(span, id, vis)
1091+
kind.walk(span, id, ident, visibility, vis)
10891092
}
10901093

10911094
impl WalkItemKind for ItemKind {
1092-
fn walk(&mut self, span: Span, id: NodeId, vis: &mut impl MutVisitor) {
1095+
fn walk(&mut self, span: Span, id: NodeId, ident: &mut Ident, visibility: &mut Visibility, vis: &mut impl MutVisitor) {
10931096
match self {
10941097
ItemKind::ExternCrate(_orig_name) => {}
10951098
ItemKind::Use(use_tree) => vis.visit_use_tree(use_tree),
@@ -1102,7 +1105,7 @@ impl WalkItemKind for ItemKind {
11021105
}
11031106
ItemKind::Fn(box Fn { defaultness, generics, sig, body }) => {
11041107
visit_defaultness(vis, defaultness);
1105-
vis.visit_fn(FnKind::Fn(sig, generics, body), span, id);
1108+
vis.visit_fn(FnKind::Fn(FnCtxt::Free, ident, sig, visibility, generics, body), span, id);
11061109
}
11071110
ItemKind::Mod(safety, mod_kind) => {
11081111
visit_safety(vis, safety);
@@ -1201,14 +1204,15 @@ impl WalkItemKind for ItemKind {
12011204
}
12021205

12031206
impl WalkItemKind for AssocItemKind {
1204-
fn walk(&mut self, span: Span, id: NodeId, visitor: &mut impl MutVisitor) {
1207+
fn walk(&mut self, span: Span, id: NodeId, ident: &mut Ident, visibility: &mut Visibility, visitor: &mut impl MutVisitor) {
12051208
match self {
12061209
AssocItemKind::Const(item) => {
12071210
visit_const_item(item, visitor);
12081211
}
12091212
AssocItemKind::Fn(box Fn { defaultness, generics, sig, body }) => {
12101213
visit_defaultness(visitor, defaultness);
1211-
visitor.visit_fn(FnKind::Fn(sig, generics, body), span, id);
1214+
// TODO: use AssocCtxt
1215+
visitor.visit_fn(FnKind::Fn(FnCtxt::Free, ident, sig, visibility, generics, body), span, id);
12121216
}
12131217
AssocItemKind::Type(box TyAlias {
12141218
defaultness,
@@ -1298,22 +1302,22 @@ pub fn walk_flat_map_item<K: WalkItemKind>(
12981302
visit_attrs(visitor, attrs);
12991303
visitor.visit_vis(vis);
13001304
visitor.visit_ident(ident);
1301-
kind.walk(*span, *id, visitor);
1305+
kind.walk(*span, *id, ident, vis, visitor);
13021306
visit_lazy_tts(visitor, tokens);
13031307
visitor.visit_span(span);
13041308
smallvec![item]
13051309
}
13061310

13071311
impl WalkItemKind for ForeignItemKind {
1308-
fn walk(&mut self, span: Span, id: NodeId, visitor: &mut impl MutVisitor) {
1312+
fn walk(&mut self, span: Span, id: NodeId, ident: &mut Ident, visibility: &mut Visibility, visitor: &mut impl MutVisitor) {
13091313
match self {
13101314
ForeignItemKind::Static(box StaticItem { ty, mutability: _, expr, safety: _ }) => {
13111315
visitor.visit_ty(ty);
13121316
visit_opt(expr, |expr| visitor.visit_expr(expr));
13131317
}
13141318
ForeignItemKind::Fn(box Fn { defaultness, generics, sig, body }) => {
13151319
visit_defaultness(visitor, defaultness);
1316-
visitor.visit_fn(FnKind::Fn(sig, generics, body), span, id);
1320+
visitor.visit_fn(FnKind::Fn(FnCtxt::Foreign, ident, sig, visibility, generics, body), span, id);
13171321
}
13181322
ForeignItemKind::TyAlias(box TyAlias {
13191323
defaultness,
@@ -1522,9 +1526,8 @@ pub fn walk_expr<T: MutVisitor>(vis: &mut T, Expr { kind, id, span, attrs, token
15221526
fn_arg_span,
15231527
}) => {
15241528
visit_constness(vis, constness);
1525-
coroutine_kind.as_mut().map(|coroutine_kind| vis.visit_coroutine_kind(coroutine_kind));
15261529
vis.visit_capture_by(capture_clause);
1527-
vis.visit_fn(FnKind::Closure(binder, fn_decl, body), *span, *id);
1530+
vis.visit_fn(FnKind::Closure(binder, coroutine_kind, fn_decl, body), *span, *id);
15281531
vis.visit_span(fn_decl_span);
15291532
vis.visit_span(fn_arg_span);
15301533
}
@@ -1785,8 +1788,8 @@ impl<N: DummyAstNode, T: DummyAstNode> DummyAstNode for crate::ast_traits::AstNo
17851788
#[derive(Debug)]
17861789
pub enum FnKind<'a> {
17871790
/// 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>>),
1791+
Fn(FnCtxt, &'a mut Ident, &'a mut FnSig, &'a mut Visibility, &'a mut Generics, &'a mut Option<P<Block>>),
17891792

17901793
/// E.g., `|x, y| body`.
1791-
Closure(&'a mut ClosureBinder, &'a mut P<FnDecl>, &'a mut P<Expr>),
1794+
Closure(&'a mut ClosureBinder, &'a mut Option<CoroutineKind>, &'a mut P<FnDecl>, &'a mut P<Expr>),
17921795
}

compiler/rustc_builtin_macros/src/test_harness.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ 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(&mut item.kind, item.span, item.id, &mut item.ident, &mut item.vis, self);
148148
self.add_test_cases(item.id, span, prev_tests);
149149
} else {
150150
// But in those cases, we emit a lint to warn the user of these missing tests.

0 commit comments

Comments
 (0)