Skip to content

Commit 4fbff98

Browse files
committed
Complete mut_visit.
1 parent 8133ae4 commit 4fbff98

File tree

1 file changed

+89
-19
lines changed

1 file changed

+89
-19
lines changed

compiler/rustc_ast/src/mut_visit.rs

+89-19
Original file line numberDiff line numberDiff line change
@@ -871,7 +871,8 @@ fn visit_constness<T: MutVisitor>(constness: &mut Const, vis: &mut T) {
871871
fn noop_visit_closure_binder<T: MutVisitor>(binder: &mut ClosureBinder, vis: &mut T) {
872872
match binder {
873873
ClosureBinder::NotPresent => {}
874-
ClosureBinder::For { span: _, generic_params } => {
874+
ClosureBinder::For { span, generic_params } => {
875+
vis.visit_span(span);
875876
generic_params.flat_map_in_place(|param| vis.flat_map_generic_param(param));
876877
}
877878
}
@@ -904,7 +905,10 @@ fn noop_visit_fn_ret_ty<T: MutVisitor>(fn_ret_ty: &mut FnRetTy, vis: &mut T) {
904905

905906
fn noop_visit_param_bound<T: MutVisitor>(pb: &mut GenericBound, vis: &mut T) {
906907
match pb {
907-
GenericBound::Trait(ty, _modifier) => vis.visit_poly_trait_ref(ty),
908+
GenericBound::Trait(ty, modifier) => {
909+
vis.visit_poly_trait_ref(ty);
910+
visit_trait_bound_modifier(modifier, vis);
911+
}
908912
GenericBound::Outlives(lifetime) => noop_visit_lifetime(lifetime, vis),
909913
GenericBound::Use(args, span) => {
910914
for arg in args {
@@ -915,6 +919,22 @@ fn noop_visit_param_bound<T: MutVisitor>(pb: &mut GenericBound, vis: &mut T) {
915919
}
916920
}
917921

922+
fn visit_trait_bound_modifier<T: MutVisitor>(tbm: &mut TraitBoundModifiers, vis: &mut T) {
923+
let TraitBoundModifiers { constness, asyncness, polarity } = tbm;
924+
match constness {
925+
BoundConstness::Never => {}
926+
BoundConstness::Always(span) | BoundConstness::Maybe(span) => vis.visit_span(span),
927+
}
928+
match asyncness {
929+
BoundAsyncness::Normal => {}
930+
BoundAsyncness::Async(span) => vis.visit_span(span),
931+
}
932+
match polarity {
933+
BoundPolarity::Positive => {}
934+
BoundPolarity::Negative(span) | BoundPolarity::Maybe(span) => vis.visit_span(span),
935+
}
936+
}
937+
918938
fn noop_visit_precise_capturing_arg<T: MutVisitor>(arg: &mut PreciseCapturingArg, vis: &mut T) {
919939
match arg {
920940
PreciseCapturingArg::Lifetime(lt) => {
@@ -1369,21 +1389,24 @@ pub fn noop_visit_pat<T: MutVisitor>(pat: &mut P<Pat>, vis: &mut T) {
13691389
vis.visit_span(span);
13701390
}
13711391

1372-
fn noop_visit_anon_const<T: MutVisitor>(AnonConst { id, value }: &mut AnonConst, vis: &mut T) {
1392+
pub fn noop_visit_anon_const<T: MutVisitor>(AnonConst { id, value }: &mut AnonConst, vis: &mut T) {
13731393
vis.visit_id(id);
13741394
vis.visit_expr(value);
13751395
}
13761396

13771397
fn noop_visit_inline_asm<T: MutVisitor>(asm: &mut InlineAsm, vis: &mut T) {
1378-
// FIXME: Visit spans inside all this currently ignored stuff.
1379-
let InlineAsm {
1380-
template: _,
1381-
template_strs: _,
1382-
operands,
1383-
clobber_abis: _,
1384-
options: _,
1385-
line_spans: _,
1386-
} = asm;
1398+
let InlineAsm { template, template_strs, operands, clobber_abis, options: _, line_spans } = asm;
1399+
for piece in template.iter_mut() {
1400+
match piece {
1401+
InlineAsmTemplatePiece::String(_str) => {}
1402+
InlineAsmTemplatePiece::Placeholder { operand_idx: _, modifier: _, span } => {
1403+
vis.visit_span(span)
1404+
}
1405+
}
1406+
}
1407+
for (_s1, _s2, span) in template_strs.iter_mut() {
1408+
vis.visit_span(span)
1409+
}
13871410
for (op, span) in operands {
13881411
match op {
13891412
InlineAsmOperand::In { expr, reg: _ }
@@ -1402,6 +1425,12 @@ fn noop_visit_inline_asm<T: MutVisitor>(asm: &mut InlineAsm, vis: &mut T) {
14021425
}
14031426
vis.visit_span(span);
14041427
}
1428+
for (_s1, span) in clobber_abis.iter_mut() {
1429+
vis.visit_span(span)
1430+
}
1431+
for span in line_spans.iter_mut() {
1432+
vis.visit_span(span)
1433+
}
14051434
}
14061435

14071436
fn noop_visit_inline_asm_sym<T: MutVisitor>(
@@ -1414,8 +1443,7 @@ fn noop_visit_inline_asm_sym<T: MutVisitor>(
14141443
}
14151444

14161445
fn noop_visit_format_args<T: MutVisitor>(fmt: &mut FormatArgs, vis: &mut T) {
1417-
// FIXME: visit the template exhaustively.
1418-
let FormatArgs { span, template: _, arguments } = fmt;
1446+
let FormatArgs { span, template, arguments } = fmt;
14191447
for FormatArgument { kind, expr } in arguments.all_args_mut() {
14201448
match kind {
14211449
FormatArgumentKind::Named(ident) | FormatArgumentKind::Captured(ident) => {
@@ -1425,9 +1453,48 @@ fn noop_visit_format_args<T: MutVisitor>(fmt: &mut FormatArgs, vis: &mut T) {
14251453
}
14261454
vis.visit_expr(expr);
14271455
}
1456+
for piece in template.iter_mut() {
1457+
match piece {
1458+
FormatArgsPiece::Literal(_symbol) => {}
1459+
FormatArgsPiece::Placeholder(placeholder) => visit_format_placeholder(placeholder, vis),
1460+
}
1461+
}
14281462
vis.visit_span(span);
14291463
}
14301464

1465+
fn visit_format_placeholder<T: MutVisitor>(
1466+
FormatPlaceholder { argument, span, format_options, format_trait: _ }: &mut FormatPlaceholder,
1467+
vis: &mut T,
1468+
) {
1469+
visit_opt(span, |span| vis.visit_span(span));
1470+
let FormatArgPosition { span, index: _, kind: _ } = argument;
1471+
visit_opt(span, |span| vis.visit_span(span));
1472+
let FormatOptions {
1473+
width,
1474+
precision,
1475+
alignment: _,
1476+
fill: _,
1477+
sign: _,
1478+
alternate: _,
1479+
zero_pad: _,
1480+
debug_hex: _,
1481+
} = format_options;
1482+
match width {
1483+
None => {}
1484+
Some(FormatCount::Literal(_)) => {}
1485+
Some(FormatCount::Argument(FormatArgPosition { span, index: _, kind: _ })) => {
1486+
visit_opt(span, |span| vis.visit_span(span))
1487+
}
1488+
}
1489+
match precision {
1490+
None => {}
1491+
Some(FormatCount::Literal(_)) => {}
1492+
Some(FormatCount::Argument(FormatArgPosition { span, index: _, kind: _ })) => {
1493+
visit_opt(span, |span| vis.visit_span(span))
1494+
}
1495+
}
1496+
}
1497+
14311498
pub fn noop_visit_expr<T: MutVisitor>(
14321499
Expr { kind, id, span, attrs, tokens }: &mut Expr,
14331500
vis: &mut T,
@@ -1461,7 +1528,8 @@ pub fn noop_visit_expr<T: MutVisitor>(
14611528
visit_thin_exprs(call_args, vis);
14621529
vis.visit_span(span);
14631530
}
1464-
ExprKind::Binary(_binop, lhs, rhs) => {
1531+
ExprKind::Binary(Spanned { node: _binop, span }, lhs, rhs) => {
1532+
vis.visit_span(span);
14651533
vis.visit_expr(lhs);
14661534
vis.visit_expr(rhs);
14671535
}
@@ -1529,9 +1597,10 @@ pub fn noop_visit_expr<T: MutVisitor>(
15291597
visit_opt(label, |label| vis.visit_label(label));
15301598
vis.visit_block(blk);
15311599
}
1532-
ExprKind::Gen(_capture_by, body, _kind, decl_span) => {
1600+
ExprKind::Gen(capture_clause, body, _kind, decl_span) => {
15331601
vis.visit_block(body);
15341602
vis.visit_span(decl_span);
1603+
vis.visit_capture_by(capture_clause);
15351604
}
15361605
ExprKind::Await(expr, await_kw_span) => {
15371606
vis.visit_expr(expr);
@@ -1542,7 +1611,8 @@ pub fn noop_visit_expr<T: MutVisitor>(
15421611
vis.visit_expr(er);
15431612
vis.visit_span(span);
15441613
}
1545-
ExprKind::AssignOp(_op, el, er) => {
1614+
ExprKind::AssignOp(Spanned { node: _binop, span }, el, er) => {
1615+
vis.visit_span(span);
15461616
vis.visit_expr(el);
15471617
vis.visit_expr(er);
15481618
}
@@ -1594,7 +1664,7 @@ pub fn noop_visit_expr<T: MutVisitor>(
15941664
fields.flat_map_in_place(|field| vis.flat_map_expr_field(field));
15951665
match rest {
15961666
StructRest::Base(expr) => vis.visit_expr(expr),
1597-
StructRest::Rest(_span) => {}
1667+
StructRest::Rest(span) => vis.visit_span(span),
15981668
StructRest::None => {}
15991669
}
16001670
}
@@ -1627,6 +1697,7 @@ pub fn noop_flat_map_stmt<T: MutVisitor>(
16271697
vis: &mut T,
16281698
) -> SmallVec<[Stmt; 1]> {
16291699
vis.visit_id(&mut id);
1700+
vis.visit_span(&mut span);
16301701
let stmts: SmallVec<_> = noop_flat_map_stmt_kind(kind, vis)
16311702
.into_iter()
16321703
.map(|kind| Stmt { id, kind, span })
@@ -1637,7 +1708,6 @@ pub fn noop_flat_map_stmt<T: MutVisitor>(
16371708
the visitor should implement custom statement visiting"
16381709
);
16391710
}
1640-
vis.visit_span(&mut span);
16411711
stmts
16421712
}
16431713

0 commit comments

Comments
 (0)