@@ -20,7 +20,7 @@ use thin_vec::ThinVec;
20
20
use crate :: ast:: * ;
21
21
use crate :: ptr:: P ;
22
22
use crate :: tokenstream:: * ;
23
- use crate :: visit:: { AssocCtxt , BoundKind , FnCtxt , try_visit} ;
23
+ use crate :: visit:: { AssocCtxt , BoundKind , FnCtxt , try_visit, visit_opt , walk_list } ;
24
24
25
25
pub trait ExpectOne < A : Array > {
26
26
fn expect_one ( self , err : & ' static str ) -> A :: Item ;
@@ -33,18 +33,6 @@ impl<A: Array> ExpectOne<A> for SmallVec<A> {
33
33
}
34
34
}
35
35
36
- pub trait WalkItemKind {
37
- type Ctxt ;
38
- fn walk (
39
- & mut self ,
40
- span : Span ,
41
- id : NodeId ,
42
- visibility : & mut Visibility ,
43
- ctxt : Self :: Ctxt ,
44
- visitor : & mut impl MutVisitor ,
45
- ) ;
46
- }
47
-
48
36
pub trait MutVisitor : Sized {
49
37
// Methods in this trait have one of three forms:
50
38
//
@@ -451,11 +439,6 @@ fn visit_thin_exprs<T: MutVisitor>(vis: &mut T, exprs: &mut ThinVec<P<Expr>>) {
451
439
exprs. flat_map_in_place ( |expr| vis. filter_map_expr ( expr) )
452
440
}
453
441
454
- // No `noop_` prefix because there isn't a corresponding method in `MutVisitor`.
455
- fn visit_bounds < T : MutVisitor > ( vis : & mut T , bounds : & mut GenericBounds , ctxt : BoundKind ) {
456
- visit_vec ( bounds, |bound| vis. visit_param_bound ( bound, ctxt) ) ;
457
- }
458
-
459
442
// No `noop_` prefix because there isn't a corresponding method in `MutVisitor`.
460
443
fn visit_attr_args < T : MutVisitor > ( vis : & mut T , args : & mut AttrArgs ) {
461
444
match args {
@@ -610,12 +593,6 @@ pub fn walk_ty_pat<T: MutVisitor>(vis: &mut T, ty: &mut P<TyPat>) {
610
593
vis. visit_span ( span) ;
611
594
}
612
595
613
- fn walk_foreign_mod < T : MutVisitor > ( vis : & mut T , foreign_mod : & mut ForeignMod ) {
614
- let ForeignMod { extern_span : _, safety, abi : _, items } = foreign_mod;
615
- visit_safety ( vis, safety) ;
616
- items. flat_map_in_place ( |item| vis. flat_map_foreign_item ( item) ) ;
617
- }
618
-
619
596
pub fn walk_variant < T : MutVisitor > ( visitor : & mut T , variant : & mut Variant ) {
620
597
let Variant { ident, vis, attrs, id, data, disr_expr, span, is_placeholder : _ } = variant;
621
598
visitor. visit_id ( id) ;
@@ -771,22 +748,6 @@ pub fn walk_flat_map_param<T: MutVisitor>(vis: &mut T, mut param: Param) -> Smal
771
748
smallvec ! [ param]
772
749
}
773
750
774
- // No `noop_` prefix because there isn't a corresponding method in `MutVisitor`.
775
- fn visit_defaultness < T : MutVisitor > ( vis : & mut T , defaultness : & mut Defaultness ) {
776
- match defaultness {
777
- Defaultness :: Default ( span) => vis. visit_span ( span) ,
778
- Defaultness :: Final => { }
779
- }
780
- }
781
-
782
- // No `noop_` prefix because there isn't a corresponding method in `MutVisitor`.
783
- fn visit_polarity < T : MutVisitor > ( vis : & mut T , polarity : & mut ImplPolarity ) {
784
- match polarity {
785
- ImplPolarity :: Positive => { }
786
- ImplPolarity :: Negative ( span) => vis. visit_span ( span) ,
787
- }
788
- }
789
-
790
751
fn walk_closure_binder < T : MutVisitor > ( vis : & mut T , binder : & mut ClosureBinder ) {
791
752
match binder {
792
753
ClosureBinder :: NotPresent => { }
@@ -1080,169 +1041,15 @@ pub fn walk_item_kind<K: WalkItemKind>(
1080
1041
kind. walk ( span, id, visibility, ctxt, vis)
1081
1042
}
1082
1043
1083
- impl WalkItemKind for ItemKind {
1084
- type Ctxt = ( ) ;
1085
- fn walk (
1086
- & mut self ,
1087
- span : Span ,
1088
- id : NodeId ,
1089
- visibility : & mut Visibility ,
1090
- _ctxt : Self :: Ctxt ,
1091
- vis : & mut impl MutVisitor ,
1092
- ) {
1093
- match self {
1094
- ItemKind :: ExternCrate ( _orig_name, ident) => vis. visit_ident ( ident) ,
1095
- ItemKind :: Use ( use_tree) => vis. visit_use_tree ( use_tree) ,
1096
- ItemKind :: Static ( box StaticItem {
1097
- ident,
1098
- ty,
1099
- safety : _,
1100
- mutability : _,
1101
- expr,
1102
- define_opaque,
1103
- } ) => {
1104
- vis. visit_ident ( ident) ;
1105
- vis. visit_ty ( ty) ;
1106
- visit_opt ( expr, |expr| vis. visit_expr ( expr) ) ;
1107
- walk_define_opaques ( vis, define_opaque) ;
1108
- }
1109
- ItemKind :: Const ( item) => {
1110
- walk_const_item ( vis, item) ;
1111
- }
1112
- ItemKind :: Fn ( func) => {
1113
- vis. visit_fn ( FnKind :: Fn ( FnCtxt :: Free , visibility, & mut * func) , span, id) ;
1114
- }
1115
- ItemKind :: Mod ( safety, ident, mod_kind) => {
1116
- visit_safety ( vis, safety) ;
1117
- vis. visit_ident ( ident) ;
1118
- match mod_kind {
1119
- ModKind :: Loaded (
1120
- items,
1121
- _inline,
1122
- ModSpans { inner_span, inject_use_span } ,
1123
- _,
1124
- ) => {
1125
- items. flat_map_in_place ( |item| vis. flat_map_item ( item) ) ;
1126
- vis. visit_span ( inner_span) ;
1127
- vis. visit_span ( inject_use_span) ;
1128
- }
1129
- ModKind :: Unloaded => { }
1130
- }
1131
- }
1132
- ItemKind :: ForeignMod ( nm) => vis. visit_foreign_mod ( nm) ,
1133
- ItemKind :: GlobalAsm ( asm) => vis. visit_inline_asm ( asm) ,
1134
- ItemKind :: TyAlias ( box TyAlias {
1135
- defaultness,
1136
- ident,
1137
- generics,
1138
- where_clauses,
1139
- bounds,
1140
- ty,
1141
- } ) => {
1142
- visit_defaultness ( vis, defaultness) ;
1143
- vis. visit_ident ( ident) ;
1144
- vis. visit_generics ( generics) ;
1145
- visit_bounds ( vis, bounds, BoundKind :: Bound ) ;
1146
- visit_opt ( ty, |ty| vis. visit_ty ( ty) ) ;
1147
- walk_ty_alias_where_clauses ( vis, where_clauses) ;
1148
- }
1149
- ItemKind :: Enum ( ident, EnumDef { variants } , generics) => {
1150
- vis. visit_ident ( ident) ;
1151
- vis. visit_generics ( generics) ;
1152
- variants. flat_map_in_place ( |variant| vis. flat_map_variant ( variant) ) ;
1153
- }
1154
- ItemKind :: Struct ( ident, variant_data, generics)
1155
- | ItemKind :: Union ( ident, variant_data, generics) => {
1156
- vis. visit_ident ( ident) ;
1157
- vis. visit_generics ( generics) ;
1158
- vis. visit_variant_data ( variant_data) ;
1159
- }
1160
- ItemKind :: Impl ( box Impl {
1161
- defaultness,
1162
- safety,
1163
- generics,
1164
- constness,
1165
- polarity,
1166
- of_trait,
1167
- self_ty,
1168
- items,
1169
- } ) => {
1170
- visit_defaultness ( vis, defaultness) ;
1171
- visit_safety ( vis, safety) ;
1172
- vis. visit_generics ( generics) ;
1173
- visit_constness ( vis, constness) ;
1174
- visit_polarity ( vis, polarity) ;
1175
- visit_opt ( of_trait, |trait_ref| vis. visit_trait_ref ( trait_ref) ) ;
1176
- vis. visit_ty ( self_ty) ;
1177
- items. flat_map_in_place ( |item| {
1178
- vis. flat_map_assoc_item ( item, AssocCtxt :: Impl { of_trait : of_trait. is_some ( ) } )
1179
- } ) ;
1180
- }
1181
- ItemKind :: Trait ( box Trait { safety, is_auto : _, ident, generics, bounds, items } ) => {
1182
- visit_safety ( vis, safety) ;
1183
- vis. visit_ident ( ident) ;
1184
- vis. visit_generics ( generics) ;
1185
- visit_bounds ( vis, bounds, BoundKind :: Bound ) ;
1186
- items. flat_map_in_place ( |item| vis. flat_map_assoc_item ( item, AssocCtxt :: Trait ) ) ;
1187
- }
1188
- ItemKind :: TraitAlias ( ident, generics, bounds) => {
1189
- vis. visit_ident ( ident) ;
1190
- vis. visit_generics ( generics) ;
1191
- visit_bounds ( vis, bounds, BoundKind :: Bound ) ;
1192
- }
1193
- ItemKind :: MacCall ( m) => vis. visit_mac_call ( m) ,
1194
- ItemKind :: MacroDef ( ident, def) => {
1195
- vis. visit_ident ( ident) ;
1196
- vis. visit_macro_def ( def)
1197
- }
1198
- ItemKind :: Delegation ( box Delegation {
1199
- id,
1200
- qself,
1201
- path,
1202
- ident,
1203
- rename,
1204
- body,
1205
- from_glob : _,
1206
- } ) => {
1207
- vis. visit_id ( id) ;
1208
- vis. visit_qself ( qself) ;
1209
- vis. visit_path ( path) ;
1210
- vis. visit_ident ( ident) ;
1211
- if let Some ( rename) = rename {
1212
- vis. visit_ident ( rename) ;
1213
- }
1214
- if let Some ( body) = body {
1215
- vis. visit_block ( body) ;
1216
- }
1217
- }
1218
- ItemKind :: DelegationMac ( box DelegationMac { qself, prefix, suffixes, body } ) => {
1219
- vis. visit_qself ( qself) ;
1220
- vis. visit_path ( prefix) ;
1221
- if let Some ( suffixes) = suffixes {
1222
- for ( ident, rename) in suffixes {
1223
- vis. visit_ident ( ident) ;
1224
- if let Some ( rename) = rename {
1225
- vis. visit_ident ( rename) ;
1226
- }
1227
- }
1228
- }
1229
- if let Some ( body) = body {
1230
- vis. visit_block ( body) ;
1231
- }
1232
- }
1233
- }
1234
- }
1235
- }
1236
-
1237
1044
impl WalkItemKind for AssocItemKind {
1238
1045
type Ctxt = AssocCtxt ;
1239
- fn walk (
1046
+ fn walk < V : MutVisitor > (
1240
1047
& mut self ,
1241
1048
span : Span ,
1242
1049
id : NodeId ,
1243
1050
visibility : & mut Visibility ,
1244
1051
ctxt : Self :: Ctxt ,
1245
- visitor : & mut impl MutVisitor ,
1052
+ visitor : & mut V ,
1246
1053
) {
1247
1054
match self {
1248
1055
AssocItemKind :: Const ( item) => {
@@ -1306,16 +1113,6 @@ impl WalkItemKind for AssocItemKind {
1306
1113
}
1307
1114
}
1308
1115
1309
- fn walk_const_item < T : MutVisitor > ( vis : & mut T , item : & mut ConstItem ) {
1310
- let ConstItem { defaultness, ident, generics, ty, expr, define_opaque } = item;
1311
- visit_defaultness ( vis, defaultness) ;
1312
- vis. visit_ident ( ident) ;
1313
- vis. visit_generics ( generics) ;
1314
- vis. visit_ty ( ty) ;
1315
- visit_opt ( expr, |expr| vis. visit_expr ( expr) ) ;
1316
- walk_define_opaques ( vis, define_opaque) ;
1317
- }
1318
-
1319
1116
pub fn walk_crate < T : MutVisitor > ( vis : & mut T , krate : & mut Crate ) {
1320
1117
let Crate { attrs, items, spans, id, is_placeholder : _ } = krate;
1321
1118
vis. visit_id ( id) ;
@@ -1334,19 +1131,6 @@ pub fn walk_assoc_item(visitor: &mut impl MutVisitor, item: &mut P<AssocItem>, c
1334
1131
walk_item_ctxt ( visitor, item, ctxt)
1335
1132
}
1336
1133
1337
- fn walk_item_ctxt < K : WalkItemKind > (
1338
- visitor : & mut impl MutVisitor ,
1339
- item : & mut P < Item < K > > ,
1340
- ctxt : K :: Ctxt ,
1341
- ) {
1342
- let Item { attrs, id, kind, vis, span, tokens : _ } = item. deref_mut ( ) ;
1343
- visitor. visit_id ( id) ;
1344
- visit_attrs ( visitor, attrs) ;
1345
- visitor. visit_vis ( vis) ;
1346
- kind. walk ( * span, * id, vis, ctxt, visitor) ;
1347
- visitor. visit_span ( span) ;
1348
- }
1349
-
1350
1134
pub fn walk_flat_map_item ( vis : & mut impl MutVisitor , mut item : P < Item > ) -> SmallVec < [ P < Item > ; 1 ] > {
1351
1135
vis. visit_item ( & mut item) ;
1352
1136
smallvec ! [ item]
@@ -1371,13 +1155,13 @@ pub fn walk_flat_map_assoc_item(
1371
1155
1372
1156
impl WalkItemKind for ForeignItemKind {
1373
1157
type Ctxt = ( ) ;
1374
- fn walk (
1158
+ fn walk < V : MutVisitor > (
1375
1159
& mut self ,
1376
1160
span : Span ,
1377
1161
id : NodeId ,
1378
1162
visibility : & mut Visibility ,
1379
1163
_ctxt : Self :: Ctxt ,
1380
- visitor : & mut impl MutVisitor ,
1164
+ visitor : & mut V ,
1381
1165
) {
1382
1166
match self {
1383
1167
ForeignItemKind :: Static ( box StaticItem {
@@ -1786,18 +1570,6 @@ fn walk_capture_by<T: MutVisitor>(vis: &mut T, capture_by: &mut CaptureBy) {
1786
1570
}
1787
1571
}
1788
1572
1789
- fn walk_define_opaques < T : MutVisitor > (
1790
- vis : & mut T ,
1791
- define_opaque : & mut Option < ThinVec < ( NodeId , Path ) > > ,
1792
- ) {
1793
- if let Some ( define_opaque) = define_opaque {
1794
- for ( id, path) in define_opaque {
1795
- vis. visit_id ( id) ;
1796
- vis. visit_path ( path)
1797
- }
1798
- }
1799
- }
1800
-
1801
1573
/// Some value for the AST node that is valid but possibly meaningless. Similar
1802
1574
/// to `Default` but not intended for wide use. The value will never be used
1803
1575
/// meaningfully, it exists just to support unwinding in `visit_clobber` in the
0 commit comments