@@ -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