@@ -1202,9 +1202,10 @@ macro_rules! common_visitor_and_walkers {
1202
1202
let TyPat { id, kind, span, tokens: _ } = tp;
1203
1203
try_visit!( visit_id( vis, id) ) ;
1204
1204
match kind {
1205
- TyPatKind :: Range ( start, end, _include_end) => {
1205
+ TyPatKind :: Range ( start, end, Spanned { span , node : _include_end } ) => {
1206
1206
visit_opt!( vis, visit_anon_const, start) ;
1207
1207
visit_opt!( vis, visit_anon_const, end) ;
1208
+ try_visit!( visit_span( vis, span) ) ;
1208
1209
}
1209
1210
TyPatKind :: Or ( variants) => walk_list!( vis, visit_ty_pat, variants) ,
1210
1211
TyPatKind :: Err ( _) => { }
@@ -1523,16 +1524,26 @@ macro_rules! common_visitor_and_walkers {
1523
1524
}
1524
1525
1525
1526
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.
1527
1527
let InlineAsm {
1528
1528
asm_macro: _,
1529
- template: _ ,
1530
- template_strs: _ ,
1529
+ template,
1530
+ template_strs,
1531
1531
operands,
1532
- clobber_abis: _ ,
1532
+ clobber_abis,
1533
1533
options: _,
1534
- line_spans: _ ,
1534
+ line_spans,
1535
1535
} = 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
+ }
1536
1547
for ( op, span) in operands {
1537
1548
match op {
1538
1549
InlineAsmOperand :: In { expr, reg: _ }
@@ -1553,6 +1564,12 @@ macro_rules! common_visitor_and_walkers {
1553
1564
}
1554
1565
try_visit!( visit_span( vis, span) ) ;
1555
1566
}
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
+ }
1556
1573
V :: Result :: output( )
1557
1574
}
1558
1575
@@ -1565,9 +1582,9 @@ macro_rules! common_visitor_and_walkers {
1565
1582
vis. visit_path( path)
1566
1583
}
1567
1584
1568
- // FIXME: visit the template exhaustively.
1569
1585
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
+
1571
1588
let args = $( ${ ignore( $mut) } arguments. all_args_mut( ) ) ? $( ${ ignore( $lt) } arguments. all_args( ) ) ? ;
1572
1589
for FormatArgument { kind, expr } in args {
1573
1590
match kind {
@@ -1578,9 +1595,58 @@ macro_rules! common_visitor_and_walkers {
1578
1595
}
1579
1596
try_visit!( vis. visit_expr( expr) ) ;
1580
1597
}
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
+ }
1581
1604
visit_span( vis, span)
1582
1605
}
1583
1606
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
+
1584
1650
pub fn walk_expr<$( $lt, ) ? V : $Visitor$( <$lt>) ?>( vis: & mut V , expression: & $( $lt) ? $( $mut) ? Expr ) -> V :: Result {
1585
1651
let Expr { id, kind, span, attrs, tokens: _ } = expression;
1586
1652
try_visit!( visit_id( vis, id) ) ;
@@ -1601,7 +1667,7 @@ macro_rules! common_visitor_and_walkers {
1601
1667
try_visit!( visit_expr_fields( vis, fields) ) ;
1602
1668
match rest {
1603
1669
StructRest :: Base ( expr) => try_visit!( vis. visit_expr( expr) ) ,
1604
- StructRest :: Rest ( _span ) => { }
1670
+ StructRest :: Rest ( span ) => try_visit! ( visit_span ( vis , span ) ) ,
1605
1671
StructRest :: None => { }
1606
1672
}
1607
1673
}
@@ -1688,7 +1754,8 @@ macro_rules! common_visitor_and_walkers {
1688
1754
visit_opt!( vis, visit_label, opt_label) ;
1689
1755
try_visit!( vis. visit_block( block) ) ;
1690
1756
}
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) ) ;
1692
1759
try_visit!( vis. visit_block( body) ) ;
1693
1760
try_visit!( visit_span( vis, decl_span) ) ;
1694
1761
}
@@ -1705,9 +1772,10 @@ macro_rules! common_visitor_and_walkers {
1705
1772
try_visit!( vis. visit_expr( rhs) ) ;
1706
1773
try_visit!( visit_span( vis, span) ) ;
1707
1774
}
1708
- ExprKind :: AssignOp ( _op , left_expression, right_expression) => {
1775
+ ExprKind :: AssignOp ( Spanned { span , node : _ } , left_expression, right_expression) => {
1709
1776
try_visit!( vis. visit_expr( left_expression) ) ;
1710
1777
try_visit!( vis. visit_expr( right_expression) ) ;
1778
+ try_visit!( visit_span( vis, span) ) ;
1711
1779
}
1712
1780
ExprKind :: Field ( subexpression, ident) => {
1713
1781
try_visit!( vis. visit_expr( subexpression) ) ;
0 commit comments