@@ -367,7 +367,7 @@ where
367
367
}
368
368
369
369
// No `noop_` prefix because there isn't a corresponding method in `MutVisitor`.
370
- fn visit_attrs < T : MutVisitor > ( attrs : & mut AttrVec , vis : & mut T ) {
370
+ pub fn visit_attrs < T : MutVisitor > ( attrs : & mut AttrVec , vis : & mut T ) {
371
371
for attr in attrs. iter_mut ( ) {
372
372
vis. visit_attribute ( attr) ;
373
373
}
@@ -390,7 +390,7 @@ fn visit_bounds<T: MutVisitor>(bounds: &mut GenericBounds, vis: &mut T) {
390
390
}
391
391
392
392
// No `noop_` prefix because there isn't a corresponding method in `MutVisitor`.
393
- fn visit_fn_sig < T : MutVisitor > ( FnSig { header, decl, span } : & mut FnSig , vis : & mut T ) {
393
+ pub fn visit_fn_sig < T : MutVisitor > ( FnSig { header, decl, span } : & mut FnSig , vis : & mut T ) {
394
394
vis. visit_fn_header ( header) ;
395
395
vis. visit_fn_decl ( decl) ;
396
396
vis. visit_span ( span) ;
@@ -637,7 +637,7 @@ fn noop_visit_local<T: MutVisitor>(local: &mut P<Local>, vis: &mut T) {
637
637
vis. visit_span ( span) ;
638
638
}
639
639
640
- fn noop_visit_attribute < T : MutVisitor > ( attr : & mut Attribute , vis : & mut T ) {
640
+ pub fn noop_visit_attribute < T : MutVisitor > ( attr : & mut Attribute , vis : & mut T ) {
641
641
let Attribute { kind, id : _, style : _, span } = attr;
642
642
match kind {
643
643
AttrKind :: Normal ( normal) => {
@@ -836,7 +836,7 @@ fn visit_nonterminal<T: MutVisitor>(nt: &mut token::Nonterminal, vis: &mut T) {
836
836
}
837
837
838
838
// No `noop_` prefix because there isn't a corresponding method in `MutVisitor`.
839
- fn visit_defaultness < T : MutVisitor > ( defaultness : & mut Defaultness , vis : & mut T ) {
839
+ pub fn visit_defaultness < T : MutVisitor > ( defaultness : & mut Defaultness , vis : & mut T ) {
840
840
match defaultness {
841
841
Defaultness :: Default ( span) => vis. visit_span ( span) ,
842
842
Defaultness :: Final => { }
@@ -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) => {
@@ -941,8 +961,9 @@ pub fn noop_flat_map_generic_param<T: MutVisitor>(
941
961
GenericParamKind :: Type { default } => {
942
962
visit_opt ( default, |default| vis. visit_ty ( default) ) ;
943
963
}
944
- GenericParamKind :: Const { ty, kw_span : _ , default } => {
964
+ GenericParamKind :: Const { ty, span , default } => {
945
965
vis. visit_ty ( ty) ;
966
+ vis. visit_span ( span) ;
946
967
visit_opt ( default, |default| vis. visit_anon_const ( default) ) ;
947
968
}
948
969
}
@@ -1368,21 +1389,24 @@ pub fn noop_visit_pat<T: MutVisitor>(pat: &mut P<Pat>, vis: &mut T) {
1368
1389
vis. visit_span ( span) ;
1369
1390
}
1370
1391
1371
- 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 ) {
1372
1393
vis. visit_id ( id) ;
1373
1394
vis. visit_expr ( value) ;
1374
1395
}
1375
1396
1376
1397
fn noop_visit_inline_asm < T : MutVisitor > ( asm : & mut InlineAsm , vis : & mut T ) {
1377
- // FIXME: Visit spans inside all this currently ignored stuff.
1378
- let InlineAsm {
1379
- template : _,
1380
- template_strs : _,
1381
- operands,
1382
- clobber_abis : _,
1383
- options : _,
1384
- line_spans : _,
1385
- } = 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
+ }
1386
1410
for ( op, span) in operands {
1387
1411
match op {
1388
1412
InlineAsmOperand :: In { expr, reg : _ }
@@ -1401,6 +1425,12 @@ fn noop_visit_inline_asm<T: MutVisitor>(asm: &mut InlineAsm, vis: &mut T) {
1401
1425
}
1402
1426
vis. visit_span ( span) ;
1403
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
+ }
1404
1434
}
1405
1435
1406
1436
fn noop_visit_inline_asm_sym < T : MutVisitor > (
@@ -1413,8 +1443,7 @@ fn noop_visit_inline_asm_sym<T: MutVisitor>(
1413
1443
}
1414
1444
1415
1445
fn noop_visit_format_args < T : MutVisitor > ( fmt : & mut FormatArgs , vis : & mut T ) {
1416
- // FIXME: visit the template exhaustively.
1417
- let FormatArgs { span, template : _, arguments } = fmt;
1446
+ let FormatArgs { span, template, arguments } = fmt;
1418
1447
for FormatArgument { kind, expr } in arguments. all_args_mut ( ) {
1419
1448
match kind {
1420
1449
FormatArgumentKind :: Named ( ident) | FormatArgumentKind :: Captured ( ident) => {
@@ -1424,9 +1453,48 @@ fn noop_visit_format_args<T: MutVisitor>(fmt: &mut FormatArgs, vis: &mut T) {
1424
1453
}
1425
1454
vis. visit_expr ( expr) ;
1426
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
+ }
1427
1462
vis. visit_span ( span) ;
1428
1463
}
1429
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
+
1430
1498
pub fn noop_visit_expr < T : MutVisitor > (
1431
1499
Expr { kind, id, span, attrs, tokens } : & mut Expr ,
1432
1500
vis : & mut T ,
@@ -1460,7 +1528,8 @@ pub fn noop_visit_expr<T: MutVisitor>(
1460
1528
visit_thin_exprs ( call_args, vis) ;
1461
1529
vis. visit_span ( span) ;
1462
1530
}
1463
- ExprKind :: Binary ( _binop, lhs, rhs) => {
1531
+ ExprKind :: Binary ( Spanned { node : _binop, span } , lhs, rhs) => {
1532
+ vis. visit_span ( span) ;
1464
1533
vis. visit_expr ( lhs) ;
1465
1534
vis. visit_expr ( rhs) ;
1466
1535
}
@@ -1528,9 +1597,10 @@ pub fn noop_visit_expr<T: MutVisitor>(
1528
1597
visit_opt ( label, |label| vis. visit_label ( label) ) ;
1529
1598
vis. visit_block ( blk) ;
1530
1599
}
1531
- ExprKind :: Gen ( _capture_by , body, _kind, decl_span) => {
1600
+ ExprKind :: Gen ( capture_clause , body, _kind, decl_span) => {
1532
1601
vis. visit_block ( body) ;
1533
1602
vis. visit_span ( decl_span) ;
1603
+ vis. visit_capture_by ( capture_clause) ;
1534
1604
}
1535
1605
ExprKind :: Await ( expr, await_kw_span) => {
1536
1606
vis. visit_expr ( expr) ;
@@ -1541,7 +1611,8 @@ pub fn noop_visit_expr<T: MutVisitor>(
1541
1611
vis. visit_expr ( er) ;
1542
1612
vis. visit_span ( span) ;
1543
1613
}
1544
- ExprKind :: AssignOp ( _op, el, er) => {
1614
+ ExprKind :: AssignOp ( Spanned { node : _binop, span } , el, er) => {
1615
+ vis. visit_span ( span) ;
1545
1616
vis. visit_expr ( el) ;
1546
1617
vis. visit_expr ( er) ;
1547
1618
}
@@ -1593,7 +1664,7 @@ pub fn noop_visit_expr<T: MutVisitor>(
1593
1664
fields. flat_map_in_place ( |field| vis. flat_map_expr_field ( field) ) ;
1594
1665
match rest {
1595
1666
StructRest :: Base ( expr) => vis. visit_expr ( expr) ,
1596
- StructRest :: Rest ( _span ) => { }
1667
+ StructRest :: Rest ( span ) => vis . visit_span ( span ) ,
1597
1668
StructRest :: None => { }
1598
1669
}
1599
1670
}
@@ -1626,6 +1697,7 @@ pub fn noop_flat_map_stmt<T: MutVisitor>(
1626
1697
vis : & mut T ,
1627
1698
) -> SmallVec < [ Stmt ; 1 ] > {
1628
1699
vis. visit_id ( & mut id) ;
1700
+ vis. visit_span ( & mut span) ;
1629
1701
let stmts: SmallVec < _ > = noop_flat_map_stmt_kind ( kind, vis)
1630
1702
. into_iter ( )
1631
1703
. map ( |kind| Stmt { id, kind, span } )
@@ -1636,7 +1708,6 @@ pub fn noop_flat_map_stmt<T: MutVisitor>(
1636
1708
the visitor should implement custom statement visiting"
1637
1709
) ;
1638
1710
}
1639
- vis. visit_span ( & mut span) ;
1640
1711
stmts
1641
1712
}
1642
1713
0 commit comments