@@ -102,6 +102,15 @@ pub enum LifetimeCtxt {
102
102
GenericArg ,
103
103
}
104
104
105
+ pub trait WalkItemKind : Sized {
106
+ fn walk < ' a , V : Visitor < ' a > > (
107
+ & ' a self ,
108
+ item : & ' a Item < Self > ,
109
+ ctxt : AssocCtxt ,
110
+ visitor : & mut V ,
111
+ ) -> V :: Result ;
112
+ }
113
+
105
114
/// Each method of the `Visitor` trait is a hook to be potentially
106
115
/// overridden. Each method's default implementation recursively visits
107
116
/// the substructure of the input via the corresponding `walk` method;
@@ -120,7 +129,7 @@ pub trait Visitor<'ast>: Sized {
120
129
Self :: Result :: output ( )
121
130
}
122
131
fn visit_foreign_item ( & mut self , i : & ' ast ForeignItem ) -> Self :: Result {
123
- walk_foreign_item ( self , i)
132
+ walk_item ( self , i)
124
133
}
125
134
fn visit_item ( & mut self , i : & ' ast Item ) -> Self :: Result {
126
135
walk_item ( self , i)
@@ -312,87 +321,98 @@ pub fn walk_trait_ref<'a, V: Visitor<'a>>(visitor: &mut V, trait_ref: &'a TraitR
312
321
visitor. visit_path ( & trait_ref. path , trait_ref. ref_id )
313
322
}
314
323
315
- pub fn walk_item < ' a , V : Visitor < ' a > > ( visitor : & mut V , item : & ' a Item ) -> V :: Result {
316
- try_visit ! ( visitor. visit_vis( & item. vis) ) ;
317
- try_visit ! ( visitor. visit_ident( item. ident) ) ;
318
- match & item. kind {
319
- ItemKind :: ExternCrate ( _) => { }
320
- ItemKind :: Use ( use_tree) => try_visit ! ( visitor. visit_use_tree( use_tree, item. id, false ) ) ,
321
- ItemKind :: Static ( box StaticItem { ty, mutability : _, expr } ) => {
322
- try_visit ! ( visitor. visit_ty( ty) ) ;
323
- visit_opt ! ( visitor, visit_expr, expr) ;
324
- }
325
- ItemKind :: Const ( box ConstItem { defaultness : _, generics, ty, expr } ) => {
326
- try_visit ! ( visitor. visit_generics( generics) ) ;
327
- try_visit ! ( visitor. visit_ty( ty) ) ;
328
- visit_opt ! ( visitor, visit_expr, expr) ;
329
- }
330
- ItemKind :: Fn ( box Fn { defaultness : _, generics, sig, body } ) => {
331
- let kind =
332
- FnKind :: Fn ( FnCtxt :: Free , item. ident , sig, & item. vis , generics, body. as_deref ( ) ) ;
333
- try_visit ! ( visitor. visit_fn( kind, item. span, item. id) ) ;
334
- }
335
- ItemKind :: Mod ( _unsafety, mod_kind) => match mod_kind {
336
- ModKind :: Loaded ( items, _inline, _inner_span) => {
337
- walk_list ! ( visitor, visit_item, items) ;
324
+ impl WalkItemKind for ItemKind {
325
+ fn walk < ' a , V : Visitor < ' a > > (
326
+ & ' a self ,
327
+ item : & ' a Item < Self > ,
328
+ _ctxt : AssocCtxt ,
329
+ visitor : & mut V ,
330
+ ) -> V :: Result {
331
+ match self {
332
+ ItemKind :: ExternCrate ( _) => { }
333
+ ItemKind :: Use ( use_tree) => try_visit ! ( visitor. visit_use_tree( use_tree, item. id, false ) ) ,
334
+ ItemKind :: Static ( box StaticItem { ty, mutability : _, expr } ) => {
335
+ try_visit ! ( visitor. visit_ty( ty) ) ;
336
+ visit_opt ! ( visitor, visit_expr, expr) ;
338
337
}
339
- ModKind :: Unloaded => { }
340
- } ,
341
- ItemKind :: ForeignMod ( foreign_module) => {
342
- walk_list ! ( visitor, visit_foreign_item, & foreign_module. items) ;
343
- }
344
- ItemKind :: GlobalAsm ( asm) => try_visit ! ( visitor. visit_inline_asm( asm) ) ,
345
- ItemKind :: TyAlias ( box TyAlias { generics, bounds, ty, .. } ) => {
346
- try_visit ! ( visitor. visit_generics( generics) ) ;
347
- walk_list ! ( visitor, visit_param_bound, bounds, BoundKind :: Bound ) ;
348
- visit_opt ! ( visitor, visit_ty, ty) ;
349
- }
350
- ItemKind :: Enum ( enum_definition, generics) => {
351
- try_visit ! ( visitor. visit_generics( generics) ) ;
352
- try_visit ! ( visitor. visit_enum_def( enum_definition) ) ;
353
- }
354
- ItemKind :: Impl ( box Impl {
355
- defaultness : _,
356
- unsafety : _,
357
- generics,
358
- constness : _,
359
- polarity : _,
360
- of_trait,
361
- self_ty,
362
- items,
363
- } ) => {
364
- try_visit ! ( visitor. visit_generics( generics) ) ;
365
- visit_opt ! ( visitor, visit_trait_ref, of_trait) ;
366
- try_visit ! ( visitor. visit_ty( self_ty) ) ;
367
- walk_list ! ( visitor, visit_assoc_item, items, AssocCtxt :: Impl ) ;
368
- }
369
- ItemKind :: Struct ( struct_definition, generics)
370
- | ItemKind :: Union ( struct_definition, generics) => {
371
- try_visit ! ( visitor. visit_generics( generics) ) ;
372
- try_visit ! ( visitor. visit_variant_data( struct_definition) ) ;
373
- }
374
- ItemKind :: Trait ( box Trait { unsafety : _, is_auto : _, generics, bounds, items } ) => {
375
- try_visit ! ( visitor. visit_generics( generics) ) ;
376
- walk_list ! ( visitor, visit_param_bound, bounds, BoundKind :: SuperTraits ) ;
377
- walk_list ! ( visitor, visit_assoc_item, items, AssocCtxt :: Trait ) ;
378
- }
379
- ItemKind :: TraitAlias ( generics, bounds) => {
380
- try_visit ! ( visitor. visit_generics( generics) ) ;
381
- walk_list ! ( visitor, visit_param_bound, bounds, BoundKind :: Bound ) ;
382
- }
383
- ItemKind :: MacCall ( mac) => try_visit ! ( visitor. visit_mac_call( mac) ) ,
384
- ItemKind :: MacroDef ( ts) => try_visit ! ( visitor. visit_mac_def( ts, item. id) ) ,
385
- ItemKind :: Delegation ( box Delegation { id, qself, path, rename, body } ) => {
386
- if let Some ( qself) = qself {
387
- try_visit ! ( visitor. visit_ty( & qself. ty) ) ;
338
+ ItemKind :: Const ( box ConstItem { defaultness : _, generics, ty, expr } ) => {
339
+ try_visit ! ( visitor. visit_generics( generics) ) ;
340
+ try_visit ! ( visitor. visit_ty( ty) ) ;
341
+ visit_opt ! ( visitor, visit_expr, expr) ;
342
+ }
343
+ ItemKind :: Fn ( box Fn { defaultness : _, generics, sig, body } ) => {
344
+ let kind =
345
+ FnKind :: Fn ( FnCtxt :: Free , item. ident , sig, & item. vis , generics, body. as_deref ( ) ) ;
346
+ try_visit ! ( visitor. visit_fn( kind, item. span, item. id) ) ;
347
+ }
348
+ ItemKind :: Mod ( _unsafety, mod_kind) => match mod_kind {
349
+ ModKind :: Loaded ( items, _inline, _inner_span) => {
350
+ walk_list ! ( visitor, visit_item, items) ;
351
+ }
352
+ ModKind :: Unloaded => { }
353
+ } ,
354
+ ItemKind :: ForeignMod ( foreign_module) => {
355
+ walk_list ! ( visitor, visit_foreign_item, & foreign_module. items) ;
356
+ }
357
+ ItemKind :: GlobalAsm ( asm) => try_visit ! ( visitor. visit_inline_asm( asm) ) ,
358
+ ItemKind :: TyAlias ( box TyAlias { generics, bounds, ty, .. } ) => {
359
+ try_visit ! ( visitor. visit_generics( generics) ) ;
360
+ walk_list ! ( visitor, visit_param_bound, bounds, BoundKind :: Bound ) ;
361
+ visit_opt ! ( visitor, visit_ty, ty) ;
362
+ }
363
+ ItemKind :: Enum ( enum_definition, generics) => {
364
+ try_visit ! ( visitor. visit_generics( generics) ) ;
365
+ try_visit ! ( visitor. visit_enum_def( enum_definition) ) ;
366
+ }
367
+ ItemKind :: Impl ( box Impl {
368
+ defaultness : _,
369
+ unsafety : _,
370
+ generics,
371
+ constness : _,
372
+ polarity : _,
373
+ of_trait,
374
+ self_ty,
375
+ items,
376
+ } ) => {
377
+ try_visit ! ( visitor. visit_generics( generics) ) ;
378
+ visit_opt ! ( visitor, visit_trait_ref, of_trait) ;
379
+ try_visit ! ( visitor. visit_ty( self_ty) ) ;
380
+ walk_list ! ( visitor, visit_assoc_item, items, AssocCtxt :: Impl ) ;
381
+ }
382
+ ItemKind :: Struct ( struct_definition, generics)
383
+ | ItemKind :: Union ( struct_definition, generics) => {
384
+ try_visit ! ( visitor. visit_generics( generics) ) ;
385
+ try_visit ! ( visitor. visit_variant_data( struct_definition) ) ;
386
+ }
387
+ ItemKind :: Trait ( box Trait { unsafety : _, is_auto : _, generics, bounds, items } ) => {
388
+ try_visit ! ( visitor. visit_generics( generics) ) ;
389
+ walk_list ! ( visitor, visit_param_bound, bounds, BoundKind :: SuperTraits ) ;
390
+ walk_list ! ( visitor, visit_assoc_item, items, AssocCtxt :: Trait ) ;
391
+ }
392
+ ItemKind :: TraitAlias ( generics, bounds) => {
393
+ try_visit ! ( visitor. visit_generics( generics) ) ;
394
+ walk_list ! ( visitor, visit_param_bound, bounds, BoundKind :: Bound ) ;
395
+ }
396
+ ItemKind :: MacCall ( mac) => try_visit ! ( visitor. visit_mac_call( mac) ) ,
397
+ ItemKind :: MacroDef ( ts) => try_visit ! ( visitor. visit_mac_def( ts, item. id) ) ,
398
+ ItemKind :: Delegation ( box Delegation { id, qself, path, rename, body } ) => {
399
+ if let Some ( qself) = qself {
400
+ try_visit ! ( visitor. visit_ty( & qself. ty) ) ;
401
+ }
402
+ try_visit ! ( visitor. visit_path( path, * id) ) ;
403
+ visit_opt ! ( visitor, visit_ident, * rename) ;
404
+ visit_opt ! ( visitor, visit_block, body) ;
388
405
}
389
- try_visit ! ( visitor. visit_path( path, * id) ) ;
390
- visit_opt ! ( visitor, visit_ident, * rename) ;
391
- visit_opt ! ( visitor, visit_block, body) ;
392
406
}
407
+ V :: Result :: output ( )
393
408
}
394
- walk_list ! ( visitor, visit_attribute, & item. attrs) ;
395
- V :: Result :: output ( )
409
+ }
410
+
411
+ pub fn walk_item < ' a , V : Visitor < ' a > > (
412
+ visitor : & mut V ,
413
+ item : & ' a Item < impl WalkItemKind > ,
414
+ ) -> V :: Result {
415
+ walk_assoc_item ( visitor, item, AssocCtxt :: Trait /*ignored*/ )
396
416
}
397
417
398
418
pub fn walk_enum_def < ' a , V : Visitor < ' a > > (
@@ -613,30 +633,34 @@ pub fn walk_pat<'a, V: Visitor<'a>>(visitor: &mut V, pattern: &'a Pat) -> V::Res
613
633
V :: Result :: output ( )
614
634
}
615
635
616
- pub fn walk_foreign_item < ' a , V : Visitor < ' a > > ( visitor : & mut V , item : & ' a ForeignItem ) -> V :: Result {
617
- let & Item { id, span, ident, ref vis, ref attrs, ref kind, tokens : _ } = item;
618
- try_visit ! ( visitor. visit_vis( vis) ) ;
619
- try_visit ! ( visitor. visit_ident( ident) ) ;
620
- walk_list ! ( visitor, visit_attribute, attrs) ;
621
- match kind {
622
- ForeignItemKind :: Static ( ty, _, expr) => {
623
- try_visit ! ( visitor. visit_ty( ty) ) ;
624
- visit_opt ! ( visitor, visit_expr, expr) ;
625
- }
626
- ForeignItemKind :: Fn ( box Fn { defaultness : _, generics, sig, body } ) => {
627
- let kind = FnKind :: Fn ( FnCtxt :: Foreign , ident, sig, vis, generics, body. as_deref ( ) ) ;
628
- try_visit ! ( visitor. visit_fn( kind, span, id) ) ;
629
- }
630
- ForeignItemKind :: TyAlias ( box TyAlias { generics, bounds, ty, .. } ) => {
631
- try_visit ! ( visitor. visit_generics( generics) ) ;
632
- walk_list ! ( visitor, visit_param_bound, bounds, BoundKind :: Bound ) ;
633
- visit_opt ! ( visitor, visit_ty, ty) ;
634
- }
635
- ForeignItemKind :: MacCall ( mac) => {
636
- try_visit ! ( visitor. visit_mac_call( mac) ) ;
636
+ impl WalkItemKind for ForeignItemKind {
637
+ fn walk < ' a , V : Visitor < ' a > > (
638
+ & ' a self ,
639
+ item : & ' a Item < Self > ,
640
+ _ctxt : AssocCtxt ,
641
+ visitor : & mut V ,
642
+ ) -> V :: Result {
643
+ let & Item { id, span, ident, ref vis, .. } = item;
644
+ match self {
645
+ ForeignItemKind :: Static ( ty, _, expr) => {
646
+ try_visit ! ( visitor. visit_ty( ty) ) ;
647
+ visit_opt ! ( visitor, visit_expr, expr) ;
648
+ }
649
+ ForeignItemKind :: Fn ( box Fn { defaultness : _, generics, sig, body } ) => {
650
+ let kind = FnKind :: Fn ( FnCtxt :: Foreign , ident, sig, vis, generics, body. as_deref ( ) ) ;
651
+ try_visit ! ( visitor. visit_fn( kind, span, id) ) ;
652
+ }
653
+ ForeignItemKind :: TyAlias ( box TyAlias { generics, bounds, ty, .. } ) => {
654
+ try_visit ! ( visitor. visit_generics( generics) ) ;
655
+ walk_list ! ( visitor, visit_param_bound, bounds, BoundKind :: Bound ) ;
656
+ visit_opt ! ( visitor, visit_ty, ty) ;
657
+ }
658
+ ForeignItemKind :: MacCall ( mac) => {
659
+ try_visit ! ( visitor. visit_mac_call( mac) ) ;
660
+ }
637
661
}
662
+ V :: Result :: output ( )
638
663
}
639
- V :: Result :: output ( )
640
664
}
641
665
642
666
pub fn walk_param_bound < ' a , V : Visitor < ' a > > ( visitor : & mut V , bound : & ' a GenericBound ) -> V :: Result {
@@ -756,42 +780,56 @@ pub fn walk_fn<'a, V: Visitor<'a>>(visitor: &mut V, kind: FnKind<'a>) -> V::Resu
756
780
V :: Result :: output ( )
757
781
}
758
782
783
+ impl WalkItemKind for AssocItemKind {
784
+ fn walk < ' a , V : Visitor < ' a > > (
785
+ & ' a self ,
786
+ item : & ' a Item < Self > ,
787
+ ctxt : AssocCtxt ,
788
+ visitor : & mut V ,
789
+ ) -> V :: Result {
790
+ let & Item { id, span, ident, ref vis, .. } = item;
791
+ match self {
792
+ AssocItemKind :: Const ( box ConstItem { defaultness : _, generics, ty, expr } ) => {
793
+ try_visit ! ( visitor. visit_generics( generics) ) ;
794
+ try_visit ! ( visitor. visit_ty( ty) ) ;
795
+ visit_opt ! ( visitor, visit_expr, expr) ;
796
+ }
797
+ AssocItemKind :: Fn ( box Fn { defaultness : _, generics, sig, body } ) => {
798
+ let kind =
799
+ FnKind :: Fn ( FnCtxt :: Assoc ( ctxt) , ident, sig, vis, generics, body. as_deref ( ) ) ;
800
+ try_visit ! ( visitor. visit_fn( kind, span, id) ) ;
801
+ }
802
+ AssocItemKind :: Type ( box TyAlias { generics, bounds, ty, .. } ) => {
803
+ try_visit ! ( visitor. visit_generics( generics) ) ;
804
+ walk_list ! ( visitor, visit_param_bound, bounds, BoundKind :: Bound ) ;
805
+ visit_opt ! ( visitor, visit_ty, ty) ;
806
+ }
807
+ AssocItemKind :: MacCall ( mac) => {
808
+ try_visit ! ( visitor. visit_mac_call( mac) ) ;
809
+ }
810
+ AssocItemKind :: Delegation ( box Delegation { id, qself, path, rename, body } ) => {
811
+ if let Some ( qself) = qself {
812
+ try_visit ! ( visitor. visit_ty( & qself. ty) ) ;
813
+ }
814
+ try_visit ! ( visitor. visit_path( path, * id) ) ;
815
+ visit_opt ! ( visitor, visit_ident, * rename) ;
816
+ visit_opt ! ( visitor, visit_block, body) ;
817
+ }
818
+ }
819
+ V :: Result :: output ( )
820
+ }
821
+ }
822
+
759
823
pub fn walk_assoc_item < ' a , V : Visitor < ' a > > (
760
824
visitor : & mut V ,
761
- item : & ' a AssocItem ,
825
+ item : & ' a Item < impl WalkItemKind > ,
762
826
ctxt : AssocCtxt ,
763
827
) -> V :: Result {
764
- let & Item { id, span, ident, ref vis, ref attrs, ref kind, tokens : _ } = item;
828
+ let & Item { id : _, span : _, ident, ref vis, ref attrs, ref kind, tokens : _ } = item;
829
+ walk_list ! ( visitor, visit_attribute, attrs) ;
765
830
try_visit ! ( visitor. visit_vis( vis) ) ;
766
831
try_visit ! ( visitor. visit_ident( ident) ) ;
767
- walk_list ! ( visitor, visit_attribute, attrs) ;
768
- match kind {
769
- AssocItemKind :: Const ( box ConstItem { defaultness : _, generics, ty, expr } ) => {
770
- try_visit ! ( visitor. visit_generics( generics) ) ;
771
- try_visit ! ( visitor. visit_ty( ty) ) ;
772
- visit_opt ! ( visitor, visit_expr, expr) ;
773
- }
774
- AssocItemKind :: Fn ( box Fn { defaultness : _, generics, sig, body } ) => {
775
- let kind = FnKind :: Fn ( FnCtxt :: Assoc ( ctxt) , ident, sig, vis, generics, body. as_deref ( ) ) ;
776
- try_visit ! ( visitor. visit_fn( kind, span, id) ) ;
777
- }
778
- AssocItemKind :: Type ( box TyAlias { generics, bounds, ty, .. } ) => {
779
- try_visit ! ( visitor. visit_generics( generics) ) ;
780
- walk_list ! ( visitor, visit_param_bound, bounds, BoundKind :: Bound ) ;
781
- visit_opt ! ( visitor, visit_ty, ty) ;
782
- }
783
- AssocItemKind :: MacCall ( mac) => {
784
- try_visit ! ( visitor. visit_mac_call( mac) ) ;
785
- }
786
- AssocItemKind :: Delegation ( box Delegation { id, qself, path, rename, body } ) => {
787
- if let Some ( qself) = qself {
788
- try_visit ! ( visitor. visit_ty( & qself. ty) ) ;
789
- }
790
- try_visit ! ( visitor. visit_path( path, * id) ) ;
791
- visit_opt ! ( visitor, visit_ident, * rename) ;
792
- visit_opt ! ( visitor, visit_block, body) ;
793
- }
794
- }
832
+ try_visit ! ( kind. walk( item, ctxt, visitor) ) ;
795
833
V :: Result :: output ( )
796
834
}
797
835
0 commit comments