@@ -1202,9 +1202,10 @@ macro_rules! common_visitor_and_walkers {
12021202 let TyPat { id, kind, span, tokens: _ } = tp;
12031203 try_visit!(visit_id(vis, id));
12041204 match kind {
1205- TyPatKind::Range(start, end, _include_end) => {
1205+ TyPatKind::Range(start, end, Spanned { span, node: _include_end } ) => {
12061206 visit_opt!(vis, visit_anon_const, start);
12071207 visit_opt!(vis, visit_anon_const, end);
1208+ try_visit!(visit_span(vis, span));
12081209 }
12091210 TyPatKind::Or(variants) => walk_list!(vis, visit_ty_pat, variants),
12101211 TyPatKind::Err(_) => {}
@@ -1523,16 +1524,26 @@ macro_rules! common_visitor_and_walkers {
15231524 }
15241525
15251526 pub fn walk_inline_asm<$($lt,)? V: $Visitor$(<$lt>)?>(vis: &mut V, asm: &$($lt)? $($mut)? InlineAsm) -> V::Result {
1526- // FIXME: Visit spans inside all this currently ignored stuff.
15271527 let InlineAsm {
15281528 asm_macro: _,
1529- template: _ ,
1530- template_strs: _ ,
1529+ template,
1530+ template_strs,
15311531 operands,
1532- clobber_abis: _ ,
1532+ clobber_abis,
15331533 options: _,
1534- line_spans: _ ,
1534+ line_spans,
15351535 } = asm;
1536+ for piece in template {
1537+ match piece {
1538+ InlineAsmTemplatePiece::String(_str) => {}
1539+ InlineAsmTemplatePiece::Placeholder { operand_idx: _, modifier: _, span } => {
1540+ try_visit!(visit_span(vis, span));
1541+ }
1542+ }
1543+ }
1544+ for (_s1, _s2, span) in template_strs {
1545+ try_visit!(visit_span(vis, span));
1546+ }
15361547 for (op, span) in operands {
15371548 match op {
15381549 InlineAsmOperand::In { expr, reg: _ }
@@ -1553,6 +1564,12 @@ macro_rules! common_visitor_and_walkers {
15531564 }
15541565 try_visit!(visit_span(vis, span));
15551566 }
1567+ for (_s1, span) in clobber_abis {
1568+ try_visit!(visit_span(vis, span))
1569+ }
1570+ for span in line_spans {
1571+ try_visit!(visit_span(vis, span))
1572+ }
15561573 V::Result::output()
15571574 }
15581575
@@ -1565,9 +1582,9 @@ macro_rules! common_visitor_and_walkers {
15651582 vis.visit_path(path)
15661583 }
15671584
1568- // FIXME: visit the template exhaustively.
15691585 pub fn walk_format_args<$($lt,)? V: $Visitor$(<$lt>)?>(vis: &mut V, fmt: &$($lt)? $($mut)? FormatArgs) -> V::Result {
1570- let FormatArgs { span, template: _, arguments, uncooked_fmt_str: _, is_source_literal: _ } = fmt;
1586+ let FormatArgs { span, template, arguments, uncooked_fmt_str: _, is_source_literal: _ } = fmt;
1587+
15711588 let args = $(${ignore($mut)} arguments.all_args_mut())? $(${ignore($lt)} arguments.all_args())? ;
15721589 for FormatArgument { kind, expr } in args {
15731590 match kind {
@@ -1578,9 +1595,58 @@ macro_rules! common_visitor_and_walkers {
15781595 }
15791596 try_visit!(vis.visit_expr(expr));
15801597 }
1598+ for piece in template {
1599+ match piece {
1600+ FormatArgsPiece::Literal(_symbol) => {}
1601+ FormatArgsPiece::Placeholder(placeholder) => try_visit!(walk_format_placeholder(vis, placeholder)),
1602+ }
1603+ }
15811604 visit_span(vis, span)
15821605 }
15831606
1607+ fn walk_format_placeholder<$($lt,)? V: $Visitor$(<$lt>)?>(
1608+ vis: &mut V,
1609+ placeholder: &$($lt)? $($mut)? FormatPlaceholder,
1610+ ) -> V::Result {
1611+ let FormatPlaceholder { argument, span, format_options, format_trait: _ } = placeholder;
1612+ if let Some(span) = span {
1613+ try_visit!(visit_span(vis, span));
1614+ }
1615+ let FormatArgPosition { span, index: _, kind: _ } = argument;
1616+ if let Some(span) = span {
1617+ try_visit!(visit_span(vis, span));
1618+ }
1619+ let FormatOptions {
1620+ width,
1621+ precision,
1622+ alignment: _,
1623+ fill: _,
1624+ sign: _,
1625+ alternate: _,
1626+ zero_pad: _,
1627+ debug_hex: _,
1628+ } = format_options;
1629+ match width {
1630+ None => {}
1631+ Some(FormatCount::Literal(_)) => {}
1632+ Some(FormatCount::Argument(FormatArgPosition { span, index: _, kind: _ })) => {
1633+ if let Some(span) = span {
1634+ try_visit!(visit_span(vis, span));
1635+ }
1636+ }
1637+ }
1638+ match precision {
1639+ None => {}
1640+ Some(FormatCount::Literal(_)) => {}
1641+ Some(FormatCount::Argument(FormatArgPosition { span, index: _, kind: _ })) => {
1642+ if let Some(span) = span {
1643+ try_visit!(visit_span(vis, span));
1644+ }
1645+ }
1646+ }
1647+ V::Result::output()
1648+ }
1649+
15841650 pub fn walk_expr<$($lt,)? V: $Visitor$(<$lt>)?>(vis: &mut V, expression: &$($lt)? $($mut)? Expr) -> V::Result {
15851651 let Expr { id, kind, span, attrs, tokens: _ } = expression;
15861652 try_visit!(visit_id(vis, id));
@@ -1601,7 +1667,7 @@ macro_rules! common_visitor_and_walkers {
16011667 try_visit!(visit_expr_fields(vis, fields));
16021668 match rest {
16031669 StructRest::Base(expr) => try_visit!(vis.visit_expr(expr)),
1604- StructRest::Rest(_span ) => {}
1670+ StructRest::Rest(span ) => try_visit!(visit_span(vis, span)),
16051671 StructRest::None => {}
16061672 }
16071673 }
@@ -1688,7 +1754,8 @@ macro_rules! common_visitor_and_walkers {
16881754 visit_opt!(vis, visit_label, opt_label);
16891755 try_visit!(vis.visit_block(block));
16901756 }
1691- ExprKind::Gen(_capt, body, _kind, decl_span) => {
1757+ ExprKind::Gen(capture_clause, body, _kind, decl_span) => {
1758+ try_visit!(vis.visit_capture_by(capture_clause));
16921759 try_visit!(vis.visit_block(body));
16931760 try_visit!(visit_span(vis, decl_span));
16941761 }
@@ -1705,9 +1772,10 @@ macro_rules! common_visitor_and_walkers {
17051772 try_visit!(vis.visit_expr(rhs));
17061773 try_visit!(visit_span(vis, span));
17071774 }
1708- ExprKind::AssignOp(_op , left_expression, right_expression) => {
1775+ ExprKind::AssignOp(Spanned { span, node: _ } , left_expression, right_expression) => {
17091776 try_visit!(vis.visit_expr(left_expression));
17101777 try_visit!(vis.visit_expr(right_expression));
1778+ try_visit!(visit_span(vis, span));
17111779 }
17121780 ExprKind::Field(subexpression, ident) => {
17131781 try_visit!(vis.visit_expr(subexpression));
0 commit comments