Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 036b38c

Browse files
committedJun 27, 2024
Auto merge of #126993 - petrochenkov:atvisord3, r=BoxyUwU
ast: Standardize visiting order Order: ID, attributes, inner nodes in source order if possible, tokens, span. Also always use exhaustive matching in visiting infra, and visit some discovered missing nodes. Unlike #125741 this shouldn't affect anything serious like `macro_rules` scopes.
2 parents a4ce33c + ba3f681 commit 036b38c

File tree

3 files changed

+389
-317
lines changed

3 files changed

+389
-317
lines changed
 

‎compiler/rustc_ast/src/mut_visit.rs

Lines changed: 107 additions & 99 deletions
Original file line numberDiff line numberDiff line change
@@ -402,10 +402,10 @@ fn visit_attr_args<T: MutVisitor>(args: &mut AttrArgs, vis: &mut T) {
402402
AttrArgs::Empty => {}
403403
AttrArgs::Delimited(args) => visit_delim_args(args, vis),
404404
AttrArgs::Eq(eq_span, AttrArgsEq::Ast(expr)) => {
405-
vis.visit_span(eq_span);
406405
vis.visit_expr(expr);
406+
vis.visit_span(eq_span);
407407
}
408-
AttrArgs::Eq(_, AttrArgsEq::Hir(lit)) => {
408+
AttrArgs::Eq(_eq_span, AttrArgsEq::Hir(lit)) => {
409409
unreachable!("in literal form when visiting mac args eq: {:?}", lit)
410410
}
411411
}
@@ -414,13 +414,13 @@ fn visit_attr_args<T: MutVisitor>(args: &mut AttrArgs, vis: &mut T) {
414414
// No `noop_` prefix because there isn't a corresponding method in `MutVisitor`.
415415
fn visit_delim_args<T: MutVisitor>(args: &mut DelimArgs, vis: &mut T) {
416416
let DelimArgs { dspan, delim: _, tokens } = args;
417-
visit_delim_span(dspan, vis);
418417
visit_tts(tokens, vis);
418+
visit_delim_span(dspan, vis);
419419
}
420420

421-
pub fn visit_delim_span<T: MutVisitor>(dspan: &mut DelimSpan, vis: &mut T) {
422-
vis.visit_span(&mut dspan.open);
423-
vis.visit_span(&mut dspan.close);
421+
pub fn visit_delim_span<T: MutVisitor>(DelimSpan { open, close }: &mut DelimSpan, vis: &mut T) {
422+
vis.visit_span(open);
423+
vis.visit_span(close);
424424
}
425425

426426
pub fn noop_flat_map_pat_field<T: MutVisitor>(
@@ -441,11 +441,12 @@ fn noop_visit_use_tree<T: MutVisitor>(use_tree: &mut UseTree, vis: &mut T) {
441441
vis.visit_path(prefix);
442442
match kind {
443443
UseTreeKind::Simple(rename) => visit_opt(rename, |rename| vis.visit_ident(rename)),
444-
UseTreeKind::Nested { items, .. } => {
444+
UseTreeKind::Nested { items, span } => {
445445
for (tree, id) in items {
446446
vis.visit_id(id);
447447
vis.visit_use_tree(tree);
448448
}
449+
vis.visit_span(span);
449450
}
450451
UseTreeKind::Glob => {}
451452
}
@@ -486,12 +487,9 @@ pub fn noop_visit_ty<T: MutVisitor>(ty: &mut P<Ty>, vis: &mut T) {
486487
let Ty { id, kind, span, tokens } = ty.deref_mut();
487488
vis.visit_id(id);
488489
match kind {
489-
TyKind::Infer
490-
| TyKind::ImplicitSelf
491-
| TyKind::Err(_)
492-
| TyKind::Dummy
493-
| TyKind::Never
494-
| TyKind::CVarArgs => {}
490+
TyKind::Err(_guar) => {}
491+
TyKind::Infer | TyKind::ImplicitSelf | TyKind::Dummy | TyKind::Never | TyKind::CVarArgs => {
492+
}
495493
TyKind::Slice(ty) => vis.visit_ty(ty),
496494
TyKind::Ptr(mt) => vis.visit_mt(mt),
497495
TyKind::Ref(lt, mt) => {
@@ -533,8 +531,8 @@ pub fn noop_visit_ty<T: MutVisitor>(ty: &mut P<Ty>, vis: &mut T) {
533531
fields.flat_map_in_place(|field| vis.flat_map_field_def(field));
534532
}
535533
}
536-
vis.visit_span(span);
537534
visit_lazy_tts(tokens, vis);
535+
vis.visit_span(span);
538536
}
539537

540538
fn noop_visit_foreign_mod<T: MutVisitor>(foreign_mod: &mut ForeignMod, vis: &mut T) {
@@ -550,8 +548,8 @@ pub fn noop_flat_map_variant<T: MutVisitor>(
550548
let Variant { ident, vis, attrs, id, data, disr_expr, span, is_placeholder: _ } = &mut variant;
551549
visitor.visit_id(id);
552550
visit_attrs(attrs, visitor);
553-
visitor.visit_ident(ident);
554551
visitor.visit_vis(vis);
552+
visitor.visit_ident(ident);
555553
visitor.visit_variant_data(data);
556554
visit_opt(disr_expr, |disr_expr| visitor.visit_anon_const(disr_expr));
557555
visitor.visit_span(span);
@@ -563,13 +561,13 @@ fn noop_visit_ident<T: MutVisitor>(Ident { name: _, span }: &mut Ident, vis: &mu
563561
}
564562

565563
fn noop_visit_path<T: MutVisitor>(Path { segments, span, tokens }: &mut Path, vis: &mut T) {
566-
vis.visit_span(span);
567564
for PathSegment { ident, id, args } in segments {
568565
vis.visit_id(id);
569566
vis.visit_ident(ident);
570567
visit_opt(args, |args| vis.visit_generic_args(args));
571568
}
572569
visit_lazy_tts(tokens, vis);
570+
vis.visit_span(span);
573571
}
574572

575573
fn noop_visit_qself<T: MutVisitor>(qself: &mut Option<P<QSelf>>, vis: &mut T) {
@@ -611,10 +609,11 @@ fn noop_visit_parenthesized_parameter_data<T: MutVisitor>(
611609
args: &mut ParenthesizedArgs,
612610
vis: &mut T,
613611
) {
614-
let ParenthesizedArgs { inputs, output, span, .. } = args;
612+
let ParenthesizedArgs { inputs, output, span, inputs_span } = args;
615613
visit_thin_vec(inputs, |input| vis.visit_ty(input));
616614
noop_visit_fn_ret_ty(output, vis);
617615
vis.visit_span(span);
616+
vis.visit_span(inputs_span);
618617
}
619618

620619
fn noop_visit_local<T: MutVisitor>(local: &mut P<Local>, vis: &mut T) {
@@ -633,9 +632,9 @@ fn noop_visit_local<T: MutVisitor>(local: &mut P<Local>, vis: &mut T) {
633632
vis.visit_block(els);
634633
}
635634
}
636-
vis.visit_span(span);
637-
visit_opt(colon_sp, |sp| vis.visit_span(sp));
638635
visit_lazy_tts(tokens, vis);
636+
visit_opt(colon_sp, |sp| vis.visit_span(sp));
637+
vis.visit_span(span);
639638
}
640639

641640
fn noop_visit_attribute<T: MutVisitor>(attr: &mut Attribute, vis: &mut T) {
@@ -651,7 +650,7 @@ fn noop_visit_attribute<T: MutVisitor>(attr: &mut Attribute, vis: &mut T) {
651650
visit_lazy_tts(tokens, vis);
652651
visit_lazy_tts(attr_tokens, vis);
653652
}
654-
AttrKind::DocComment(..) => {}
653+
AttrKind::DocComment(_kind, _sym) => {}
655654
}
656655
vis.visit_span(span);
657656
}
@@ -689,48 +688,37 @@ pub fn noop_flat_map_param<T: MutVisitor>(mut param: Param, vis: &mut T) -> Smal
689688
vis.visit_id(id);
690689
visit_attrs(attrs, vis);
691690
vis.visit_pat(pat);
692-
vis.visit_span(span);
693691
vis.visit_ty(ty);
692+
vis.visit_span(span);
694693
smallvec![param]
695694
}
696695

697696
// No `noop_` prefix because there isn't a corresponding method in `MutVisitor`.
698697
fn visit_attr_tt<T: MutVisitor>(tt: &mut AttrTokenTree, vis: &mut T) {
699698
match tt {
700-
AttrTokenTree::Token(token, _) => {
699+
AttrTokenTree::Token(token, _spacing) => {
701700
visit_token(token, vis);
702701
}
703-
AttrTokenTree::Delimited(DelimSpan { open, close }, _spacing, _delim, tts) => {
704-
vis.visit_span(open);
705-
vis.visit_span(close);
702+
AttrTokenTree::Delimited(dspan, _spacing, _delim, tts) => {
706703
visit_attr_tts(tts, vis);
704+
visit_delim_span(dspan, vis);
707705
}
708-
AttrTokenTree::Attributes(data) => {
709-
for attr in &mut *data.attrs {
710-
match &mut attr.kind {
711-
AttrKind::Normal(normal) => {
712-
visit_lazy_tts(&mut normal.tokens, vis);
713-
}
714-
AttrKind::DocComment(..) => {
715-
vis.visit_span(&mut attr.span);
716-
}
717-
}
718-
}
719-
visit_lazy_tts_opt_mut(Some(&mut data.tokens), vis);
706+
AttrTokenTree::Attributes(AttributesData { attrs, tokens }) => {
707+
visit_attrs(attrs, vis);
708+
visit_lazy_tts_opt_mut(Some(tokens), vis);
720709
}
721710
}
722711
}
723712

724713
// No `noop_` prefix because there isn't a corresponding method in `MutVisitor`.
725714
fn visit_tt<T: MutVisitor>(tt: &mut TokenTree, vis: &mut T) {
726715
match tt {
727-
TokenTree::Token(token, _) => {
716+
TokenTree::Token(token, _spacing) => {
728717
visit_token(token, vis);
729718
}
730-
TokenTree::Delimited(DelimSpan { open, close }, _spacing, _delim, tts) => {
731-
vis.visit_span(open);
732-
vis.visit_span(close);
719+
TokenTree::Delimited(dspan, _spacing, _delim, tts) => {
733720
visit_tts(tts, vis);
721+
visit_delim_span(dspan, vis);
734722
}
735723
}
736724
}
@@ -771,7 +759,7 @@ fn visit_lazy_tts<T: MutVisitor>(lazy_tts: &mut Option<LazyAttrTokenStream>, vis
771759
pub fn visit_token<T: MutVisitor>(t: &mut Token, vis: &mut T) {
772760
let Token { kind, span } = t;
773761
match kind {
774-
token::Ident(name, _) | token::Lifetime(name) => {
762+
token::Ident(name, _ /*raw*/) | token::Lifetime(name) => {
775763
let mut ident = Ident::new(*name, *span);
776764
vis.visit_ident(&mut ident);
777765
*name = ident.name;
@@ -918,10 +906,11 @@ fn noop_visit_param_bound<T: MutVisitor>(pb: &mut GenericBound, vis: &mut T) {
918906
match pb {
919907
GenericBound::Trait(ty, _modifier) => vis.visit_poly_trait_ref(ty),
920908
GenericBound::Outlives(lifetime) => noop_visit_lifetime(lifetime, vis),
921-
GenericBound::Use(args, _) => {
909+
GenericBound::Use(args, span) => {
922910
for arg in args {
923911
vis.visit_precise_capturing_arg(arg);
924912
}
913+
vis.visit_span(span);
925914
}
926915
}
927916
}
@@ -946,9 +935,6 @@ pub fn noop_flat_map_generic_param<T: MutVisitor>(
946935
vis.visit_id(id);
947936
visit_attrs(attrs, vis);
948937
vis.visit_ident(ident);
949-
if let Some(colon_span) = colon_span {
950-
vis.visit_span(colon_span);
951-
}
952938
visit_vec(bounds, |bound| noop_visit_param_bound(bound, vis));
953939
match kind {
954940
GenericParamKind::Lifetime => {}
@@ -960,6 +946,9 @@ pub fn noop_flat_map_generic_param<T: MutVisitor>(
960946
visit_opt(default, |default| vis.visit_anon_const(default));
961947
}
962948
}
949+
if let Some(colon_span) = colon_span {
950+
vis.visit_span(colon_span);
951+
}
963952
smallvec![param]
964953
}
965954

@@ -979,6 +968,14 @@ fn noop_visit_generics<T: MutVisitor>(generics: &mut Generics, vis: &mut T) {
979968
vis.visit_span(span);
980969
}
981970

971+
fn noop_visit_ty_alias_where_clauses<T: MutVisitor>(tawcs: &mut TyAliasWhereClauses, vis: &mut T) {
972+
let TyAliasWhereClauses { before, after, split: _ } = tawcs;
973+
let TyAliasWhereClause { has_where_token: _, span: span_before } = before;
974+
let TyAliasWhereClause { has_where_token: _, span: span_after } = after;
975+
vis.visit_span(span_before);
976+
vis.visit_span(span_after);
977+
}
978+
982979
fn noop_visit_where_clause<T: MutVisitor>(wc: &mut WhereClause, vis: &mut T) {
983980
let WhereClause { has_where_token: _, predicates, span } = wc;
984981
visit_thin_vec(predicates, |predicate| vis.visit_where_predicate(predicate));
@@ -989,29 +986,29 @@ fn noop_visit_where_predicate<T: MutVisitor>(pred: &mut WherePredicate, vis: &mu
989986
match pred {
990987
WherePredicate::BoundPredicate(bp) => {
991988
let WhereBoundPredicate { span, bound_generic_params, bounded_ty, bounds } = bp;
992-
vis.visit_span(span);
993989
bound_generic_params.flat_map_in_place(|param| vis.flat_map_generic_param(param));
994990
vis.visit_ty(bounded_ty);
995991
visit_vec(bounds, |bound| vis.visit_param_bound(bound));
992+
vis.visit_span(span);
996993
}
997994
WherePredicate::RegionPredicate(rp) => {
998995
let WhereRegionPredicate { span, lifetime, bounds } = rp;
999-
vis.visit_span(span);
1000996
noop_visit_lifetime(lifetime, vis);
1001997
visit_vec(bounds, |bound| noop_visit_param_bound(bound, vis));
998+
vis.visit_span(span);
1002999
}
10031000
WherePredicate::EqPredicate(ep) => {
10041001
let WhereEqPredicate { span, lhs_ty, rhs_ty } = ep;
1005-
vis.visit_span(span);
10061002
vis.visit_ty(lhs_ty);
10071003
vis.visit_ty(rhs_ty);
1004+
vis.visit_span(span);
10081005
}
10091006
}
10101007
}
10111008

10121009
fn noop_visit_variant_data<T: MutVisitor>(vdata: &mut VariantData, vis: &mut T) {
10131010
match vdata {
1014-
VariantData::Struct { fields, .. } => {
1011+
VariantData::Struct { fields, recovered: _ } => {
10151012
fields.flat_map_in_place(|field| vis.flat_map_field_def(field));
10161013
}
10171014
VariantData::Tuple(fields, id) => {
@@ -1041,10 +1038,10 @@ pub fn noop_flat_map_field_def<T: MutVisitor>(
10411038
let FieldDef { span, ident, vis, id, ty, attrs, is_placeholder: _ } = &mut fd;
10421039
visitor.visit_id(id);
10431040
visit_attrs(attrs, visitor);
1044-
visitor.visit_span(span);
1045-
visit_opt(ident, |ident| visitor.visit_ident(ident));
10461041
visitor.visit_vis(vis);
1042+
visit_opt(ident, |ident| visitor.visit_ident(ident));
10471043
visitor.visit_ty(ty);
1044+
visitor.visit_span(span);
10481045
smallvec![fd]
10491046
}
10501047

@@ -1069,8 +1066,8 @@ pub fn noop_visit_block<T: MutVisitor>(block: &mut P<Block>, vis: &mut T) {
10691066
let Block { id, stmts, rules: _, span, tokens, could_be_bare_literal: _ } = block.deref_mut();
10701067
vis.visit_id(id);
10711068
stmts.flat_map_in_place(|stmt| vis.flat_map_stmt(stmt));
1072-
vis.visit_span(span);
10731069
visit_lazy_tts(tokens, vis);
1070+
vis.visit_span(span);
10741071
}
10751072

10761073
pub fn noop_visit_item_kind(kind: &mut impl NoopVisitItemKind, vis: &mut impl MutVisitor) {
@@ -1091,45 +1088,37 @@ impl NoopVisitItemKind for ItemKind {
10911088
}
10921089
ItemKind::Fn(box Fn { defaultness, generics, sig, body }) => {
10931090
visit_defaultness(defaultness, vis);
1094-
visit_fn_sig(sig, vis);
10951091
vis.visit_generics(generics);
1092+
visit_fn_sig(sig, vis);
10961093
visit_opt(body, |body| vis.visit_block(body));
10971094
}
10981095
ItemKind::Mod(safety, mod_kind) => {
10991096
visit_safety(safety, vis);
11001097
match mod_kind {
11011098
ModKind::Loaded(items, _inline, ModSpans { inner_span, inject_use_span }) => {
1099+
items.flat_map_in_place(|item| vis.flat_map_item(item));
11021100
vis.visit_span(inner_span);
11031101
vis.visit_span(inject_use_span);
1104-
items.flat_map_in_place(|item| vis.flat_map_item(item));
11051102
}
11061103
ModKind::Unloaded => {}
11071104
}
11081105
}
11091106
ItemKind::ForeignMod(nm) => vis.visit_foreign_mod(nm),
11101107
ItemKind::GlobalAsm(asm) => vis.visit_inline_asm(asm),
1111-
ItemKind::TyAlias(box TyAlias {
1112-
defaultness,
1113-
generics,
1114-
where_clauses,
1115-
bounds,
1116-
ty,
1117-
..
1118-
}) => {
1108+
ItemKind::TyAlias(box TyAlias { defaultness, generics, where_clauses, bounds, ty }) => {
11191109
visit_defaultness(defaultness, vis);
11201110
vis.visit_generics(generics);
1121-
vis.visit_span(&mut where_clauses.before.span);
1122-
vis.visit_span(&mut where_clauses.after.span);
11231111
visit_bounds(bounds, vis);
11241112
visit_opt(ty, |ty| vis.visit_ty(ty));
1113+
noop_visit_ty_alias_where_clauses(where_clauses, vis);
11251114
}
11261115
ItemKind::Enum(EnumDef { variants }, generics) => {
1127-
variants.flat_map_in_place(|variant| vis.flat_map_variant(variant));
11281116
vis.visit_generics(generics);
1117+
variants.flat_map_in_place(|variant| vis.flat_map_variant(variant));
11291118
}
11301119
ItemKind::Struct(variant_data, generics) | ItemKind::Union(variant_data, generics) => {
1131-
vis.visit_variant_data(variant_data);
11321120
vis.visit_generics(generics);
1121+
vis.visit_variant_data(variant_data);
11331122
}
11341123
ItemKind::Impl(box Impl {
11351124
defaultness,
@@ -1217,14 +1206,12 @@ impl NoopVisitItemKind for AssocItemKind {
12171206
where_clauses,
12181207
bounds,
12191208
ty,
1220-
..
12211209
}) => {
12221210
visit_defaultness(defaultness, visitor);
12231211
visitor.visit_generics(generics);
1224-
visitor.visit_span(&mut where_clauses.before.span);
1225-
visitor.visit_span(&mut where_clauses.after.span);
12261212
visit_bounds(bounds, visitor);
12271213
visit_opt(ty, |ty| visitor.visit_ty(ty));
1214+
noop_visit_ty_alias_where_clauses(where_clauses, visitor);
12281215
}
12291216
AssocItemKind::MacCall(mac) => visitor.visit_mac_call(mac),
12301217
AssocItemKind::Delegation(box Delegation {
@@ -1302,8 +1289,8 @@ pub fn noop_flat_map_item<K: NoopVisitItemKind>(
13021289
visitor.visit_vis(vis);
13031290
visitor.visit_ident(ident);
13041291
kind.noop_visit(visitor);
1305-
visitor.visit_span(span);
13061292
visit_lazy_tts(tokens, visitor);
1293+
visitor.visit_span(span);
13071294
smallvec![item]
13081295
}
13091296

@@ -1326,14 +1313,12 @@ impl NoopVisitItemKind for ForeignItemKind {
13261313
where_clauses,
13271314
bounds,
13281315
ty,
1329-
..
13301316
}) => {
13311317
visit_defaultness(defaultness, visitor);
13321318
visitor.visit_generics(generics);
1333-
visitor.visit_span(&mut where_clauses.before.span);
1334-
visitor.visit_span(&mut where_clauses.after.span);
13351319
visit_bounds(bounds, visitor);
13361320
visit_opt(ty, |ty| visitor.visit_ty(ty));
1321+
noop_visit_ty_alias_where_clauses(where_clauses, visitor);
13371322
}
13381323
ForeignItemKind::MacCall(mac) => visitor.visit_mac_call(mac),
13391324
}
@@ -1344,7 +1329,8 @@ pub fn noop_visit_pat<T: MutVisitor>(pat: &mut P<Pat>, vis: &mut T) {
13441329
let Pat { id, kind, span, tokens } = pat.deref_mut();
13451330
vis.visit_id(id);
13461331
match kind {
1347-
PatKind::Wild | PatKind::Rest | PatKind::Never | PatKind::Err(_) => {}
1332+
PatKind::Err(_guar) => {}
1333+
PatKind::Wild | PatKind::Rest | PatKind::Never => {}
13481334
PatKind::Ident(_binding_mode, ident, sub) => {
13491335
vis.visit_ident(ident);
13501336
visit_opt(sub, |sub| vis.visit_pat(sub));
@@ -1378,8 +1364,8 @@ pub fn noop_visit_pat<T: MutVisitor>(pat: &mut P<Pat>, vis: &mut T) {
13781364
PatKind::Paren(inner) => vis.visit_pat(inner),
13791365
PatKind::MacCall(mac) => vis.visit_mac_call(mac),
13801366
}
1381-
vis.visit_span(span);
13821367
visit_lazy_tts(tokens, vis);
1368+
vis.visit_span(span);
13831369
}
13841370

13851371
fn noop_visit_anon_const<T: MutVisitor>(AnonConst { id, value }: &mut AnonConst, vis: &mut T) {
@@ -1388,13 +1374,22 @@ fn noop_visit_anon_const<T: MutVisitor>(AnonConst { id, value }: &mut AnonConst,
13881374
}
13891375

13901376
fn noop_visit_inline_asm<T: MutVisitor>(asm: &mut InlineAsm, vis: &mut T) {
1391-
for (op, _) in &mut asm.operands {
1377+
// FIXME: Visit spans inside all this currently ignored stuff.
1378+
let InlineAsm {
1379+
template: _,
1380+
template_strs: _,
1381+
operands,
1382+
clobber_abis: _,
1383+
options: _,
1384+
line_spans: _,
1385+
} = asm;
1386+
for (op, span) in operands {
13921387
match op {
1393-
InlineAsmOperand::In { expr, .. }
1394-
| InlineAsmOperand::Out { expr: Some(expr), .. }
1395-
| InlineAsmOperand::InOut { expr, .. } => vis.visit_expr(expr),
1396-
InlineAsmOperand::Out { expr: None, .. } => {}
1397-
InlineAsmOperand::SplitInOut { in_expr, out_expr, .. } => {
1388+
InlineAsmOperand::In { expr, reg: _ }
1389+
| InlineAsmOperand::Out { expr: Some(expr), reg: _, late: _ }
1390+
| InlineAsmOperand::InOut { expr, reg: _, late: _ } => vis.visit_expr(expr),
1391+
InlineAsmOperand::Out { expr: None, reg: _, late: _ } => {}
1392+
InlineAsmOperand::SplitInOut { in_expr, out_expr, reg: _, late: _ } => {
13981393
vis.visit_expr(in_expr);
13991394
if let Some(out_expr) = out_expr {
14001395
vis.visit_expr(out_expr);
@@ -1404,6 +1399,7 @@ fn noop_visit_inline_asm<T: MutVisitor>(asm: &mut InlineAsm, vis: &mut T) {
14041399
InlineAsmOperand::Sym { sym } => vis.visit_inline_asm_sym(sym),
14051400
InlineAsmOperand::Label { block } => vis.visit_block(block),
14061401
}
1402+
vis.visit_span(span);
14071403
}
14081404
}
14091405

@@ -1417,12 +1413,18 @@ fn noop_visit_inline_asm_sym<T: MutVisitor>(
14171413
}
14181414

14191415
fn noop_visit_format_args<T: MutVisitor>(fmt: &mut FormatArgs, vis: &mut T) {
1420-
for arg in fmt.arguments.all_args_mut() {
1421-
if let FormatArgumentKind::Named(name) = &mut arg.kind {
1422-
vis.visit_ident(name);
1416+
// FIXME: visit the template exhaustively.
1417+
let FormatArgs { span, template: _, arguments } = fmt;
1418+
for FormatArgument { kind, expr } in arguments.all_args_mut() {
1419+
match kind {
1420+
FormatArgumentKind::Named(ident) | FormatArgumentKind::Captured(ident) => {
1421+
vis.visit_ident(ident)
1422+
}
1423+
FormatArgumentKind::Normal => {}
14231424
}
1424-
vis.visit_expr(&mut arg.expr);
1425+
vis.visit_expr(expr);
14251426
}
1427+
vis.visit_span(span);
14261428
}
14271429

14281430
pub fn noop_visit_expr<T: MutVisitor>(
@@ -1451,10 +1453,10 @@ pub fn noop_visit_expr<T: MutVisitor>(
14511453
args: call_args,
14521454
span,
14531455
}) => {
1456+
vis.visit_method_receiver_expr(receiver);
14541457
vis.visit_id(id);
14551458
vis.visit_ident(ident);
14561459
visit_opt(seg_args, |args| vis.visit_generic_args(args));
1457-
vis.visit_method_receiver_expr(receiver);
14581460
visit_thin_exprs(call_args, vis);
14591461
vis.visit_span(span);
14601462
}
@@ -1471,30 +1473,31 @@ pub fn noop_visit_expr<T: MutVisitor>(
14711473
vis.visit_expr(expr);
14721474
vis.visit_ty(ty);
14731475
}
1474-
ExprKind::AddrOf(_, _, ohs) => vis.visit_expr(ohs),
1475-
ExprKind::Let(pat, scrutinee, _, _) => {
1476+
ExprKind::AddrOf(_kind, _mut, ohs) => vis.visit_expr(ohs),
1477+
ExprKind::Let(pat, scrutinee, span, _recovered) => {
14761478
vis.visit_pat(pat);
14771479
vis.visit_expr(scrutinee);
1480+
vis.visit_span(span);
14781481
}
14791482
ExprKind::If(cond, tr, fl) => {
14801483
vis.visit_expr(cond);
14811484
vis.visit_block(tr);
14821485
visit_opt(fl, |fl| ensure_sufficient_stack(|| vis.visit_expr(fl)));
14831486
}
14841487
ExprKind::While(cond, body, label) => {
1488+
visit_opt(label, |label| vis.visit_label(label));
14851489
vis.visit_expr(cond);
14861490
vis.visit_block(body);
1487-
visit_opt(label, |label| vis.visit_label(label));
14881491
}
14891492
ExprKind::ForLoop { pat, iter, body, label, kind: _ } => {
1493+
visit_opt(label, |label| vis.visit_label(label));
14901494
vis.visit_pat(pat);
14911495
vis.visit_expr(iter);
14921496
vis.visit_block(body);
1493-
visit_opt(label, |label| vis.visit_label(label));
14941497
}
14951498
ExprKind::Loop(body, label, span) => {
1496-
vis.visit_block(body);
14971499
visit_opt(label, |label| vis.visit_label(label));
1500+
vis.visit_block(body);
14981501
vis.visit_span(span);
14991502
}
15001503
ExprKind::Match(expr, arms, _kind) => {
@@ -1522,10 +1525,10 @@ pub fn noop_visit_expr<T: MutVisitor>(
15221525
vis.visit_span(fn_arg_span);
15231526
}
15241527
ExprKind::Block(blk, label) => {
1525-
vis.visit_block(blk);
15261528
visit_opt(label, |label| vis.visit_label(label));
1529+
vis.visit_block(blk);
15271530
}
1528-
ExprKind::Gen(_capture_by, body, _) => {
1531+
ExprKind::Gen(_capture_by, body, _kind) => {
15291532
vis.visit_block(body);
15301533
}
15311534
ExprKind::Await(expr, await_kw_span) => {
@@ -1601,10 +1604,13 @@ pub fn noop_visit_expr<T: MutVisitor>(
16011604
}
16021605
ExprKind::Try(expr) => vis.visit_expr(expr),
16031606
ExprKind::TryBlock(body) => vis.visit_block(body),
1604-
ExprKind::Lit(_) | ExprKind::IncludedBytes(..) | ExprKind::Err(_) | ExprKind::Dummy => {}
1607+
ExprKind::Lit(_token) => {}
1608+
ExprKind::IncludedBytes(_bytes) => {}
1609+
ExprKind::Err(_guar) => {}
1610+
ExprKind::Dummy => {}
16051611
}
1606-
vis.visit_span(span);
16071612
visit_lazy_tts(tokens, vis);
1613+
vis.visit_span(span);
16081614
}
16091615

16101616
pub fn noop_filter_map_expr<T: MutVisitor>(mut e: P<Expr>, vis: &mut T) -> Option<P<Expr>> {
@@ -1619,7 +1625,6 @@ pub fn noop_flat_map_stmt<T: MutVisitor>(
16191625
vis: &mut T,
16201626
) -> SmallVec<[Stmt; 1]> {
16211627
vis.visit_id(&mut id);
1622-
vis.visit_span(&mut span);
16231628
let stmts: SmallVec<_> = noop_flat_map_stmt_kind(kind, vis)
16241629
.into_iter()
16251630
.map(|kind| Stmt { id, kind, span })
@@ -1630,6 +1635,7 @@ pub fn noop_flat_map_stmt<T: MutVisitor>(
16301635
the visitor should implement custom statement visiting"
16311636
);
16321637
}
1638+
vis.visit_span(&mut span);
16331639
stmts
16341640
}
16351641

@@ -1654,14 +1660,16 @@ fn noop_flat_map_stmt_kind<T: MutVisitor>(kind: StmtKind, vis: &mut T) -> SmallV
16541660
}
16551661

16561662
fn noop_visit_vis<T: MutVisitor>(visibility: &mut Visibility, vis: &mut T) {
1657-
match &mut visibility.kind {
1663+
let Visibility { kind, span, tokens } = visibility;
1664+
match kind {
16581665
VisibilityKind::Public | VisibilityKind::Inherited => {}
16591666
VisibilityKind::Restricted { path, id, shorthand: _ } => {
16601667
vis.visit_id(id);
16611668
vis.visit_path(path);
16621669
}
16631670
}
1664-
vis.visit_span(&mut visibility.span);
1671+
visit_lazy_tts(tokens, vis);
1672+
vis.visit_span(span);
16651673
}
16661674

16671675
fn noop_visit_capture_by<T: MutVisitor>(capture_by: &mut CaptureBy, vis: &mut T) {

‎compiler/rustc_ast/src/visit.rs

Lines changed: 251 additions & 187 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
//! those that are created by the expansion of a macro.
1515
1616
use crate::ast::*;
17+
use crate::ptr::P;
1718

1819
use rustc_span::symbol::Ident;
1920
use rustc_span::Span;
@@ -298,40 +299,45 @@ pub trait Visitor<'ast>: Sized {
298299
}
299300

300301
pub fn walk_crate<'a, V: Visitor<'a>>(visitor: &mut V, krate: &'a Crate) -> V::Result {
301-
walk_list!(visitor, visit_attribute, &krate.attrs);
302-
walk_list!(visitor, visit_item, &krate.items);
302+
let Crate { attrs, items, spans: _, id: _, is_placeholder: _ } = krate;
303+
walk_list!(visitor, visit_attribute, attrs);
304+
walk_list!(visitor, visit_item, items);
303305
V::Result::output()
304306
}
305307

306308
pub fn walk_local<'a, V: Visitor<'a>>(visitor: &mut V, local: &'a Local) -> V::Result {
307-
walk_list!(visitor, visit_attribute, &local.attrs);
308-
try_visit!(visitor.visit_pat(&local.pat));
309-
visit_opt!(visitor, visit_ty, &local.ty);
310-
if let Some((init, els)) = local.kind.init_else_opt() {
309+
let Local { id: _, pat, ty, kind, span: _, colon_sp: _, attrs, tokens: _ } = local;
310+
walk_list!(visitor, visit_attribute, attrs);
311+
try_visit!(visitor.visit_pat(pat));
312+
visit_opt!(visitor, visit_ty, ty);
313+
if let Some((init, els)) = kind.init_else_opt() {
311314
try_visit!(visitor.visit_expr(init));
312315
visit_opt!(visitor, visit_block, els);
313316
}
314317
V::Result::output()
315318
}
316319

317-
pub fn walk_label<'a, V: Visitor<'a>>(visitor: &mut V, label: &'a Label) -> V::Result {
318-
visitor.visit_ident(label.ident)
320+
pub fn walk_label<'a, V: Visitor<'a>>(visitor: &mut V, Label { ident }: &'a Label) -> V::Result {
321+
visitor.visit_ident(*ident)
319322
}
320323

321324
pub fn walk_lifetime<'a, V: Visitor<'a>>(visitor: &mut V, lifetime: &'a Lifetime) -> V::Result {
322-
visitor.visit_ident(lifetime.ident)
325+
let Lifetime { id: _, ident } = lifetime;
326+
visitor.visit_ident(*ident)
323327
}
324328

325329
pub fn walk_poly_trait_ref<'a, V>(visitor: &mut V, trait_ref: &'a PolyTraitRef) -> V::Result
326330
where
327331
V: Visitor<'a>,
328332
{
329-
walk_list!(visitor, visit_generic_param, &trait_ref.bound_generic_params);
330-
visitor.visit_trait_ref(&trait_ref.trait_ref)
333+
let PolyTraitRef { bound_generic_params, trait_ref, span: _ } = trait_ref;
334+
walk_list!(visitor, visit_generic_param, bound_generic_params);
335+
visitor.visit_trait_ref(trait_ref)
331336
}
332337

333338
pub fn walk_trait_ref<'a, V: Visitor<'a>>(visitor: &mut V, trait_ref: &'a TraitRef) -> V::Result {
334-
visitor.visit_path(&trait_ref.path, trait_ref.ref_id)
339+
let TraitRef { path, ref_id } = trait_ref;
340+
visitor.visit_path(path, *ref_id)
335341
}
336342

337343
impl WalkItemKind for ItemKind {
@@ -341,9 +347,10 @@ impl WalkItemKind for ItemKind {
341347
_ctxt: AssocCtxt,
342348
visitor: &mut V,
343349
) -> V::Result {
350+
let Item { id, span, vis, ident, .. } = item;
344351
match self {
345-
ItemKind::ExternCrate(_) => {}
346-
ItemKind::Use(use_tree) => try_visit!(visitor.visit_use_tree(use_tree, item.id, false)),
352+
ItemKind::ExternCrate(_rename) => {}
353+
ItemKind::Use(use_tree) => try_visit!(visitor.visit_use_tree(use_tree, *id, false)),
347354
ItemKind::Static(box StaticItem { ty, safety: _, mutability: _, expr }) => {
348355
try_visit!(visitor.visit_ty(ty));
349356
visit_opt!(visitor, visit_expr, expr);
@@ -354,21 +361,26 @@ impl WalkItemKind for ItemKind {
354361
visit_opt!(visitor, visit_expr, expr);
355362
}
356363
ItemKind::Fn(box Fn { defaultness: _, generics, sig, body }) => {
357-
let kind =
358-
FnKind::Fn(FnCtxt::Free, item.ident, sig, &item.vis, generics, body.as_deref());
359-
try_visit!(visitor.visit_fn(kind, item.span, item.id));
364+
let kind = FnKind::Fn(FnCtxt::Free, *ident, sig, vis, generics, body.as_deref());
365+
try_visit!(visitor.visit_fn(kind, *span, *id));
360366
}
361367
ItemKind::Mod(_unsafety, mod_kind) => match mod_kind {
362368
ModKind::Loaded(items, _inline, _inner_span) => {
363369
walk_list!(visitor, visit_item, items);
364370
}
365371
ModKind::Unloaded => {}
366372
},
367-
ItemKind::ForeignMod(foreign_module) => {
368-
walk_list!(visitor, visit_foreign_item, &foreign_module.items);
373+
ItemKind::ForeignMod(ForeignMod { safety: _, abi: _, items }) => {
374+
walk_list!(visitor, visit_foreign_item, items);
369375
}
370376
ItemKind::GlobalAsm(asm) => try_visit!(visitor.visit_inline_asm(asm)),
371-
ItemKind::TyAlias(box TyAlias { generics, bounds, ty, .. }) => {
377+
ItemKind::TyAlias(box TyAlias {
378+
generics,
379+
bounds,
380+
ty,
381+
defaultness: _,
382+
where_clauses: _,
383+
}) => {
372384
try_visit!(visitor.visit_generics(generics));
373385
walk_list!(visitor, visit_param_bound, bounds, BoundKind::Bound);
374386
visit_opt!(visitor, visit_ty, ty);
@@ -407,7 +419,7 @@ impl WalkItemKind for ItemKind {
407419
walk_list!(visitor, visit_param_bound, bounds, BoundKind::Bound);
408420
}
409421
ItemKind::MacCall(mac) => try_visit!(visitor.visit_mac_call(mac)),
410-
ItemKind::MacroDef(ts) => try_visit!(visitor.visit_mac_def(ts, item.id)),
422+
ItemKind::MacroDef(ts) => try_visit!(visitor.visit_mac_def(ts, *id)),
411423
ItemKind::Delegation(box Delegation {
412424
id,
413425
qself,
@@ -416,18 +428,14 @@ impl WalkItemKind for ItemKind {
416428
body,
417429
from_glob: _,
418430
}) => {
419-
if let Some(qself) = qself {
420-
try_visit!(visitor.visit_ty(&qself.ty));
421-
}
431+
try_visit!(walk_qself(visitor, qself));
422432
try_visit!(visitor.visit_path(path, *id));
423433
visit_opt!(visitor, visit_ident, *rename);
424434
visit_opt!(visitor, visit_block, body);
425435
}
426436
ItemKind::DelegationMac(box DelegationMac { qself, prefix, suffixes, body }) => {
427-
if let Some(qself) = qself {
428-
try_visit!(visitor.visit_ty(&qself.ty));
429-
}
430-
try_visit!(visitor.visit_path(prefix, item.id));
437+
try_visit!(walk_qself(visitor, qself));
438+
try_visit!(visitor.visit_path(prefix, *id));
431439
if let Some(suffixes) = suffixes {
432440
for (ident, rename) in suffixes {
433441
visitor.visit_ident(*ident);
@@ -452,58 +460,62 @@ pub fn walk_item<'a, V: Visitor<'a>>(
452460

453461
pub fn walk_enum_def<'a, V: Visitor<'a>>(
454462
visitor: &mut V,
455-
enum_definition: &'a EnumDef,
463+
EnumDef { variants }: &'a EnumDef,
456464
) -> V::Result {
457-
walk_list!(visitor, visit_variant, &enum_definition.variants);
465+
walk_list!(visitor, visit_variant, variants);
458466
V::Result::output()
459467
}
460468

461469
pub fn walk_variant<'a, V: Visitor<'a>>(visitor: &mut V, variant: &'a Variant) -> V::Result
462470
where
463471
V: Visitor<'a>,
464472
{
465-
walk_list!(visitor, visit_attribute, &variant.attrs);
466-
try_visit!(visitor.visit_ident(variant.ident));
467-
try_visit!(visitor.visit_vis(&variant.vis));
468-
try_visit!(visitor.visit_variant_data(&variant.data));
469-
visit_opt!(visitor, visit_variant_discr, &variant.disr_expr);
473+
let Variant { attrs, id: _, span: _, vis, ident, data, disr_expr, is_placeholder: _ } = variant;
474+
walk_list!(visitor, visit_attribute, attrs);
475+
try_visit!(visitor.visit_vis(vis));
476+
try_visit!(visitor.visit_ident(*ident));
477+
try_visit!(visitor.visit_variant_data(data));
478+
visit_opt!(visitor, visit_variant_discr, disr_expr);
470479
V::Result::output()
471480
}
472481

473482
pub fn walk_expr_field<'a, V: Visitor<'a>>(visitor: &mut V, f: &'a ExprField) -> V::Result {
474-
walk_list!(visitor, visit_attribute, &f.attrs);
475-
try_visit!(visitor.visit_expr(&f.expr));
476-
try_visit!(visitor.visit_ident(f.ident));
483+
let ExprField { attrs, id: _, span: _, ident, expr, is_shorthand: _, is_placeholder: _ } = f;
484+
walk_list!(visitor, visit_attribute, attrs);
485+
try_visit!(visitor.visit_ident(*ident));
486+
try_visit!(visitor.visit_expr(expr));
477487
V::Result::output()
478488
}
479489

480490
pub fn walk_pat_field<'a, V: Visitor<'a>>(visitor: &mut V, fp: &'a PatField) -> V::Result {
481-
walk_list!(visitor, visit_attribute, &fp.attrs);
482-
try_visit!(visitor.visit_ident(fp.ident));
483-
try_visit!(visitor.visit_pat(&fp.pat));
491+
let PatField { ident, pat, is_shorthand: _, attrs, id: _, span: _, is_placeholder: _ } = fp;
492+
walk_list!(visitor, visit_attribute, attrs);
493+
try_visit!(visitor.visit_ident(*ident));
494+
try_visit!(visitor.visit_pat(pat));
484495
V::Result::output()
485496
}
486497

487498
pub fn walk_ty<'a, V: Visitor<'a>>(visitor: &mut V, typ: &'a Ty) -> V::Result {
488-
match &typ.kind {
499+
let Ty { id, kind, span: _, tokens: _ } = typ;
500+
match kind {
489501
TyKind::Slice(ty) | TyKind::Paren(ty) => try_visit!(visitor.visit_ty(ty)),
490-
TyKind::Ptr(mutable_type) => try_visit!(visitor.visit_ty(&mutable_type.ty)),
491-
TyKind::Ref(opt_lifetime, mutable_type) => {
502+
TyKind::Ptr(MutTy { ty, mutbl: _ }) => try_visit!(visitor.visit_ty(ty)),
503+
TyKind::Ref(opt_lifetime, MutTy { ty, mutbl: _ }) => {
492504
visit_opt!(visitor, visit_lifetime, opt_lifetime, LifetimeCtxt::Ref);
493-
try_visit!(visitor.visit_ty(&mutable_type.ty));
505+
try_visit!(visitor.visit_ty(ty));
494506
}
495507
TyKind::Tup(tuple_element_types) => {
496508
walk_list!(visitor, visit_ty, tuple_element_types);
497509
}
498510
TyKind::BareFn(function_declaration) => {
499-
walk_list!(visitor, visit_generic_param, &function_declaration.generic_params);
500-
try_visit!(walk_fn_decl(visitor, &function_declaration.decl));
511+
let BareFnTy { safety: _, ext: _, generic_params, decl, decl_span: _ } =
512+
&**function_declaration;
513+
walk_list!(visitor, visit_generic_param, generic_params);
514+
try_visit!(walk_fn_decl(visitor, decl));
501515
}
502516
TyKind::Path(maybe_qself, path) => {
503-
if let Some(qself) = maybe_qself {
504-
try_visit!(visitor.visit_ty(&qself.ty));
505-
}
506-
try_visit!(visitor.visit_path(path, typ.id));
517+
try_visit!(walk_qself(visitor, maybe_qself));
518+
try_visit!(visitor.visit_path(path, *id));
507519
}
508520
TyKind::Pat(ty, pat) => {
509521
try_visit!(visitor.visit_ty(ty));
@@ -513,25 +525,35 @@ pub fn walk_ty<'a, V: Visitor<'a>>(visitor: &mut V, typ: &'a Ty) -> V::Result {
513525
try_visit!(visitor.visit_ty(ty));
514526
try_visit!(visitor.visit_anon_const(length));
515527
}
516-
TyKind::TraitObject(bounds, ..) => {
528+
TyKind::TraitObject(bounds, _syntax) => {
517529
walk_list!(visitor, visit_param_bound, bounds, BoundKind::TraitObject);
518530
}
519-
TyKind::ImplTrait(_, bounds) => {
531+
TyKind::ImplTrait(_id, bounds) => {
520532
walk_list!(visitor, visit_param_bound, bounds, BoundKind::Impl);
521533
}
522534
TyKind::Typeof(expression) => try_visit!(visitor.visit_anon_const(expression)),
523-
TyKind::Infer | TyKind::ImplicitSelf | TyKind::Dummy | TyKind::Err(_) => {}
535+
TyKind::Infer | TyKind::ImplicitSelf | TyKind::Dummy => {}
536+
TyKind::Err(_guar) => {}
524537
TyKind::MacCall(mac) => try_visit!(visitor.visit_mac_call(mac)),
525538
TyKind::Never | TyKind::CVarArgs => {}
526-
TyKind::AnonStruct(_, ref fields) | TyKind::AnonUnion(_, ref fields) => {
539+
TyKind::AnonStruct(_id, ref fields) | TyKind::AnonUnion(_id, ref fields) => {
527540
walk_list!(visitor, visit_field_def, fields);
528541
}
529542
}
530543
V::Result::output()
531544
}
532545

546+
fn walk_qself<'a, V: Visitor<'a>>(visitor: &mut V, qself: &'a Option<P<QSelf>>) -> V::Result {
547+
if let Some(qself) = qself {
548+
let QSelf { ty, path_span: _, position: _ } = &**qself;
549+
try_visit!(visitor.visit_ty(ty));
550+
}
551+
V::Result::output()
552+
}
553+
533554
pub fn walk_path<'a, V: Visitor<'a>>(visitor: &mut V, path: &'a Path) -> V::Result {
534-
walk_list!(visitor, visit_path_segment, &path.segments);
555+
let Path { span: _, segments, tokens: _ } = path;
556+
walk_list!(visitor, visit_path_segment, segments);
535557
V::Result::output()
536558
}
537559

@@ -540,14 +562,15 @@ pub fn walk_use_tree<'a, V: Visitor<'a>>(
540562
use_tree: &'a UseTree,
541563
id: NodeId,
542564
) -> V::Result {
543-
try_visit!(visitor.visit_path(&use_tree.prefix, id));
544-
match use_tree.kind {
565+
let UseTree { prefix, kind, span: _ } = use_tree;
566+
try_visit!(visitor.visit_path(prefix, id));
567+
match kind {
545568
UseTreeKind::Simple(rename) => {
546569
// The extra IDs are handled during AST lowering.
547-
visit_opt!(visitor, visit_ident, rename);
570+
visit_opt!(visitor, visit_ident, *rename);
548571
}
549572
UseTreeKind::Glob => {}
550-
UseTreeKind::Nested { ref items, .. } => {
573+
UseTreeKind::Nested { ref items, span: _ } => {
551574
for &(ref nested_tree, nested_id) in items {
552575
try_visit!(visitor.visit_use_tree(nested_tree, nested_id, true));
553576
}
@@ -560,8 +583,9 @@ pub fn walk_path_segment<'a, V: Visitor<'a>>(
560583
visitor: &mut V,
561584
segment: &'a PathSegment,
562585
) -> V::Result {
563-
try_visit!(visitor.visit_ident(segment.ident));
564-
visit_opt!(visitor, visit_generic_args, &segment.args);
586+
let PathSegment { ident, id: _, args } = segment;
587+
try_visit!(visitor.visit_ident(*ident));
588+
visit_opt!(visitor, visit_generic_args, args);
565589
V::Result::output()
566590
}
567591

@@ -570,8 +594,8 @@ where
570594
V: Visitor<'a>,
571595
{
572596
match generic_args {
573-
GenericArgs::AngleBracketed(data) => {
574-
for arg in &data.args {
597+
GenericArgs::AngleBracketed(AngleBracketedArgs { span: _, args }) => {
598+
for arg in args {
575599
match arg {
576600
AngleBracketedArg::Arg(a) => try_visit!(visitor.visit_generic_arg(a)),
577601
AngleBracketedArg::Constraint(c) => {
@@ -581,8 +605,9 @@ where
581605
}
582606
}
583607
GenericArgs::Parenthesized(data) => {
584-
walk_list!(visitor, visit_ty, &data.inputs);
585-
try_visit!(visitor.visit_fn_ret_ty(&data.output));
608+
let ParenthesizedArgs { span: _, inputs, inputs_span: _, output } = data;
609+
walk_list!(visitor, visit_ty, inputs);
610+
try_visit!(visitor.visit_fn_ret_ty(output));
586611
}
587612
}
588613
V::Result::output()
@@ -603,9 +628,10 @@ pub fn walk_assoc_item_constraint<'a, V: Visitor<'a>>(
603628
visitor: &mut V,
604629
constraint: &'a AssocItemConstraint,
605630
) -> V::Result {
606-
try_visit!(visitor.visit_ident(constraint.ident));
607-
visit_opt!(visitor, visit_generic_args, &constraint.gen_args);
608-
match &constraint.kind {
631+
let AssocItemConstraint { id: _, ident, gen_args, kind, span: _ } = constraint;
632+
try_visit!(visitor.visit_ident(*ident));
633+
visit_opt!(visitor, visit_generic_args, gen_args);
634+
match kind {
609635
AssocItemConstraintKind::Equality { term } => match term {
610636
Term::Ty(ty) => try_visit!(visitor.visit_ty(ty)),
611637
Term::Const(c) => try_visit!(visitor.visit_anon_const(c)),
@@ -618,43 +644,39 @@ pub fn walk_assoc_item_constraint<'a, V: Visitor<'a>>(
618644
}
619645

620646
pub fn walk_pat<'a, V: Visitor<'a>>(visitor: &mut V, pattern: &'a Pat) -> V::Result {
621-
match &pattern.kind {
647+
let Pat { id, kind, span: _, tokens: _ } = pattern;
648+
match kind {
622649
PatKind::TupleStruct(opt_qself, path, elems) => {
623-
if let Some(qself) = opt_qself {
624-
try_visit!(visitor.visit_ty(&qself.ty));
625-
}
626-
try_visit!(visitor.visit_path(path, pattern.id));
650+
try_visit!(walk_qself(visitor, opt_qself));
651+
try_visit!(visitor.visit_path(path, *id));
627652
walk_list!(visitor, visit_pat, elems);
628653
}
629654
PatKind::Path(opt_qself, path) => {
630-
if let Some(qself) = opt_qself {
631-
try_visit!(visitor.visit_ty(&qself.ty));
632-
}
633-
try_visit!(visitor.visit_path(path, pattern.id))
655+
try_visit!(walk_qself(visitor, opt_qself));
656+
try_visit!(visitor.visit_path(path, *id))
634657
}
635-
PatKind::Struct(opt_qself, path, fields, _) => {
636-
if let Some(qself) = opt_qself {
637-
try_visit!(visitor.visit_ty(&qself.ty));
638-
}
639-
try_visit!(visitor.visit_path(path, pattern.id));
658+
PatKind::Struct(opt_qself, path, fields, _rest) => {
659+
try_visit!(walk_qself(visitor, opt_qself));
660+
try_visit!(visitor.visit_path(path, *id));
640661
walk_list!(visitor, visit_pat_field, fields);
641662
}
642-
PatKind::Box(subpattern)
643-
| PatKind::Deref(subpattern)
644-
| PatKind::Ref(subpattern, _)
645-
| PatKind::Paren(subpattern) => {
663+
PatKind::Box(subpattern) | PatKind::Deref(subpattern) | PatKind::Paren(subpattern) => {
664+
try_visit!(visitor.visit_pat(subpattern));
665+
}
666+
PatKind::Ref(subpattern, _ /*mutbl*/) => {
646667
try_visit!(visitor.visit_pat(subpattern));
647668
}
648-
PatKind::Ident(_, ident, optional_subpattern) => {
669+
PatKind::Ident(_bmode, ident, optional_subpattern) => {
649670
try_visit!(visitor.visit_ident(*ident));
650671
visit_opt!(visitor, visit_pat, optional_subpattern);
651672
}
652673
PatKind::Lit(expression) => try_visit!(visitor.visit_expr(expression)),
653-
PatKind::Range(lower_bound, upper_bound, _) => {
674+
PatKind::Range(lower_bound, upper_bound, _end) => {
654675
visit_opt!(visitor, visit_expr, lower_bound);
655676
visit_opt!(visitor, visit_expr, upper_bound);
656677
}
657-
PatKind::Wild | PatKind::Rest | PatKind::Never | PatKind::Err(_) => {}
678+
PatKind::Wild | PatKind::Rest | PatKind::Never => {}
679+
PatKind::Err(_guar) => {}
658680
PatKind::Tuple(elems) | PatKind::Slice(elems) | PatKind::Or(elems) => {
659681
walk_list!(visitor, visit_pat, elems);
660682
}
@@ -680,7 +702,13 @@ impl WalkItemKind for ForeignItemKind {
680702
let kind = FnKind::Fn(FnCtxt::Foreign, ident, sig, vis, generics, body.as_deref());
681703
try_visit!(visitor.visit_fn(kind, span, id));
682704
}
683-
ForeignItemKind::TyAlias(box TyAlias { generics, bounds, ty, .. }) => {
705+
ForeignItemKind::TyAlias(box TyAlias {
706+
generics,
707+
bounds,
708+
ty,
709+
defaultness: _,
710+
where_clauses: _,
711+
}) => {
684712
try_visit!(visitor.visit_generics(generics));
685713
walk_list!(visitor, visit_param_bound, bounds, BoundKind::Bound);
686714
visit_opt!(visitor, visit_ty, ty);
@@ -697,7 +725,7 @@ pub fn walk_param_bound<'a, V: Visitor<'a>>(visitor: &mut V, bound: &'a GenericB
697725
match bound {
698726
GenericBound::Trait(typ, _modifier) => visitor.visit_poly_trait_ref(typ),
699727
GenericBound::Outlives(lifetime) => visitor.visit_lifetime(lifetime, LifetimeCtxt::Bound),
700-
GenericBound::Use(args, _) => {
728+
GenericBound::Use(args, _span) => {
701729
walk_list!(visitor, visit_precise_capturing_arg, args);
702730
V::Result::output()
703731
}
@@ -722,13 +750,15 @@ pub fn walk_generic_param<'a, V: Visitor<'a>>(
722750
visitor: &mut V,
723751
param: &'a GenericParam,
724752
) -> V::Result {
725-
walk_list!(visitor, visit_attribute, &param.attrs);
726-
try_visit!(visitor.visit_ident(param.ident));
727-
walk_list!(visitor, visit_param_bound, &param.bounds, BoundKind::Bound);
728-
match &param.kind {
753+
let GenericParam { id: _, ident, attrs, bounds, is_placeholder: _, kind, colon_span: _ } =
754+
param;
755+
walk_list!(visitor, visit_attribute, attrs);
756+
try_visit!(visitor.visit_ident(*ident));
757+
walk_list!(visitor, visit_param_bound, bounds, BoundKind::Bound);
758+
match kind {
729759
GenericParamKind::Lifetime => (),
730760
GenericParamKind::Type { default } => visit_opt!(visitor, visit_ty, default),
731-
GenericParamKind::Const { ty, default, .. } => {
761+
GenericParamKind::Const { ty, default, kw_span: _ } => {
732762
try_visit!(visitor.visit_ty(ty));
733763
visit_opt!(visitor, visit_anon_const, default);
734764
}
@@ -737,8 +767,10 @@ pub fn walk_generic_param<'a, V: Visitor<'a>>(
737767
}
738768

739769
pub fn walk_generics<'a, V: Visitor<'a>>(visitor: &mut V, generics: &'a Generics) -> V::Result {
740-
walk_list!(visitor, visit_generic_param, &generics.params);
741-
walk_list!(visitor, visit_where_predicate, &generics.where_clause.predicates);
770+
let Generics { params, where_clause, span: _ } = generics;
771+
let WhereClause { has_where_token: _, predicates, span: _ } = where_clause;
772+
walk_list!(visitor, visit_generic_param, params);
773+
walk_list!(visitor, visit_where_predicate, predicates);
742774
V::Result::output()
743775
}
744776

@@ -764,17 +796,17 @@ pub fn walk_where_predicate<'a, V: Visitor<'a>>(
764796
bounded_ty,
765797
bounds,
766798
bound_generic_params,
767-
..
799+
span: _,
768800
}) => {
801+
walk_list!(visitor, visit_generic_param, bound_generic_params);
769802
try_visit!(visitor.visit_ty(bounded_ty));
770803
walk_list!(visitor, visit_param_bound, bounds, BoundKind::Bound);
771-
walk_list!(visitor, visit_generic_param, bound_generic_params);
772804
}
773-
WherePredicate::RegionPredicate(WhereRegionPredicate { lifetime, bounds, .. }) => {
805+
WherePredicate::RegionPredicate(WhereRegionPredicate { lifetime, bounds, span: _ }) => {
774806
try_visit!(visitor.visit_lifetime(lifetime, LifetimeCtxt::Bound));
775807
walk_list!(visitor, visit_param_bound, bounds, BoundKind::Bound);
776808
}
777-
WherePredicate::EqPredicate(WhereEqPredicate { lhs_ty, rhs_ty, .. }) => {
809+
WherePredicate::EqPredicate(WhereEqPredicate { lhs_ty, rhs_ty, span: _ }) => {
778810
try_visit!(visitor.visit_ty(lhs_ty));
779811
try_visit!(visitor.visit_ty(rhs_ty));
780812
}
@@ -783,26 +815,28 @@ pub fn walk_where_predicate<'a, V: Visitor<'a>>(
783815
}
784816

785817
pub fn walk_fn_ret_ty<'a, V: Visitor<'a>>(visitor: &mut V, ret_ty: &'a FnRetTy) -> V::Result {
786-
if let FnRetTy::Ty(output_ty) = ret_ty {
787-
try_visit!(visitor.visit_ty(output_ty));
818+
match ret_ty {
819+
FnRetTy::Default(_span) => {}
820+
FnRetTy::Ty(output_ty) => try_visit!(visitor.visit_ty(output_ty)),
788821
}
789822
V::Result::output()
790823
}
791824

792825
pub fn walk_fn_decl<'a, V: Visitor<'a>>(
793826
visitor: &mut V,
794-
function_declaration: &'a FnDecl,
827+
FnDecl { inputs, output }: &'a FnDecl,
795828
) -> V::Result {
796-
walk_list!(visitor, visit_param, &function_declaration.inputs);
797-
visitor.visit_fn_ret_ty(&function_declaration.output)
829+
walk_list!(visitor, visit_param, inputs);
830+
visitor.visit_fn_ret_ty(output)
798831
}
799832

800833
pub fn walk_fn<'a, V: Visitor<'a>>(visitor: &mut V, kind: FnKind<'a>) -> V::Result {
801834
match kind {
802-
FnKind::Fn(_, _, sig, _, generics, body) => {
835+
FnKind::Fn(_ctxt, _ident, FnSig { header, decl, span: _ }, _vis, generics, body) => {
836+
// Identifier and visibility are visited as a part of the item.
837+
try_visit!(visitor.visit_fn_header(header));
803838
try_visit!(visitor.visit_generics(generics));
804-
try_visit!(visitor.visit_fn_header(&sig.header));
805-
try_visit!(walk_fn_decl(visitor, &sig.decl));
839+
try_visit!(walk_fn_decl(visitor, decl));
806840
visit_opt!(visitor, visit_block, body);
807841
}
808842
FnKind::Closure(binder, decl, body) => {
@@ -833,7 +867,13 @@ impl WalkItemKind for AssocItemKind {
833867
FnKind::Fn(FnCtxt::Assoc(ctxt), ident, sig, vis, generics, body.as_deref());
834868
try_visit!(visitor.visit_fn(kind, span, id));
835869
}
836-
AssocItemKind::Type(box TyAlias { generics, bounds, ty, .. }) => {
870+
AssocItemKind::Type(box TyAlias {
871+
generics,
872+
bounds,
873+
ty,
874+
defaultness: _,
875+
where_clauses: _,
876+
}) => {
837877
try_visit!(visitor.visit_generics(generics));
838878
walk_list!(visitor, visit_param_bound, bounds, BoundKind::Bound);
839879
visit_opt!(visitor, visit_ty, ty);
@@ -849,18 +889,14 @@ impl WalkItemKind for AssocItemKind {
849889
body,
850890
from_glob: _,
851891
}) => {
852-
if let Some(qself) = qself {
853-
try_visit!(visitor.visit_ty(&qself.ty));
854-
}
892+
try_visit!(walk_qself(visitor, qself));
855893
try_visit!(visitor.visit_path(path, *id));
856894
visit_opt!(visitor, visit_ident, *rename);
857895
visit_opt!(visitor, visit_block, body);
858896
}
859897
AssocItemKind::DelegationMac(box DelegationMac { qself, prefix, suffixes, body }) => {
860-
if let Some(qself) = qself {
861-
try_visit!(visitor.visit_ty(&qself.ty));
862-
}
863-
try_visit!(visitor.visit_path(prefix, item.id));
898+
try_visit!(walk_qself(visitor, qself));
899+
try_visit!(visitor.visit_path(prefix, id));
864900
if let Some(suffixes) = suffixes {
865901
for (ident, rename) in suffixes {
866902
visitor.visit_ident(*ident);
@@ -898,20 +934,23 @@ pub fn walk_struct_def<'a, V: Visitor<'a>>(
898934
}
899935

900936
pub fn walk_field_def<'a, V: Visitor<'a>>(visitor: &mut V, field: &'a FieldDef) -> V::Result {
901-
walk_list!(visitor, visit_attribute, &field.attrs);
902-
try_visit!(visitor.visit_vis(&field.vis));
903-
visit_opt!(visitor, visit_ident, field.ident);
904-
try_visit!(visitor.visit_ty(&field.ty));
937+
let FieldDef { attrs, id: _, span: _, vis, ident, ty, is_placeholder: _ } = field;
938+
walk_list!(visitor, visit_attribute, attrs);
939+
try_visit!(visitor.visit_vis(vis));
940+
visit_opt!(visitor, visit_ident, *ident);
941+
try_visit!(visitor.visit_ty(ty));
905942
V::Result::output()
906943
}
907944

908945
pub fn walk_block<'a, V: Visitor<'a>>(visitor: &mut V, block: &'a Block) -> V::Result {
909-
walk_list!(visitor, visit_stmt, &block.stmts);
946+
let Block { stmts, id: _, rules: _, span: _, tokens: _, could_be_bare_literal: _ } = block;
947+
walk_list!(visitor, visit_stmt, stmts);
910948
V::Result::output()
911949
}
912950

913951
pub fn walk_stmt<'a, V: Visitor<'a>>(visitor: &mut V, statement: &'a Stmt) -> V::Result {
914-
match &statement.kind {
952+
let Stmt { id: _, kind, span: _ } = statement;
953+
match kind {
915954
StmtKind::Let(local) => try_visit!(visitor.visit_local(local)),
916955
StmtKind::Item(item) => try_visit!(visitor.visit_item(item)),
917956
StmtKind::Expr(expr) | StmtKind::Semi(expr) => try_visit!(visitor.visit_expr(expr)),
@@ -926,25 +965,37 @@ pub fn walk_stmt<'a, V: Visitor<'a>>(visitor: &mut V, statement: &'a Stmt) -> V:
926965
}
927966

928967
pub fn walk_mac<'a, V: Visitor<'a>>(visitor: &mut V, mac: &'a MacCall) -> V::Result {
929-
visitor.visit_path(&mac.path, DUMMY_NODE_ID)
968+
let MacCall { path, args: _ } = mac;
969+
visitor.visit_path(path, DUMMY_NODE_ID)
930970
}
931971

932972
pub fn walk_anon_const<'a, V: Visitor<'a>>(visitor: &mut V, constant: &'a AnonConst) -> V::Result {
933-
visitor.visit_expr(&constant.value)
973+
let AnonConst { id: _, value } = constant;
974+
visitor.visit_expr(value)
934975
}
935976

936977
pub fn walk_inline_asm<'a, V: Visitor<'a>>(visitor: &mut V, asm: &'a InlineAsm) -> V::Result {
937-
for (op, _) in &asm.operands {
978+
let InlineAsm {
979+
template: _,
980+
template_strs: _,
981+
operands,
982+
clobber_abis: _,
983+
options: _,
984+
line_spans: _,
985+
} = asm;
986+
for (op, _span) in operands {
938987
match op {
939-
InlineAsmOperand::In { expr, .. }
940-
| InlineAsmOperand::Out { expr: Some(expr), .. }
941-
| InlineAsmOperand::InOut { expr, .. } => try_visit!(visitor.visit_expr(expr)),
942-
InlineAsmOperand::Out { expr: None, .. } => {}
943-
InlineAsmOperand::SplitInOut { in_expr, out_expr, .. } => {
988+
InlineAsmOperand::In { expr, reg: _ }
989+
| InlineAsmOperand::Out { expr: Some(expr), reg: _, late: _ }
990+
| InlineAsmOperand::InOut { expr, reg: _, late: _ } => {
991+
try_visit!(visitor.visit_expr(expr))
992+
}
993+
InlineAsmOperand::Out { expr: None, reg: _, late: _ } => {}
994+
InlineAsmOperand::SplitInOut { in_expr, out_expr, reg: _, late: _ } => {
944995
try_visit!(visitor.visit_expr(in_expr));
945996
visit_opt!(visitor, visit_expr, out_expr);
946997
}
947-
InlineAsmOperand::Const { anon_const, .. } => {
998+
InlineAsmOperand::Const { anon_const } => {
948999
try_visit!(visitor.visit_anon_const(anon_const))
9491000
}
9501001
InlineAsmOperand::Sym { sym } => try_visit!(visitor.visit_inline_asm_sym(sym)),
@@ -956,28 +1007,30 @@ pub fn walk_inline_asm<'a, V: Visitor<'a>>(visitor: &mut V, asm: &'a InlineAsm)
9561007

9571008
pub fn walk_inline_asm_sym<'a, V: Visitor<'a>>(
9581009
visitor: &mut V,
959-
sym: &'a InlineAsmSym,
1010+
InlineAsmSym { id, qself, path }: &'a InlineAsmSym,
9601011
) -> V::Result {
961-
if let Some(qself) = &sym.qself {
962-
try_visit!(visitor.visit_ty(&qself.ty));
963-
}
964-
visitor.visit_path(&sym.path, sym.id)
1012+
try_visit!(walk_qself(visitor, qself));
1013+
visitor.visit_path(path, *id)
9651014
}
9661015

9671016
pub fn walk_format_args<'a, V: Visitor<'a>>(visitor: &mut V, fmt: &'a FormatArgs) -> V::Result {
968-
for arg in fmt.arguments.all_args() {
969-
if let FormatArgumentKind::Named(name) = arg.kind {
970-
try_visit!(visitor.visit_ident(name));
1017+
let FormatArgs { span: _, template: _, arguments } = fmt;
1018+
for FormatArgument { kind, expr } in arguments.all_args() {
1019+
match kind {
1020+
FormatArgumentKind::Named(ident) | FormatArgumentKind::Captured(ident) => {
1021+
try_visit!(visitor.visit_ident(*ident))
1022+
}
1023+
FormatArgumentKind::Normal => {}
9711024
}
972-
try_visit!(visitor.visit_expr(&arg.expr));
1025+
try_visit!(visitor.visit_expr(expr));
9731026
}
9741027
V::Result::output()
9751028
}
9761029

9771030
pub fn walk_expr<'a, V: Visitor<'a>>(visitor: &mut V, expression: &'a Expr) -> V::Result {
978-
walk_list!(visitor, visit_attribute, &expression.attrs);
979-
980-
match &expression.kind {
1031+
let Expr { id, kind, span, attrs, tokens: _ } = expression;
1032+
walk_list!(visitor, visit_attribute, attrs);
1033+
match kind {
9811034
ExprKind::Array(subexpressions) => {
9821035
walk_list!(visitor, visit_expr, subexpressions);
9831036
}
@@ -987,12 +1040,11 @@ pub fn walk_expr<'a, V: Visitor<'a>>(visitor: &mut V, expression: &'a Expr) -> V
9871040
try_visit!(visitor.visit_anon_const(count));
9881041
}
9891042
ExprKind::Struct(se) => {
990-
if let Some(qself) = &se.qself {
991-
try_visit!(visitor.visit_ty(&qself.ty));
992-
}
993-
try_visit!(visitor.visit_path(&se.path, expression.id));
994-
walk_list!(visitor, visit_expr_field, &se.fields);
995-
match &se.rest {
1043+
let StructExpr { qself, path, fields, rest } = &**se;
1044+
try_visit!(walk_qself(visitor, qself));
1045+
try_visit!(visitor.visit_path(path, *id));
1046+
walk_list!(visitor, visit_expr_field, fields);
1047+
match rest {
9961048
StructRest::Base(expr) => try_visit!(visitor.visit_expr(expr)),
9971049
StructRest::Rest(_span) => {}
9981050
StructRest::None => {}
@@ -1006,22 +1058,25 @@ pub fn walk_expr<'a, V: Visitor<'a>>(visitor: &mut V, expression: &'a Expr) -> V
10061058
walk_list!(visitor, visit_expr, arguments);
10071059
}
10081060
ExprKind::MethodCall(box MethodCall { seg, receiver, args, span: _ }) => {
1009-
try_visit!(visitor.visit_path_segment(seg));
10101061
try_visit!(visitor.visit_expr(receiver));
1062+
try_visit!(visitor.visit_path_segment(seg));
10111063
walk_list!(visitor, visit_expr, args);
10121064
}
1013-
ExprKind::Binary(_, left_expression, right_expression) => {
1065+
ExprKind::Binary(_op, left_expression, right_expression) => {
10141066
try_visit!(visitor.visit_expr(left_expression));
10151067
try_visit!(visitor.visit_expr(right_expression));
10161068
}
1017-
ExprKind::AddrOf(_, _, subexpression) | ExprKind::Unary(_, subexpression) => {
1069+
ExprKind::AddrOf(_kind, _mutbl, subexpression) => {
1070+
try_visit!(visitor.visit_expr(subexpression));
1071+
}
1072+
ExprKind::Unary(_op, subexpression) => {
10181073
try_visit!(visitor.visit_expr(subexpression));
10191074
}
10201075
ExprKind::Cast(subexpression, typ) | ExprKind::Type(subexpression, typ) => {
10211076
try_visit!(visitor.visit_expr(subexpression));
10221077
try_visit!(visitor.visit_ty(typ));
10231078
}
1024-
ExprKind::Let(pat, expr, _, _) => {
1079+
ExprKind::Let(pat, expr, _span, _recovered) => {
10251080
try_visit!(visitor.visit_pat(pat));
10261081
try_visit!(visitor.visit_expr(expr));
10271082
}
@@ -1041,7 +1096,7 @@ pub fn walk_expr<'a, V: Visitor<'a>>(visitor: &mut V, expression: &'a Expr) -> V
10411096
try_visit!(visitor.visit_expr(iter));
10421097
try_visit!(visitor.visit_block(body));
10431098
}
1044-
ExprKind::Loop(block, opt_label, _) => {
1099+
ExprKind::Loop(block, opt_label, _span) => {
10451100
visit_opt!(visitor, visit_label, opt_label);
10461101
try_visit!(visitor.visit_block(block));
10471102
}
@@ -1061,44 +1116,38 @@ pub fn walk_expr<'a, V: Visitor<'a>>(visitor: &mut V, expression: &'a Expr) -> V
10611116
fn_arg_span: _,
10621117
}) => {
10631118
try_visit!(visitor.visit_capture_by(capture_clause));
1064-
try_visit!(visitor.visit_fn(
1065-
FnKind::Closure(binder, fn_decl, body),
1066-
expression.span,
1067-
expression.id
1068-
))
1119+
try_visit!(visitor.visit_fn(FnKind::Closure(binder, fn_decl, body), *span, *id))
10691120
}
10701121
ExprKind::Block(block, opt_label) => {
10711122
visit_opt!(visitor, visit_label, opt_label);
10721123
try_visit!(visitor.visit_block(block));
10731124
}
1074-
ExprKind::Gen(_, body, _) => try_visit!(visitor.visit_block(body)),
1075-
ExprKind::Await(expr, _) => try_visit!(visitor.visit_expr(expr)),
1076-
ExprKind::Assign(lhs, rhs, _) => {
1125+
ExprKind::Gen(_capt, body, _kind) => try_visit!(visitor.visit_block(body)),
1126+
ExprKind::Await(expr, _span) => try_visit!(visitor.visit_expr(expr)),
1127+
ExprKind::Assign(lhs, rhs, _span) => {
10771128
try_visit!(visitor.visit_expr(lhs));
10781129
try_visit!(visitor.visit_expr(rhs));
10791130
}
1080-
ExprKind::AssignOp(_, left_expression, right_expression) => {
1131+
ExprKind::AssignOp(_op, left_expression, right_expression) => {
10811132
try_visit!(visitor.visit_expr(left_expression));
10821133
try_visit!(visitor.visit_expr(right_expression));
10831134
}
10841135
ExprKind::Field(subexpression, ident) => {
10851136
try_visit!(visitor.visit_expr(subexpression));
10861137
try_visit!(visitor.visit_ident(*ident));
10871138
}
1088-
ExprKind::Index(main_expression, index_expression, _) => {
1139+
ExprKind::Index(main_expression, index_expression, _span) => {
10891140
try_visit!(visitor.visit_expr(main_expression));
10901141
try_visit!(visitor.visit_expr(index_expression));
10911142
}
1092-
ExprKind::Range(start, end, _) => {
1143+
ExprKind::Range(start, end, _limit) => {
10931144
visit_opt!(visitor, visit_expr, start);
10941145
visit_opt!(visitor, visit_expr, end);
10951146
}
10961147
ExprKind::Underscore => {}
10971148
ExprKind::Path(maybe_qself, path) => {
1098-
if let Some(qself) = maybe_qself {
1099-
try_visit!(visitor.visit_ty(&qself.ty));
1100-
}
1101-
try_visit!(visitor.visit_path(path, expression.id));
1149+
try_visit!(walk_qself(visitor, maybe_qself));
1150+
try_visit!(visitor.visit_path(path, *id));
11021151
}
11031152
ExprKind::Break(opt_label, opt_expr) => {
11041153
visit_opt!(visitor, visit_label, opt_label);
@@ -1127,48 +1176,63 @@ pub fn walk_expr<'a, V: Visitor<'a>>(visitor: &mut V, expression: &'a Expr) -> V
11271176
}
11281177
ExprKind::Try(subexpression) => try_visit!(visitor.visit_expr(subexpression)),
11291178
ExprKind::TryBlock(body) => try_visit!(visitor.visit_block(body)),
1130-
ExprKind::Lit(_) | ExprKind::IncludedBytes(..) | ExprKind::Err(_) | ExprKind::Dummy => {}
1179+
ExprKind::Lit(_token) => {}
1180+
ExprKind::IncludedBytes(_bytes) => {}
1181+
ExprKind::Err(_guar) => {}
1182+
ExprKind::Dummy => {}
11311183
}
11321184

11331185
visitor.visit_expr_post(expression)
11341186
}
11351187

11361188
pub fn walk_param<'a, V: Visitor<'a>>(visitor: &mut V, param: &'a Param) -> V::Result {
1137-
walk_list!(visitor, visit_attribute, &param.attrs);
1138-
try_visit!(visitor.visit_pat(&param.pat));
1139-
try_visit!(visitor.visit_ty(&param.ty));
1189+
let Param { attrs, ty, pat, id: _, span: _, is_placeholder: _ } = param;
1190+
walk_list!(visitor, visit_attribute, attrs);
1191+
try_visit!(visitor.visit_pat(pat));
1192+
try_visit!(visitor.visit_ty(ty));
11401193
V::Result::output()
11411194
}
11421195

11431196
pub fn walk_arm<'a, V: Visitor<'a>>(visitor: &mut V, arm: &'a Arm) -> V::Result {
1144-
walk_list!(visitor, visit_attribute, &arm.attrs);
1145-
try_visit!(visitor.visit_pat(&arm.pat));
1146-
visit_opt!(visitor, visit_expr, &arm.guard);
1147-
visit_opt!(visitor, visit_expr, &arm.body);
1197+
let Arm { attrs, pat, guard, body, span: _, id: _, is_placeholder: _ } = arm;
1198+
walk_list!(visitor, visit_attribute, attrs);
1199+
try_visit!(visitor.visit_pat(pat));
1200+
visit_opt!(visitor, visit_expr, guard);
1201+
visit_opt!(visitor, visit_expr, body);
11481202
V::Result::output()
11491203
}
11501204

11511205
pub fn walk_vis<'a, V: Visitor<'a>>(visitor: &mut V, vis: &'a Visibility) -> V::Result {
1152-
if let VisibilityKind::Restricted { ref path, id, shorthand: _ } = vis.kind {
1153-
try_visit!(visitor.visit_path(path, id));
1206+
let Visibility { kind, span: _, tokens: _ } = vis;
1207+
match kind {
1208+
VisibilityKind::Restricted { path, id, shorthand: _ } => {
1209+
try_visit!(visitor.visit_path(path, *id));
1210+
}
1211+
VisibilityKind::Public | VisibilityKind::Inherited => {}
11541212
}
11551213
V::Result::output()
11561214
}
11571215

11581216
pub fn walk_attribute<'a, V: Visitor<'a>>(visitor: &mut V, attr: &'a Attribute) -> V::Result {
1159-
match &attr.kind {
1160-
AttrKind::Normal(normal) => try_visit!(walk_attr_args(visitor, &normal.item.args)),
1161-
AttrKind::DocComment(..) => {}
1217+
let Attribute { kind, id: _, style: _, span: _ } = attr;
1218+
match kind {
1219+
AttrKind::Normal(normal) => {
1220+
let NormalAttr { item, tokens: _ } = &**normal;
1221+
let AttrItem { unsafety: _, path, args, tokens: _ } = item;
1222+
try_visit!(visitor.visit_path(path, DUMMY_NODE_ID));
1223+
try_visit!(walk_attr_args(visitor, args));
1224+
}
1225+
AttrKind::DocComment(_kind, _sym) => {}
11621226
}
11631227
V::Result::output()
11641228
}
11651229

11661230
pub fn walk_attr_args<'a, V: Visitor<'a>>(visitor: &mut V, args: &'a AttrArgs) -> V::Result {
11671231
match args {
11681232
AttrArgs::Empty => {}
1169-
AttrArgs::Delimited(_) => {}
1233+
AttrArgs::Delimited(_args) => {}
11701234
AttrArgs::Eq(_eq_span, AttrArgsEq::Ast(expr)) => try_visit!(visitor.visit_expr(expr)),
1171-
AttrArgs::Eq(_, AttrArgsEq::Hir(lit)) => {
1235+
AttrArgs::Eq(_eq_span, AttrArgsEq::Hir(lit)) => {
11721236
unreachable!("in literal form when walking mac args eq: {:?}", lit)
11731237
}
11741238
}

‎tests/ui/stats/hir-stats.stderr

Lines changed: 31 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,13 @@ ast-stats-1 - DocComment 32 ( 0.5%) 1
1313
ast-stats-1 Local 80 ( 1.2%) 1 80
1414
ast-stats-1 ForeignItem 88 ( 1.3%) 1 88
1515
ast-stats-1 - Fn 88 ( 1.3%) 1
16-
ast-stats-1 Arm 96 ( 1.5%) 2 48
16+
ast-stats-1 Arm 96 ( 1.4%) 2 48
1717
ast-stats-1 FnDecl 120 ( 1.8%) 5 24
1818
ast-stats-1 FieldDef 160 ( 2.4%) 2 80
1919
ast-stats-1 Stmt 160 ( 2.4%) 5 32
2020
ast-stats-1 - Let 32 ( 0.5%) 1
2121
ast-stats-1 - MacCall 32 ( 0.5%) 1
22-
ast-stats-1 - Expr 96 ( 1.5%) 3
22+
ast-stats-1 - Expr 96 ( 1.4%) 3
2323
ast-stats-1 Param 160 ( 2.4%) 4 40
2424
ast-stats-1 Block 192 ( 2.9%) 6 32
2525
ast-stats-1 Variant 208 ( 3.1%) 2 104
@@ -28,7 +28,7 @@ ast-stats-1 - Trait 352 ( 5.3%) 4
2828
ast-stats-1 AssocItem 352 ( 5.3%) 4 88
2929
ast-stats-1 - Type 176 ( 2.7%) 2
3030
ast-stats-1 - Fn 176 ( 2.7%) 2
31-
ast-stats-1 GenericParam 480 ( 7.3%) 5 96
31+
ast-stats-1 GenericParam 480 ( 7.2%) 5 96
3232
ast-stats-1 Pat 504 ( 7.6%) 7 72
3333
ast-stats-1 - Struct 72 ( 1.1%) 1
3434
ast-stats-1 - Wild 72 ( 1.1%) 1
@@ -39,37 +39,37 @@ ast-stats-1 - Match 72 ( 1.1%) 1
3939
ast-stats-1 - Struct 72 ( 1.1%) 1
4040
ast-stats-1 - Lit 144 ( 2.2%) 2
4141
ast-stats-1 - Block 216 ( 3.3%) 3
42-
ast-stats-1 PathSegment 720 (10.9%) 30 24
42+
ast-stats-1 PathSegment 744 (11.2%) 31 24
4343
ast-stats-1 Ty 896 (13.5%) 14 64
4444
ast-stats-1 - Ptr 64 ( 1.0%) 1
4545
ast-stats-1 - Ref 64 ( 1.0%) 1
4646
ast-stats-1 - ImplicitSelf 128 ( 1.9%) 2
47-
ast-stats-1 - Path 640 ( 9.7%) 10
48-
ast-stats-1 Item 1_224 (18.5%) 9 136
49-
ast-stats-1 - Trait 136 ( 2.1%) 1
50-
ast-stats-1 - Enum 136 ( 2.1%) 1
51-
ast-stats-1 - ForeignMod 136 ( 2.1%) 1
52-
ast-stats-1 - Impl 136 ( 2.1%) 1
47+
ast-stats-1 - Path 640 ( 9.6%) 10
48+
ast-stats-1 Item 1_224 (18.4%) 9 136
49+
ast-stats-1 - Trait 136 ( 2.0%) 1
50+
ast-stats-1 - Enum 136 ( 2.0%) 1
51+
ast-stats-1 - ForeignMod 136 ( 2.0%) 1
52+
ast-stats-1 - Impl 136 ( 2.0%) 1
5353
ast-stats-1 - Fn 272 ( 4.1%) 2
54-
ast-stats-1 - Use 408 ( 6.2%) 3
54+
ast-stats-1 - Use 408 ( 6.1%) 3
5555
ast-stats-1 ----------------------------------------------------------------
56-
ast-stats-1 Total 6_616
56+
ast-stats-1 Total 6_640
5757
ast-stats-1
5858
ast-stats-2 POST EXPANSION AST STATS
5959
ast-stats-2 Name Accumulated Size Count Item Size
6060
ast-stats-2 ----------------------------------------------------------------
61-
ast-stats-2 GenericArgs 40 ( 0.6%) 1 40
62-
ast-stats-2 - AngleBracketed 40 ( 0.6%) 1
63-
ast-stats-2 Crate 40 ( 0.6%) 1 40
61+
ast-stats-2 GenericArgs 40 ( 0.5%) 1 40
62+
ast-stats-2 - AngleBracketed 40 ( 0.5%) 1
63+
ast-stats-2 Crate 40 ( 0.5%) 1 40
6464
ast-stats-2 ExprField 48 ( 0.7%) 1 48
6565
ast-stats-2 WherePredicate 56 ( 0.8%) 1 56
6666
ast-stats-2 - BoundPredicate 56 ( 0.8%) 1
6767
ast-stats-2 Local 80 ( 1.1%) 1 80
6868
ast-stats-2 ForeignItem 88 ( 1.2%) 1 88
6969
ast-stats-2 - Fn 88 ( 1.2%) 1
7070
ast-stats-2 Arm 96 ( 1.3%) 2 48
71-
ast-stats-2 InlineAsm 120 ( 1.7%) 1 120
72-
ast-stats-2 FnDecl 120 ( 1.7%) 5 24
71+
ast-stats-2 InlineAsm 120 ( 1.6%) 1 120
72+
ast-stats-2 FnDecl 120 ( 1.6%) 5 24
7373
ast-stats-2 Attribute 128 ( 1.8%) 4 32
7474
ast-stats-2 - DocComment 32 ( 0.4%) 1
7575
ast-stats-2 - Normal 96 ( 1.3%) 3
@@ -79,41 +79,41 @@ ast-stats-2 - Let 32 ( 0.4%) 1
7979
ast-stats-2 - Semi 32 ( 0.4%) 1
8080
ast-stats-2 - Expr 96 ( 1.3%) 3
8181
ast-stats-2 Param 160 ( 2.2%) 4 40
82-
ast-stats-2 Block 192 ( 2.7%) 6 32
82+
ast-stats-2 Block 192 ( 2.6%) 6 32
8383
ast-stats-2 Variant 208 ( 2.9%) 2 104
84-
ast-stats-2 GenericBound 352 ( 4.9%) 4 88
85-
ast-stats-2 - Trait 352 ( 4.9%) 4
86-
ast-stats-2 AssocItem 352 ( 4.9%) 4 88
84+
ast-stats-2 GenericBound 352 ( 4.8%) 4 88
85+
ast-stats-2 - Trait 352 ( 4.8%) 4
86+
ast-stats-2 AssocItem 352 ( 4.8%) 4 88
8787
ast-stats-2 - Type 176 ( 2.4%) 2
8888
ast-stats-2 - Fn 176 ( 2.4%) 2
89-
ast-stats-2 GenericParam 480 ( 6.7%) 5 96
90-
ast-stats-2 Pat 504 ( 7.0%) 7 72
89+
ast-stats-2 GenericParam 480 ( 6.6%) 5 96
90+
ast-stats-2 Pat 504 ( 6.9%) 7 72
9191
ast-stats-2 - Struct 72 ( 1.0%) 1
9292
ast-stats-2 - Wild 72 ( 1.0%) 1
93-
ast-stats-2 - Ident 360 ( 5.0%) 5
94-
ast-stats-2 Expr 648 ( 9.0%) 9 72
93+
ast-stats-2 - Ident 360 ( 4.9%) 5
94+
ast-stats-2 Expr 648 ( 8.9%) 9 72
9595
ast-stats-2 - Path 72 ( 1.0%) 1
9696
ast-stats-2 - Match 72 ( 1.0%) 1
9797
ast-stats-2 - Struct 72 ( 1.0%) 1
9898
ast-stats-2 - InlineAsm 72 ( 1.0%) 1
9999
ast-stats-2 - Lit 144 ( 2.0%) 2
100100
ast-stats-2 - Block 216 ( 3.0%) 3
101-
ast-stats-2 PathSegment 792 (11.0%) 33 24
102-
ast-stats-2 Ty 896 (12.4%) 14 64
101+
ast-stats-2 PathSegment 864 (11.9%) 36 24
102+
ast-stats-2 Ty 896 (12.3%) 14 64
103103
ast-stats-2 - Ptr 64 ( 0.9%) 1
104104
ast-stats-2 - Ref 64 ( 0.9%) 1
105105
ast-stats-2 - ImplicitSelf 128 ( 1.8%) 2
106-
ast-stats-2 - Path 640 ( 8.9%) 10
107-
ast-stats-2 Item 1_496 (20.7%) 11 136
106+
ast-stats-2 - Path 640 ( 8.8%) 10
107+
ast-stats-2 Item 1_496 (20.5%) 11 136
108108
ast-stats-2 - Trait 136 ( 1.9%) 1
109109
ast-stats-2 - Enum 136 ( 1.9%) 1
110110
ast-stats-2 - ExternCrate 136 ( 1.9%) 1
111111
ast-stats-2 - ForeignMod 136 ( 1.9%) 1
112112
ast-stats-2 - Impl 136 ( 1.9%) 1
113-
ast-stats-2 - Fn 272 ( 3.8%) 2
113+
ast-stats-2 - Fn 272 ( 3.7%) 2
114114
ast-stats-2 - Use 544 ( 7.5%) 4
115115
ast-stats-2 ----------------------------------------------------------------
116-
ast-stats-2 Total 7_216
116+
ast-stats-2 Total 7_288
117117
ast-stats-2
118118
hir-stats HIR STATS
119119
hir-stats Name Accumulated Size Count Item Size

0 commit comments

Comments
 (0)
Please sign in to comment.