@@ -860,7 +860,8 @@ fn visit_constness<T: MutVisitor>(vis: &mut T, constness: &mut Const) {
860
860
fn walk_closure_binder < T : MutVisitor > ( vis : & mut T , binder : & mut ClosureBinder ) {
861
861
match binder {
862
862
ClosureBinder :: NotPresent => { }
863
- ClosureBinder :: For { span : _, generic_params } => {
863
+ ClosureBinder :: For { span, generic_params } => {
864
+ vis. visit_span ( span) ;
864
865
generic_params. flat_map_in_place ( |param| vis. flat_map_generic_param ( param) ) ;
865
866
}
866
867
}
@@ -924,6 +925,22 @@ fn walk_param_bound<T: MutVisitor>(vis: &mut T, pb: &mut GenericBound) {
924
925
}
925
926
}
926
927
928
+ fn walk_trait_bound_modifier < T : MutVisitor > ( vis : & mut T , tbm : & mut TraitBoundModifiers ) {
929
+ let TraitBoundModifiers { constness, asyncness, polarity } = tbm;
930
+ match constness {
931
+ BoundConstness :: Never => { }
932
+ BoundConstness :: Always ( span) | BoundConstness :: Maybe ( span) => vis. visit_span ( span) ,
933
+ }
934
+ match asyncness {
935
+ BoundAsyncness :: Normal => { }
936
+ BoundAsyncness :: Async ( span) => vis. visit_span ( span) ,
937
+ }
938
+ match polarity {
939
+ BoundPolarity :: Positive => { }
940
+ BoundPolarity :: Negative ( span) | BoundPolarity :: Maybe ( span) => vis. visit_span ( span) ,
941
+ }
942
+ }
943
+
927
944
fn walk_precise_capturing_arg < T : MutVisitor > ( vis : & mut T , arg : & mut PreciseCapturingArg ) {
928
945
match arg {
929
946
PreciseCapturingArg :: Lifetime ( lt) => {
@@ -1035,9 +1052,10 @@ fn walk_trait_ref<T: MutVisitor>(vis: &mut T, TraitRef { path, ref_id }: &mut Tr
1035
1052
}
1036
1053
1037
1054
fn walk_poly_trait_ref < T : MutVisitor > ( vis : & mut T , p : & mut PolyTraitRef ) {
1038
- let PolyTraitRef { bound_generic_params, modifiers : _ , trait_ref, span } = p;
1055
+ let PolyTraitRef { bound_generic_params, modifiers, trait_ref, span } = p;
1039
1056
bound_generic_params. flat_map_in_place ( |param| vis. flat_map_generic_param ( param) ) ;
1040
1057
vis. visit_trait_ref ( trait_ref) ;
1058
+ walk_trait_bound_modifier ( vis, modifiers) ;
1041
1059
vis. visit_span ( span) ;
1042
1060
}
1043
1061
@@ -1377,22 +1395,32 @@ pub fn walk_pat<T: MutVisitor>(vis: &mut T, pat: &mut P<Pat>) {
1377
1395
vis. visit_span ( span) ;
1378
1396
}
1379
1397
1380
- fn walk_anon_const < T : MutVisitor > ( vis : & mut T , AnonConst { id, value } : & mut AnonConst ) {
1398
+ pub fn walk_anon_const < T : MutVisitor > ( vis : & mut T , AnonConst { id, value } : & mut AnonConst ) {
1381
1399
vis. visit_id ( id) ;
1382
1400
vis. visit_expr ( value) ;
1383
1401
}
1384
1402
1385
1403
fn walk_inline_asm < T : MutVisitor > ( vis : & mut T , asm : & mut InlineAsm ) {
1386
- // FIXME: Visit spans inside all this currently ignored stuff.
1387
1404
let InlineAsm {
1388
1405
asm_macro : _,
1389
- template : _ ,
1390
- template_strs : _ ,
1406
+ template,
1407
+ template_strs,
1391
1408
operands,
1392
- clobber_abis : _ ,
1409
+ clobber_abis,
1393
1410
options : _,
1394
- line_spans : _ ,
1411
+ line_spans,
1395
1412
} = asm;
1413
+ for piece in template. iter_mut ( ) {
1414
+ match piece {
1415
+ InlineAsmTemplatePiece :: String ( _str) => { }
1416
+ InlineAsmTemplatePiece :: Placeholder { operand_idx : _, modifier : _, span } => {
1417
+ vis. visit_span ( span)
1418
+ }
1419
+ }
1420
+ }
1421
+ for ( _s1, _s2, span) in template_strs. iter_mut ( ) {
1422
+ vis. visit_span ( span)
1423
+ }
1396
1424
for ( op, span) in operands {
1397
1425
match op {
1398
1426
InlineAsmOperand :: In { expr, reg : _ }
@@ -1411,6 +1439,12 @@ fn walk_inline_asm<T: MutVisitor>(vis: &mut T, asm: &mut InlineAsm) {
1411
1439
}
1412
1440
vis. visit_span ( span) ;
1413
1441
}
1442
+ for ( _s1, span) in clobber_abis. iter_mut ( ) {
1443
+ vis. visit_span ( span)
1444
+ }
1445
+ for span in line_spans. iter_mut ( ) {
1446
+ vis. visit_span ( span)
1447
+ }
1414
1448
}
1415
1449
1416
1450
fn walk_inline_asm_sym < T : MutVisitor > (
@@ -1423,8 +1457,7 @@ fn walk_inline_asm_sym<T: MutVisitor>(
1423
1457
}
1424
1458
1425
1459
fn walk_format_args < T : MutVisitor > ( vis : & mut T , fmt : & mut FormatArgs ) {
1426
- // FIXME: visit the template exhaustively.
1427
- let FormatArgs { span, template : _, arguments } = fmt;
1460
+ let FormatArgs { span, template, arguments } = fmt;
1428
1461
for FormatArgument { kind, expr } in arguments. all_args_mut ( ) {
1429
1462
match kind {
1430
1463
FormatArgumentKind :: Named ( ident) | FormatArgumentKind :: Captured ( ident) => {
@@ -1434,9 +1467,48 @@ fn walk_format_args<T: MutVisitor>(vis: &mut T, fmt: &mut FormatArgs) {
1434
1467
}
1435
1468
vis. visit_expr ( expr) ;
1436
1469
}
1470
+ for piece in template. iter_mut ( ) {
1471
+ match piece {
1472
+ FormatArgsPiece :: Literal ( _symbol) => { }
1473
+ FormatArgsPiece :: Placeholder ( placeholder) => walk_format_placeholder ( vis, placeholder) ,
1474
+ }
1475
+ }
1437
1476
vis. visit_span ( span) ;
1438
1477
}
1439
1478
1479
+ fn walk_format_placeholder < T : MutVisitor > (
1480
+ vis : & mut T ,
1481
+ FormatPlaceholder { argument, span, format_options, format_trait : _ } : & mut FormatPlaceholder ,
1482
+ ) {
1483
+ visit_opt ( span, |span| vis. visit_span ( span) ) ;
1484
+ let FormatArgPosition { span, index : _, kind : _ } = argument;
1485
+ visit_opt ( span, |span| vis. visit_span ( span) ) ;
1486
+ let FormatOptions {
1487
+ width,
1488
+ precision,
1489
+ alignment : _,
1490
+ fill : _,
1491
+ sign : _,
1492
+ alternate : _,
1493
+ zero_pad : _,
1494
+ debug_hex : _,
1495
+ } = format_options;
1496
+ match width {
1497
+ None => { }
1498
+ Some ( FormatCount :: Literal ( _) ) => { }
1499
+ Some ( FormatCount :: Argument ( FormatArgPosition { span, index : _, kind : _ } ) ) => {
1500
+ visit_opt ( span, |span| vis. visit_span ( span) )
1501
+ }
1502
+ }
1503
+ match precision {
1504
+ None => { }
1505
+ Some ( FormatCount :: Literal ( _) ) => { }
1506
+ Some ( FormatCount :: Argument ( FormatArgPosition { span, index : _, kind : _ } ) ) => {
1507
+ visit_opt ( span, |span| vis. visit_span ( span) )
1508
+ }
1509
+ }
1510
+ }
1511
+
1440
1512
pub fn walk_expr < T : MutVisitor > ( vis : & mut T , Expr { kind, id, span, attrs, tokens } : & mut Expr ) {
1441
1513
vis. visit_id ( id) ;
1442
1514
visit_attrs ( vis, attrs) ;
@@ -1467,7 +1539,8 @@ pub fn walk_expr<T: MutVisitor>(vis: &mut T, Expr { kind, id, span, attrs, token
1467
1539
visit_thin_exprs ( vis, call_args) ;
1468
1540
vis. visit_span ( span) ;
1469
1541
}
1470
- ExprKind :: Binary ( _binop, lhs, rhs) => {
1542
+ ExprKind :: Binary ( Spanned { node : _binop, span } , lhs, rhs) => {
1543
+ vis. visit_span ( span) ;
1471
1544
vis. visit_expr ( lhs) ;
1472
1545
vis. visit_expr ( rhs) ;
1473
1546
}
@@ -1533,9 +1606,10 @@ pub fn walk_expr<T: MutVisitor>(vis: &mut T, Expr { kind, id, span, attrs, token
1533
1606
visit_opt ( label, |label| vis. visit_label ( label) ) ;
1534
1607
vis. visit_block ( blk) ;
1535
1608
}
1536
- ExprKind :: Gen ( _capture_by , body, _kind, decl_span) => {
1609
+ ExprKind :: Gen ( capture_clause , body, _kind, decl_span) => {
1537
1610
vis. visit_block ( body) ;
1538
1611
vis. visit_span ( decl_span) ;
1612
+ vis. visit_capture_by ( capture_clause) ;
1539
1613
}
1540
1614
ExprKind :: Await ( expr, await_kw_span) => {
1541
1615
vis. visit_expr ( expr) ;
@@ -1546,7 +1620,8 @@ pub fn walk_expr<T: MutVisitor>(vis: &mut T, Expr { kind, id, span, attrs, token
1546
1620
vis. visit_expr ( er) ;
1547
1621
vis. visit_span ( span) ;
1548
1622
}
1549
- ExprKind :: AssignOp ( _op, el, er) => {
1623
+ ExprKind :: AssignOp ( Spanned { node : _binop, span } , el, er) => {
1624
+ vis. visit_span ( span) ;
1550
1625
vis. visit_expr ( el) ;
1551
1626
vis. visit_expr ( er) ;
1552
1627
}
@@ -1598,7 +1673,7 @@ pub fn walk_expr<T: MutVisitor>(vis: &mut T, Expr { kind, id, span, attrs, token
1598
1673
fields. flat_map_in_place ( |field| vis. flat_map_expr_field ( field) ) ;
1599
1674
match rest {
1600
1675
StructRest :: Base ( expr) => vis. visit_expr ( expr) ,
1601
- StructRest :: Rest ( _span ) => { }
1676
+ StructRest :: Rest ( span ) => vis . visit_span ( span ) ,
1602
1677
StructRest :: None => { }
1603
1678
}
1604
1679
}
@@ -1631,6 +1706,7 @@ pub fn walk_flat_map_stmt<T: MutVisitor>(
1631
1706
Stmt { kind, mut span, mut id } : Stmt ,
1632
1707
) -> SmallVec < [ Stmt ; 1 ] > {
1633
1708
vis. visit_id ( & mut id) ;
1709
+ vis. visit_span ( & mut span) ;
1634
1710
let stmts: SmallVec < _ > = walk_flat_map_stmt_kind ( vis, kind)
1635
1711
. into_iter ( )
1636
1712
. map ( |kind| Stmt { id, kind, span } )
@@ -1641,7 +1717,6 @@ pub fn walk_flat_map_stmt<T: MutVisitor>(
1641
1717
the visitor should implement custom statement visiting"
1642
1718
) ;
1643
1719
}
1644
- vis. visit_span ( & mut span) ;
1645
1720
stmts
1646
1721
}
1647
1722
0 commit comments