@@ -461,7 +461,7 @@ pub fn noop_visit_ty_constraint<T: MutVisitor>(
461
461
}
462
462
463
463
pub fn noop_visit_ty < T : MutVisitor > ( ty : & mut P < Ty > , vis : & mut T ) {
464
- let Ty { id, kind, span, tokens : _ } = ty. deref_mut ( ) ;
464
+ let Ty { id, kind, span, tokens } = ty. deref_mut ( ) ;
465
465
vis. visit_id ( id) ;
466
466
match kind {
467
467
TyKind :: Infer | TyKind :: ImplicitSelf | TyKind :: Err | TyKind :: Never | TyKind :: CVarArgs => { }
@@ -497,6 +497,7 @@ pub fn noop_visit_ty<T: MutVisitor>(ty: &mut P<Ty>, vis: &mut T) {
497
497
TyKind :: MacCall ( mac) => vis. visit_mac ( mac) ,
498
498
}
499
499
vis. visit_span ( span) ;
500
+ visit_lazy_tts ( tokens, vis) ;
500
501
}
501
502
502
503
pub fn noop_visit_foreign_mod < T : MutVisitor > ( foreign_mod : & mut ForeignMod , vis : & mut T ) {
@@ -523,13 +524,14 @@ pub fn noop_visit_ident<T: MutVisitor>(Ident { name: _, span }: &mut Ident, vis:
523
524
vis. visit_span ( span) ;
524
525
}
525
526
526
- pub fn noop_visit_path < T : MutVisitor > ( Path { segments, span, tokens : _ } : & mut Path , vis : & mut T ) {
527
+ pub fn noop_visit_path < T : MutVisitor > ( Path { segments, span, tokens } : & mut Path , vis : & mut T ) {
527
528
vis. visit_span ( span) ;
528
529
for PathSegment { ident, id, args } in segments {
529
530
vis. visit_ident ( ident) ;
530
531
vis. visit_id ( id) ;
531
532
visit_opt ( args, |args| vis. visit_generic_args ( args) ) ;
532
533
}
534
+ visit_lazy_tts ( tokens, vis) ;
533
535
}
534
536
535
537
pub fn noop_visit_qself < T : MutVisitor > ( qself : & mut Option < QSelf > , vis : & mut T ) {
@@ -587,15 +589,17 @@ pub fn noop_visit_local<T: MutVisitor>(local: &mut P<Local>, vis: &mut T) {
587
589
}
588
590
589
591
pub fn noop_visit_attribute < T : MutVisitor > ( attr : & mut Attribute , vis : & mut T ) {
590
- let Attribute { kind, id : _, style : _, span, tokens : _ } = attr;
592
+ let Attribute { kind, id : _, style : _, span, tokens } = attr;
591
593
match kind {
592
- AttrKind :: Normal ( AttrItem { path, args, tokens : _ } ) => {
594
+ AttrKind :: Normal ( AttrItem { path, args, tokens } ) => {
593
595
vis. visit_path ( path) ;
594
596
visit_mac_args ( args, vis) ;
597
+ visit_lazy_tts ( tokens, vis) ;
595
598
}
596
599
AttrKind :: DocComment ( ..) => { }
597
600
}
598
601
vis. visit_span ( span) ;
602
+ visit_lazy_tts ( tokens, vis) ;
599
603
}
600
604
601
605
pub fn noop_visit_mac < T : MutVisitor > ( mac : & mut MacCall , vis : & mut T ) {
@@ -652,12 +656,22 @@ pub fn visit_tt<T: MutVisitor>(tt: &mut TokenTree, vis: &mut T) {
652
656
653
657
// No `noop_` prefix because there isn't a corresponding method in `MutVisitor`.
654
658
pub fn visit_tts < T : MutVisitor > ( TokenStream ( tts) : & mut TokenStream , vis : & mut T ) {
655
- if vis. token_visiting_enabled ( ) {
659
+ if vis. token_visiting_enabled ( ) && !tts . is_empty ( ) {
656
660
let tts = Lrc :: make_mut ( tts) ;
657
661
visit_vec ( tts, |( tree, _is_joint) | visit_tt ( tree, vis) ) ;
658
662
}
659
663
}
660
664
665
+ pub fn visit_lazy_tts < T : MutVisitor > ( lazy_tts : & mut Option < LazyTokenStream > , vis : & mut T ) {
666
+ if vis. token_visiting_enabled ( ) {
667
+ visit_opt ( lazy_tts, |lazy_tts| {
668
+ let mut tts = lazy_tts. create_token_stream ( ) ;
669
+ visit_tts ( & mut tts, vis) ;
670
+ * lazy_tts = LazyTokenStream :: new ( tts) ;
671
+ } )
672
+ }
673
+ }
674
+
661
675
// No `noop_` prefix because there isn't a corresponding method in `MutVisitor`.
662
676
// Applies ident visitor if it's an ident; applies other visits to interpolated nodes.
663
677
// In practice the ident part is not actually used by specific visitors right now,
@@ -725,9 +739,10 @@ pub fn visit_interpolated<T: MutVisitor>(nt: &mut token::Nonterminal, vis: &mut
725
739
token:: NtLifetime ( ident) => vis. visit_ident ( ident) ,
726
740
token:: NtLiteral ( expr) => vis. visit_expr ( expr) ,
727
741
token:: NtMeta ( item) => {
728
- let AttrItem { path, args, tokens : _ } = item. deref_mut ( ) ;
742
+ let AttrItem { path, args, tokens } = item. deref_mut ( ) ;
729
743
vis. visit_path ( path) ;
730
744
visit_mac_args ( args, vis) ;
745
+ visit_lazy_tts ( tokens, vis) ;
731
746
}
732
747
token:: NtPath ( path) => vis. visit_path ( path) ,
733
748
token:: NtTT ( tt) => visit_tt ( tt, vis) ,
@@ -887,10 +902,11 @@ pub fn noop_visit_mt<T: MutVisitor>(MutTy { ty, mutbl: _ }: &mut MutTy, vis: &mu
887
902
}
888
903
889
904
pub fn noop_visit_block < T : MutVisitor > ( block : & mut P < Block > , vis : & mut T ) {
890
- let Block { id, stmts, rules : _, span, tokens : _ } = block. deref_mut ( ) ;
905
+ let Block { id, stmts, rules : _, span, tokens } = block. deref_mut ( ) ;
891
906
vis. visit_id ( id) ;
892
907
stmts. flat_map_in_place ( |stmt| vis. flat_map_stmt ( stmt) ) ;
893
908
vis. visit_span ( span) ;
909
+ visit_lazy_tts ( tokens, vis) ;
894
910
}
895
911
896
912
pub fn noop_visit_item_kind < T : MutVisitor > ( kind : & mut ItemKind , vis : & mut T ) {
@@ -955,7 +971,7 @@ pub fn noop_flat_map_assoc_item<T: MutVisitor>(
955
971
mut item : P < AssocItem > ,
956
972
visitor : & mut T ,
957
973
) -> SmallVec < [ P < AssocItem > ; 1 ] > {
958
- let Item { id, ident, vis, attrs, kind, span, tokens : _ } = item. deref_mut ( ) ;
974
+ let Item { id, ident, vis, attrs, kind, span, tokens } = item. deref_mut ( ) ;
959
975
visitor. visit_id ( id) ;
960
976
visitor. visit_ident ( ident) ;
961
977
visitor. visit_vis ( vis) ;
@@ -978,6 +994,7 @@ pub fn noop_flat_map_assoc_item<T: MutVisitor>(
978
994
AssocItemKind :: MacCall ( mac) => visitor. visit_mac ( mac) ,
979
995
}
980
996
visitor. visit_span ( span) ;
997
+ visit_lazy_tts ( tokens, visitor) ;
981
998
smallvec ! [ item]
982
999
}
983
1000
@@ -1028,16 +1045,14 @@ pub fn noop_flat_map_item<T: MutVisitor>(
1028
1045
mut item : P < Item > ,
1029
1046
visitor : & mut T ,
1030
1047
) -> SmallVec < [ P < Item > ; 1 ] > {
1031
- let Item { ident, attrs, id, kind, vis, span, tokens : _ } = item. deref_mut ( ) ;
1048
+ let Item { ident, attrs, id, kind, vis, span, tokens } = item. deref_mut ( ) ;
1032
1049
visitor. visit_ident ( ident) ;
1033
1050
visit_attrs ( attrs, visitor) ;
1034
1051
visitor. visit_id ( id) ;
1035
1052
visitor. visit_item_kind ( kind) ;
1036
1053
visitor. visit_vis ( vis) ;
1037
1054
visitor. visit_span ( span) ;
1038
-
1039
- // FIXME: if `tokens` is modified with a call to `vis.visit_tts` it causes
1040
- // an ICE during resolve... odd!
1055
+ visit_lazy_tts ( tokens, visitor) ;
1041
1056
1042
1057
smallvec ! [ item]
1043
1058
}
@@ -1046,7 +1061,7 @@ pub fn noop_flat_map_foreign_item<T: MutVisitor>(
1046
1061
mut item : P < ForeignItem > ,
1047
1062
visitor : & mut T ,
1048
1063
) -> SmallVec < [ P < ForeignItem > ; 1 ] > {
1049
- let Item { ident, attrs, id, kind, vis, span, tokens : _ } = item. deref_mut ( ) ;
1064
+ let Item { ident, attrs, id, kind, vis, span, tokens } = item. deref_mut ( ) ;
1050
1065
visitor. visit_id ( id) ;
1051
1066
visitor. visit_ident ( ident) ;
1052
1067
visitor. visit_vis ( vis) ;
@@ -1069,11 +1084,12 @@ pub fn noop_flat_map_foreign_item<T: MutVisitor>(
1069
1084
ForeignItemKind :: MacCall ( mac) => visitor. visit_mac ( mac) ,
1070
1085
}
1071
1086
visitor. visit_span ( span) ;
1087
+ visit_lazy_tts ( tokens, visitor) ;
1072
1088
smallvec ! [ item]
1073
1089
}
1074
1090
1075
1091
pub fn noop_visit_pat < T : MutVisitor > ( pat : & mut P < Pat > , vis : & mut T ) {
1076
- let Pat { id, kind, span, tokens : _ } = pat. deref_mut ( ) ;
1092
+ let Pat { id, kind, span, tokens } = pat. deref_mut ( ) ;
1077
1093
vis. visit_id ( id) ;
1078
1094
match kind {
1079
1095
PatKind :: Wild | PatKind :: Rest => { }
@@ -1108,6 +1124,7 @@ pub fn noop_visit_pat<T: MutVisitor>(pat: &mut P<Pat>, vis: &mut T) {
1108
1124
PatKind :: MacCall ( mac) => vis. visit_mac ( mac) ,
1109
1125
}
1110
1126
vis. visit_span ( span) ;
1127
+ visit_lazy_tts ( tokens, vis) ;
1111
1128
}
1112
1129
1113
1130
pub fn noop_visit_anon_const < T : MutVisitor > ( AnonConst { id, value } : & mut AnonConst , vis : & mut T ) {
@@ -1116,7 +1133,7 @@ pub fn noop_visit_anon_const<T: MutVisitor>(AnonConst { id, value }: &mut AnonCo
1116
1133
}
1117
1134
1118
1135
pub fn noop_visit_expr < T : MutVisitor > (
1119
- Expr { kind, id, span, attrs, tokens : _ } : & mut Expr ,
1136
+ Expr { kind, id, span, attrs, tokens } : & mut Expr ,
1120
1137
vis : & mut T ,
1121
1138
) {
1122
1139
match kind {
@@ -1295,6 +1312,7 @@ pub fn noop_visit_expr<T: MutVisitor>(
1295
1312
vis. visit_id ( id) ;
1296
1313
vis. visit_span ( span) ;
1297
1314
visit_thin_attrs ( attrs, vis) ;
1315
+ visit_lazy_tts ( tokens, vis) ;
1298
1316
}
1299
1317
1300
1318
pub fn noop_filter_map_expr < T : MutVisitor > ( mut e : P < Expr > , vis : & mut T ) -> Option < P < Expr > > {
@@ -1305,11 +1323,12 @@ pub fn noop_filter_map_expr<T: MutVisitor>(mut e: P<Expr>, vis: &mut T) -> Optio
1305
1323
}
1306
1324
1307
1325
pub fn noop_flat_map_stmt < T : MutVisitor > (
1308
- Stmt { kind, mut span, mut id, tokens } : Stmt ,
1326
+ Stmt { kind, mut span, mut id, mut tokens } : Stmt ,
1309
1327
vis : & mut T ,
1310
1328
) -> SmallVec < [ Stmt ; 1 ] > {
1311
1329
vis. visit_id ( & mut id) ;
1312
1330
vis. visit_span ( & mut span) ;
1331
+ visit_lazy_tts ( & mut tokens, vis) ;
1313
1332
noop_flat_map_stmt_kind ( kind, vis)
1314
1333
. into_iter ( )
1315
1334
. map ( |kind| Stmt { id, kind, span, tokens : tokens. clone ( ) } )
0 commit comments