@@ -206,7 +206,7 @@ macro_rules! make_ast_visitor {
206206 make_visit!{ MetaItemInner ; visit_meta_list_item, walk_meta_list_item}
207207
208208 fn flat_map_foreign_item( & mut self , ni: P <ForeignItem >) -> SmallVec <[ P <ForeignItem >; 1 ] > {
209- walk_flat_map_item ( self , ni)
209+ walk_flat_map_foreign_item ( self , ni)
210210 }
211211
212212 fn flat_map_item( & mut self , i: P <Item >) -> SmallVec <[ P <Item >; 1 ] > {
@@ -281,8 +281,6 @@ macro_rules! make_ast_visitor {
281281 type Result : VisitorResult = ( ) ;
282282
283283 make_visit!{ AssocItem , ctxt: AssocCtxt ; visit_assoc_item, walk_assoc_item}
284- make_visit!{ ForeignItem ; visit_foreign_item, walk_item}
285- make_visit!{ Item ; visit_item, walk_item}
286284 make_visit!{ Stmt ; visit_stmt, walk_stmt}
287285
288286 /// This method is a hack to workaround unstable of `stmt_expr_attributes`.
@@ -354,6 +352,10 @@ macro_rules! make_ast_visitor {
354352 make_visit!{ P !( Pat ) ; visit_pat, walk_pat}
355353 make_visit!{ P !( Ty ) ; visit_ty, walk_ty}
356354
355+ // Default implementations are generic over WalkItemKind
356+ make_visit!{ ForeignItem ; visit_foreign_item, walk_item}
357+ make_visit!{ Item ; visit_item, walk_item}
358+
357359 fn visit_variant_discr( & mut self , discr: ref_t!( AnonConst ) ) -> result!( ) {
358360 self . visit_anon_const( discr)
359361 }
@@ -1208,6 +1210,21 @@ macro_rules! make_ast_visitor {
12081210 visitor: & mut V ,
12091211 ) -> result!( V ) ;
12101212 }
1213+
1214+ pub fn walk_item<$( $lt, ) ? V : $trait$( <$lt>) ?>(
1215+ visitor: & mut V ,
1216+ item: ref_t!( Item <impl WalkItemKind >) ,
1217+ ) -> result!( V ) {
1218+ let Item { id, span, ident, vis, attrs, kind, tokens } = item;
1219+ try_v!( visit_id!( visitor, id) ) ;
1220+ visit_list!( visitor, visit_attribute, attrs) ;
1221+ try_v!( visitor. visit_vis( vis) ) ;
1222+ try_v!( visitor. visit_ident( ident) ) ;
1223+ try_v!( kind. walk( * id, * span, vis, ident, visitor) ) ;
1224+ visit_lazy_tts!( visitor, tokens) ;
1225+ try_v!( visit_span!( visitor, span) ) ;
1226+ return_result!( V )
1227+ }
12111228 }
12121229}
12131230
@@ -1443,18 +1460,6 @@ pub mod visit {
14431460 }
14441461 }
14451462
1446- pub fn walk_item < ' a , V : Visitor < ' a > > (
1447- visitor : & mut V ,
1448- item : & ' a Item < impl WalkItemKind > ,
1449- ) -> V :: Result {
1450- let Item { id, span, ident, vis, attrs, kind, tokens : _ } = item;
1451- walk_list ! ( visitor, visit_attribute, attrs) ;
1452- try_visit ! ( visitor. visit_vis( vis) ) ;
1453- try_visit ! ( visitor. visit_ident( ident) ) ;
1454- try_visit ! ( kind. walk( * id, * span, vis, ident, visitor) ) ;
1455- V :: Result :: output ( )
1456- }
1457-
14581463 impl WalkItemKind for ForeignItemKind {
14591464 fn walk < ' a , V : Visitor < ' a > > (
14601465 & ' a self ,
@@ -2288,18 +2293,19 @@ pub mod mut_visit {
22882293 }
22892294
22902295 /// Mutates one item, returning the item again.
2291- pub fn walk_flat_map_item < K : WalkItemKind > (
2292- visitor : & mut impl MutVisitor ,
2293- mut item : P < Item < K > > ,
2294- ) -> SmallVec < [ P < Item < K > > ; 1 ] > {
2295- let Item { ident, attrs, id, kind, vis, span, tokens } = item. deref_mut ( ) ;
2296- visitor. visit_id ( id) ;
2297- visit_attrs ( visitor, attrs) ;
2298- visitor. visit_vis ( vis) ;
2299- visitor. visit_ident ( ident) ;
2300- kind. walk ( * id, * span, vis, ident, visitor) ;
2301- visit_lazy_tts ( visitor, tokens) ;
2302- visitor. visit_span ( span) ;
2296+ pub fn walk_flat_map_item (
2297+ vis : & mut impl MutVisitor ,
2298+ mut item : P < Item > ,
2299+ ) -> SmallVec < [ P < Item > ; 1 ] > {
2300+ vis. visit_item ( & mut item) ;
2301+ smallvec ! [ item]
2302+ }
2303+
2304+ pub fn walk_flat_map_foreign_item (
2305+ vis : & mut impl MutVisitor ,
2306+ mut item : P < ForeignItem > ,
2307+ ) -> SmallVec < [ P < ForeignItem > ; 1 ] > {
2308+ vis. visit_foreign_item ( & mut item) ;
23032309 smallvec ! [ item]
23042310 }
23052311
0 commit comments