@@ -871,7 +871,8 @@ fn visit_constness<T: MutVisitor>(constness: &mut Const, vis: &mut T) {
871
871
fn noop_visit_closure_binder < T : MutVisitor > ( binder : & mut ClosureBinder , vis : & mut T ) {
872
872
match binder {
873
873
ClosureBinder :: NotPresent => { }
874
- ClosureBinder :: For { span : _, generic_params } => {
874
+ ClosureBinder :: For { span, generic_params } => {
875
+ vis. visit_span ( span) ;
875
876
generic_params. flat_map_in_place ( |param| vis. flat_map_generic_param ( param) ) ;
876
877
}
877
878
}
@@ -904,7 +905,10 @@ fn noop_visit_fn_ret_ty<T: MutVisitor>(fn_ret_ty: &mut FnRetTy, vis: &mut T) {
904
905
905
906
fn noop_visit_param_bound < T : MutVisitor > ( pb : & mut GenericBound , vis : & mut T ) {
906
907
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
+ }
908
912
GenericBound :: Outlives ( lifetime) => noop_visit_lifetime ( lifetime, vis) ,
909
913
GenericBound :: Use ( args, span) => {
910
914
for arg in args {
@@ -915,6 +919,22 @@ fn noop_visit_param_bound<T: MutVisitor>(pb: &mut GenericBound, vis: &mut T) {
915
919
}
916
920
}
917
921
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
+
918
938
fn noop_visit_precise_capturing_arg < T : MutVisitor > ( arg : & mut PreciseCapturingArg , vis : & mut T ) {
919
939
match arg {
920
940
PreciseCapturingArg :: Lifetime ( lt) => {
@@ -1369,21 +1389,24 @@ pub fn noop_visit_pat<T: MutVisitor>(pat: &mut P<Pat>, vis: &mut T) {
1369
1389
vis. visit_span ( span) ;
1370
1390
}
1371
1391
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 ) {
1373
1393
vis. visit_id ( id) ;
1374
1394
vis. visit_expr ( value) ;
1375
1395
}
1376
1396
1377
1397
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
+ }
1387
1410
for ( op, span) in operands {
1388
1411
match op {
1389
1412
InlineAsmOperand :: In { expr, reg : _ }
@@ -1402,6 +1425,12 @@ fn noop_visit_inline_asm<T: MutVisitor>(asm: &mut InlineAsm, vis: &mut T) {
1402
1425
}
1403
1426
vis. visit_span ( span) ;
1404
1427
}
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
+ }
1405
1434
}
1406
1435
1407
1436
fn noop_visit_inline_asm_sym < T : MutVisitor > (
@@ -1414,8 +1443,7 @@ fn noop_visit_inline_asm_sym<T: MutVisitor>(
1414
1443
}
1415
1444
1416
1445
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;
1419
1447
for FormatArgument { kind, expr } in arguments. all_args_mut ( ) {
1420
1448
match kind {
1421
1449
FormatArgumentKind :: Named ( ident) | FormatArgumentKind :: Captured ( ident) => {
@@ -1425,9 +1453,48 @@ fn noop_visit_format_args<T: MutVisitor>(fmt: &mut FormatArgs, vis: &mut T) {
1425
1453
}
1426
1454
vis. visit_expr ( expr) ;
1427
1455
}
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
+ }
1428
1462
vis. visit_span ( span) ;
1429
1463
}
1430
1464
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
+
1431
1498
pub fn noop_visit_expr < T : MutVisitor > (
1432
1499
Expr { kind, id, span, attrs, tokens } : & mut Expr ,
1433
1500
vis : & mut T ,
@@ -1461,7 +1528,8 @@ pub fn noop_visit_expr<T: MutVisitor>(
1461
1528
visit_thin_exprs ( call_args, vis) ;
1462
1529
vis. visit_span ( span) ;
1463
1530
}
1464
- ExprKind :: Binary ( _binop, lhs, rhs) => {
1531
+ ExprKind :: Binary ( Spanned { node : _binop, span } , lhs, rhs) => {
1532
+ vis. visit_span ( span) ;
1465
1533
vis. visit_expr ( lhs) ;
1466
1534
vis. visit_expr ( rhs) ;
1467
1535
}
@@ -1529,9 +1597,10 @@ pub fn noop_visit_expr<T: MutVisitor>(
1529
1597
visit_opt ( label, |label| vis. visit_label ( label) ) ;
1530
1598
vis. visit_block ( blk) ;
1531
1599
}
1532
- ExprKind :: Gen ( _capture_by , body, _kind, decl_span) => {
1600
+ ExprKind :: Gen ( capture_clause , body, _kind, decl_span) => {
1533
1601
vis. visit_block ( body) ;
1534
1602
vis. visit_span ( decl_span) ;
1603
+ vis. visit_capture_by ( capture_clause) ;
1535
1604
}
1536
1605
ExprKind :: Await ( expr, await_kw_span) => {
1537
1606
vis. visit_expr ( expr) ;
@@ -1542,7 +1611,8 @@ pub fn noop_visit_expr<T: MutVisitor>(
1542
1611
vis. visit_expr ( er) ;
1543
1612
vis. visit_span ( span) ;
1544
1613
}
1545
- ExprKind :: AssignOp ( _op, el, er) => {
1614
+ ExprKind :: AssignOp ( Spanned { node : _binop, span } , el, er) => {
1615
+ vis. visit_span ( span) ;
1546
1616
vis. visit_expr ( el) ;
1547
1617
vis. visit_expr ( er) ;
1548
1618
}
@@ -1594,7 +1664,7 @@ pub fn noop_visit_expr<T: MutVisitor>(
1594
1664
fields. flat_map_in_place ( |field| vis. flat_map_expr_field ( field) ) ;
1595
1665
match rest {
1596
1666
StructRest :: Base ( expr) => vis. visit_expr ( expr) ,
1597
- StructRest :: Rest ( _span ) => { }
1667
+ StructRest :: Rest ( span ) => vis . visit_span ( span ) ,
1598
1668
StructRest :: None => { }
1599
1669
}
1600
1670
}
@@ -1627,6 +1697,7 @@ pub fn noop_flat_map_stmt<T: MutVisitor>(
1627
1697
vis : & mut T ,
1628
1698
) -> SmallVec < [ Stmt ; 1 ] > {
1629
1699
vis. visit_id ( & mut id) ;
1700
+ vis. visit_span ( & mut span) ;
1630
1701
let stmts: SmallVec < _ > = noop_flat_map_stmt_kind ( kind, vis)
1631
1702
. into_iter ( )
1632
1703
. map ( |kind| Stmt { id, kind, span } )
@@ -1637,7 +1708,6 @@ pub fn noop_flat_map_stmt<T: MutVisitor>(
1637
1708
the visitor should implement custom statement visiting"
1638
1709
) ;
1639
1710
}
1640
- vis. visit_span ( & mut span) ;
1641
1711
stmts
1642
1712
}
1643
1713
0 commit comments