@@ -20,7 +20,7 @@ use thin_vec::ThinVec;
2020use crate :: ast:: * ;
2121use crate :: ptr:: P ;
2222use crate :: tokenstream:: * ;
23- use crate :: visit:: { AssocCtxt , BoundKind , FnCtxt , try_visit} ;
23+ use crate :: visit:: { AssocCtxt , BoundKind , FnCtxt , try_visit, visit_opt , walk_list } ;
2424
2525pub trait ExpectOne < A : Array > {
2626 fn expect_one ( self , err : & ' static str ) -> A :: Item ;
@@ -33,18 +33,6 @@ impl<A: Array> ExpectOne<A> for SmallVec<A> {
3333 }
3434}
3535
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-
4836pub trait MutVisitor : Sized {
4937 // Methods in this trait have one of three forms:
5038 //
@@ -451,11 +439,6 @@ fn visit_thin_exprs<T: MutVisitor>(vis: &mut T, exprs: &mut ThinVec<P<Expr>>) {
451439 exprs. flat_map_in_place ( |expr| vis. filter_map_expr ( expr) )
452440}
453441
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-
459442// No `noop_` prefix because there isn't a corresponding method in `MutVisitor`.
460443fn visit_attr_args < T : MutVisitor > ( vis : & mut T , args : & mut AttrArgs ) {
461444 match args {
@@ -610,12 +593,6 @@ pub fn walk_ty_pat<T: MutVisitor>(vis: &mut T, ty: &mut P<TyPat>) {
610593 vis. visit_span ( span) ;
611594}
612595
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-
619596pub fn walk_variant < T : MutVisitor > ( visitor : & mut T , variant : & mut Variant ) {
620597 let Variant { ident, vis, attrs, id, data, disr_expr, span, is_placeholder : _ } = variant;
621598 visitor. visit_id ( id) ;
@@ -771,22 +748,6 @@ pub fn walk_flat_map_param<T: MutVisitor>(vis: &mut T, mut param: Param) -> Smal
771748 smallvec ! [ param]
772749}
773750
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-
790751fn walk_closure_binder < T : MutVisitor > ( vis : & mut T , binder : & mut ClosureBinder ) {
791752 match binder {
792753 ClosureBinder :: NotPresent => { }
@@ -1080,169 +1041,15 @@ pub fn walk_item_kind<K: WalkItemKind>(
10801041 kind. walk ( span, id, visibility, ctxt, vis)
10811042}
10821043
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-
12371044impl WalkItemKind for AssocItemKind {
12381045 type Ctxt = AssocCtxt ;
1239- fn walk (
1046+ fn walk < V : MutVisitor > (
12401047 & mut self ,
12411048 span : Span ,
12421049 id : NodeId ,
12431050 visibility : & mut Visibility ,
12441051 ctxt : Self :: Ctxt ,
1245- visitor : & mut impl MutVisitor ,
1052+ visitor : & mut V ,
12461053 ) {
12471054 match self {
12481055 AssocItemKind :: Const ( item) => {
@@ -1306,16 +1113,6 @@ impl WalkItemKind for AssocItemKind {
13061113 }
13071114}
13081115
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-
13191116pub fn walk_crate < T : MutVisitor > ( vis : & mut T , krate : & mut Crate ) {
13201117 let Crate { attrs, items, spans, id, is_placeholder : _ } = krate;
13211118 vis. visit_id ( id) ;
@@ -1334,19 +1131,6 @@ pub fn walk_assoc_item(visitor: &mut impl MutVisitor, item: &mut P<AssocItem>, c
13341131 walk_item_ctxt ( visitor, item, ctxt)
13351132}
13361133
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-
13501134pub fn walk_flat_map_item ( vis : & mut impl MutVisitor , mut item : P < Item > ) -> SmallVec < [ P < Item > ; 1 ] > {
13511135 vis. visit_item ( & mut item) ;
13521136 smallvec ! [ item]
@@ -1371,13 +1155,13 @@ pub fn walk_flat_map_assoc_item(
13711155
13721156impl WalkItemKind for ForeignItemKind {
13731157 type Ctxt = ( ) ;
1374- fn walk (
1158+ fn walk < V : MutVisitor > (
13751159 & mut self ,
13761160 span : Span ,
13771161 id : NodeId ,
13781162 visibility : & mut Visibility ,
13791163 _ctxt : Self :: Ctxt ,
1380- visitor : & mut impl MutVisitor ,
1164+ visitor : & mut V ,
13811165 ) {
13821166 match self {
13831167 ForeignItemKind :: Static ( box StaticItem {
@@ -1786,18 +1570,6 @@ fn walk_capture_by<T: MutVisitor>(vis: &mut T, capture_by: &mut CaptureBy) {
17861570 }
17871571}
17881572
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-
18011573/// Some value for the AST node that is valid but possibly meaningless. Similar
18021574/// to `Default` but not intended for wide use. The value will never be used
18031575/// meaningfully, it exists just to support unwinding in `visit_clobber` in the
0 commit comments