@@ -177,6 +177,17 @@ pub trait Visitor<'v> : Sized {
177
177
}
178
178
}
179
179
180
+ /// Like `visit_nested_item()`, but for trait items. See
181
+ /// `visit_nested_item()` for advice on when to override this
182
+ /// method.
183
+ #[ allow( unused_variables) ]
184
+ fn visit_nested_trait_item ( & mut self , id : TraitItemId ) {
185
+ let opt_item = self . nested_visit_map ( ) . inter ( ) . map ( |map| map. trait_item ( id) ) ;
186
+ if let Some ( item) = opt_item {
187
+ self . visit_trait_item ( item) ;
188
+ }
189
+ }
190
+
180
191
/// Like `visit_nested_item()`, but for impl items. See
181
192
/// `visit_nested_item()` for advice on when to override this
182
193
/// method.
@@ -192,10 +203,10 @@ pub trait Visitor<'v> : Sized {
192
203
/// visit_nested_item, does nothing by default unless you override
193
204
/// `nested_visit_map` to return `Some(_)`, in which case it will walk the
194
205
/// body.
195
- fn visit_body ( & mut self , id : ExprId ) {
196
- let opt_expr = self . nested_visit_map ( ) . intra ( ) . map ( |map| map. expr ( id) ) ;
197
- if let Some ( expr ) = opt_expr {
198
- self . visit_expr ( expr ) ;
206
+ fn visit_nested_body ( & mut self , id : BodyId ) {
207
+ let opt_body = self . nested_visit_map ( ) . intra ( ) . map ( |map| map. body ( id) ) ;
208
+ if let Some ( body ) = opt_body {
209
+ self . visit_body ( body ) ;
199
210
}
200
211
}
201
212
@@ -205,6 +216,10 @@ pub trait Visitor<'v> : Sized {
205
216
walk_item ( self , i)
206
217
}
207
218
219
+ fn visit_body ( & mut self , b : & ' v Body ) {
220
+ walk_body ( self , b) ;
221
+ }
222
+
208
223
/// When invoking `visit_all_item_likes()`, you need to supply an
209
224
/// item-like visitor. This method converts a "intra-visit"
210
225
/// visitor into an item-like visitor that walks the entire tree.
@@ -253,8 +268,6 @@ pub trait Visitor<'v> : Sized {
253
268
fn visit_expr ( & mut self , ex : & ' v Expr ) {
254
269
walk_expr ( self , ex)
255
270
}
256
- fn visit_expr_post ( & mut self , _ex : & ' v Expr ) {
257
- }
258
271
fn visit_ty ( & mut self , t : & ' v Ty ) {
259
272
walk_ty ( self , t)
260
273
}
@@ -267,12 +280,15 @@ pub trait Visitor<'v> : Sized {
267
280
fn visit_fn_decl ( & mut self , fd : & ' v FnDecl ) {
268
281
walk_fn_decl ( self , fd)
269
282
}
270
- fn visit_fn ( & mut self , fk : FnKind < ' v > , fd : & ' v FnDecl , b : ExprId , s : Span , id : NodeId ) {
283
+ fn visit_fn ( & mut self , fk : FnKind < ' v > , fd : & ' v FnDecl , b : BodyId , s : Span , id : NodeId ) {
271
284
walk_fn ( self , fk, fd, b, s, id)
272
285
}
273
286
fn visit_trait_item ( & mut self , ti : & ' v TraitItem ) {
274
287
walk_trait_item ( self , ti)
275
288
}
289
+ fn visit_trait_item_ref ( & mut self , ii : & ' v TraitItemRef ) {
290
+ walk_trait_item_ref ( self , ii)
291
+ }
276
292
fn visit_impl_item ( & mut self , ii : & ' v ImplItem ) {
277
293
walk_impl_item ( self , ii)
278
294
}
@@ -378,6 +394,14 @@ pub fn walk_mod<'v, V: Visitor<'v>>(visitor: &mut V, module: &'v Mod, mod_node_i
378
394
}
379
395
}
380
396
397
+ pub fn walk_body < ' v , V : Visitor < ' v > > ( visitor : & mut V , body : & ' v Body ) {
398
+ for argument in & body. arguments {
399
+ visitor. visit_id ( argument. id ) ;
400
+ visitor. visit_pat ( & argument. pat ) ;
401
+ }
402
+ visitor. visit_expr ( & body. value ) ;
403
+ }
404
+
381
405
pub fn walk_local < ' v , V : Visitor < ' v > > ( visitor : & mut V , local : & ' v Local ) {
382
406
visitor. visit_id ( local. id ) ;
383
407
visitor. visit_pat ( & local. pat ) ;
@@ -423,11 +447,11 @@ pub fn walk_item<'v, V: Visitor<'v>>(visitor: &mut V, item: &'v Item) {
423
447
visitor. visit_id ( item. id ) ;
424
448
visitor. visit_path ( path, item. id ) ;
425
449
}
426
- ItemStatic ( ref typ, _, ref expr ) |
427
- ItemConst ( ref typ, ref expr ) => {
450
+ ItemStatic ( ref typ, _, body ) |
451
+ ItemConst ( ref typ, body ) => {
428
452
visitor. visit_id ( item. id ) ;
429
453
visitor. visit_ty ( typ) ;
430
- visitor. visit_expr ( expr ) ;
454
+ visitor. visit_nested_body ( body ) ;
431
455
}
432
456
ItemFn ( ref declaration, unsafety, constness, abi, ref generics, body_id) => {
433
457
visitor. visit_fn ( FnKind :: ItemFn ( item. name ,
@@ -469,21 +493,19 @@ pub fn walk_item<'v, V: Visitor<'v>>(visitor: &mut V, item: &'v Item) {
469
493
visitor. visit_generics ( type_parameters) ;
470
494
walk_list ! ( visitor, visit_trait_ref, opt_trait_reference) ;
471
495
visitor. visit_ty ( typ) ;
472
- for impl_item_ref in impl_item_refs {
473
- visitor. visit_impl_item_ref ( impl_item_ref) ;
474
- }
496
+ walk_list ! ( visitor, visit_impl_item_ref, impl_item_refs) ;
475
497
}
476
498
ItemStruct ( ref struct_definition, ref generics) |
477
499
ItemUnion ( ref struct_definition, ref generics) => {
478
500
visitor. visit_generics ( generics) ;
479
501
visitor. visit_id ( item. id ) ;
480
502
visitor. visit_variant_data ( struct_definition, item. name , generics, item. id , item. span ) ;
481
503
}
482
- ItemTrait ( _, ref generics, ref bounds, ref methods ) => {
504
+ ItemTrait ( _, ref generics, ref bounds, ref trait_item_refs ) => {
483
505
visitor. visit_id ( item. id ) ;
484
506
visitor. visit_generics ( generics) ;
485
507
walk_list ! ( visitor, visit_ty_param_bound, bounds) ;
486
- walk_list ! ( visitor, visit_trait_item , methods ) ;
508
+ walk_list ! ( visitor, visit_trait_item_ref , trait_item_refs ) ;
487
509
}
488
510
}
489
511
walk_list ! ( visitor, visit_attribute, & item. attrs) ;
@@ -511,7 +533,7 @@ pub fn walk_variant<'v, V: Visitor<'v>>(visitor: &mut V,
511
533
generics,
512
534
parent_item_id,
513
535
variant. span ) ;
514
- walk_list ! ( visitor, visit_expr , & variant. node. disr_expr) ;
536
+ walk_list ! ( visitor, visit_nested_body , variant. node. disr_expr) ;
515
537
walk_list ! ( visitor, visit_attribute, & variant. node. attrs) ;
516
538
}
517
539
@@ -544,18 +566,18 @@ pub fn walk_ty<'v, V: Visitor<'v>>(visitor: &mut V, typ: &'v Ty) {
544
566
visitor. visit_ty ( ty) ;
545
567
walk_list ! ( visitor, visit_ty_param_bound, bounds) ;
546
568
}
547
- TyArray ( ref ty, ref expression ) => {
569
+ TyArray ( ref ty, length ) => {
548
570
visitor. visit_ty ( ty) ;
549
- visitor. visit_expr ( expression )
571
+ visitor. visit_nested_body ( length )
550
572
}
551
573
TyPolyTraitRef ( ref bounds) => {
552
574
walk_list ! ( visitor, visit_ty_param_bound, bounds) ;
553
575
}
554
576
TyImplTrait ( ref bounds) => {
555
577
walk_list ! ( visitor, visit_ty_param_bound, bounds) ;
556
578
}
557
- TyTypeof ( ref expression) => {
558
- visitor. visit_expr ( expression)
579
+ TyTypeof ( expression) => {
580
+ visitor. visit_nested_body ( expression)
559
581
}
560
582
TyInfer => { }
561
583
}
@@ -662,9 +684,12 @@ pub fn walk_foreign_item<'v, V: Visitor<'v>>(visitor: &mut V, foreign_item: &'v
662
684
visitor. visit_name ( foreign_item. span , foreign_item. name ) ;
663
685
664
686
match foreign_item. node {
665
- ForeignItemFn ( ref function_declaration, ref generics) => {
687
+ ForeignItemFn ( ref function_declaration, ref names, ref generics) => {
688
+ visitor. visit_generics ( generics) ;
666
689
visitor. visit_fn_decl ( function_declaration) ;
667
- visitor. visit_generics ( generics)
690
+ for name in names {
691
+ visitor. visit_name ( name. span , name. node ) ;
692
+ }
668
693
}
669
694
ForeignItemStatic ( ref typ, _) => visitor. visit_ty ( typ) ,
670
695
}
@@ -732,18 +757,8 @@ pub fn walk_fn_ret_ty<'v, V: Visitor<'v>>(visitor: &mut V, ret_ty: &'v FunctionR
732
757
}
733
758
734
759
pub fn walk_fn_decl < ' v , V : Visitor < ' v > > ( visitor : & mut V , function_declaration : & ' v FnDecl ) {
735
- for argument in & function_declaration. inputs {
736
- visitor. visit_id ( argument. id ) ;
737
- visitor. visit_pat ( & argument. pat ) ;
738
- visitor. visit_ty ( & argument. ty )
739
- }
740
- walk_fn_ret_ty ( visitor, & function_declaration. output )
741
- }
742
-
743
- pub fn walk_fn_decl_nopat < ' v , V : Visitor < ' v > > ( visitor : & mut V , function_declaration : & ' v FnDecl ) {
744
- for argument in & function_declaration. inputs {
745
- visitor. visit_id ( argument. id ) ;
746
- visitor. visit_ty ( & argument. ty )
760
+ for ty in & function_declaration. inputs {
761
+ visitor. visit_ty ( ty)
747
762
}
748
763
walk_fn_ret_ty ( visitor, & function_declaration. output )
749
764
}
@@ -763,42 +778,33 @@ pub fn walk_fn_kind<'v, V: Visitor<'v>>(visitor: &mut V, function_kind: FnKind<'
763
778
pub fn walk_fn < ' v , V : Visitor < ' v > > ( visitor : & mut V ,
764
779
function_kind : FnKind < ' v > ,
765
780
function_declaration : & ' v FnDecl ,
766
- body_id : ExprId ,
781
+ body_id : BodyId ,
767
782
_span : Span ,
768
783
id : NodeId ) {
769
784
visitor. visit_id ( id) ;
770
785
visitor. visit_fn_decl ( function_declaration) ;
771
786
walk_fn_kind ( visitor, function_kind) ;
772
- visitor. visit_body ( body_id)
773
- }
774
-
775
- pub fn walk_fn_with_body < ' v , V : Visitor < ' v > > ( visitor : & mut V ,
776
- function_kind : FnKind < ' v > ,
777
- function_declaration : & ' v FnDecl ,
778
- body : & ' v Expr ,
779
- _span : Span ,
780
- id : NodeId ) {
781
- visitor. visit_id ( id) ;
782
- visitor. visit_fn_decl ( function_declaration) ;
783
- walk_fn_kind ( visitor, function_kind) ;
784
- visitor. visit_expr ( body)
787
+ visitor. visit_nested_body ( body_id)
785
788
}
786
789
787
790
pub fn walk_trait_item < ' v , V : Visitor < ' v > > ( visitor : & mut V , trait_item : & ' v TraitItem ) {
788
791
visitor. visit_name ( trait_item. span , trait_item. name ) ;
789
792
walk_list ! ( visitor, visit_attribute, & trait_item. attrs) ;
790
793
match trait_item. node {
791
- ConstTraitItem ( ref ty, ref default) => {
794
+ TraitItemKind :: Const ( ref ty, default) => {
792
795
visitor. visit_id ( trait_item. id ) ;
793
796
visitor. visit_ty ( ty) ;
794
- walk_list ! ( visitor, visit_expr , default ) ;
797
+ walk_list ! ( visitor, visit_nested_body , default ) ;
795
798
}
796
- MethodTraitItem ( ref sig, None ) => {
799
+ TraitItemKind :: Method ( ref sig, TraitMethod :: Required ( ref names ) ) => {
797
800
visitor. visit_id ( trait_item. id ) ;
798
801
visitor. visit_generics ( & sig. generics ) ;
799
802
visitor. visit_fn_decl ( & sig. decl ) ;
803
+ for name in names {
804
+ visitor. visit_name ( name. span , name. node ) ;
805
+ }
800
806
}
801
- MethodTraitItem ( ref sig, Some ( body_id) ) => {
807
+ TraitItemKind :: Method ( ref sig, TraitMethod :: Provided ( body_id) ) => {
802
808
visitor. visit_fn ( FnKind :: Method ( trait_item. name ,
803
809
sig,
804
810
None ,
@@ -808,14 +814,23 @@ pub fn walk_trait_item<'v, V: Visitor<'v>>(visitor: &mut V, trait_item: &'v Trai
808
814
trait_item. span ,
809
815
trait_item. id ) ;
810
816
}
811
- TypeTraitItem ( ref bounds, ref default) => {
817
+ TraitItemKind :: Type ( ref bounds, ref default) => {
812
818
visitor. visit_id ( trait_item. id ) ;
813
819
walk_list ! ( visitor, visit_ty_param_bound, bounds) ;
814
820
walk_list ! ( visitor, visit_ty, default ) ;
815
821
}
816
822
}
817
823
}
818
824
825
+ pub fn walk_trait_item_ref < ' v , V : Visitor < ' v > > ( visitor : & mut V , trait_item_ref : & ' v TraitItemRef ) {
826
+ // NB: Deliberately force a compilation error if/when new fields are added.
827
+ let TraitItemRef { id, name, ref kind, span, ref defaultness } = * trait_item_ref;
828
+ visitor. visit_nested_trait_item ( id) ;
829
+ visitor. visit_name ( span, name) ;
830
+ visitor. visit_associated_item_kind ( kind) ;
831
+ visitor. visit_defaultness ( defaultness) ;
832
+ }
833
+
819
834
pub fn walk_impl_item < ' v , V : Visitor < ' v > > ( visitor : & mut V , impl_item : & ' v ImplItem ) {
820
835
// NB: Deliberately force a compilation error if/when new fields are added.
821
836
let ImplItem { id : _, name, ref vis, ref defaultness, ref attrs, ref node, span } = * impl_item;
@@ -825,10 +840,10 @@ pub fn walk_impl_item<'v, V: Visitor<'v>>(visitor: &mut V, impl_item: &'v ImplIt
825
840
visitor. visit_defaultness ( defaultness) ;
826
841
walk_list ! ( visitor, visit_attribute, attrs) ;
827
842
match * node {
828
- ImplItemKind :: Const ( ref ty, ref expr ) => {
843
+ ImplItemKind :: Const ( ref ty, body ) => {
829
844
visitor. visit_id ( impl_item. id ) ;
830
845
visitor. visit_ty ( ty) ;
831
- visitor. visit_expr ( expr ) ;
846
+ visitor. visit_nested_body ( body ) ;
832
847
}
833
848
ImplItemKind :: Method ( ref sig, body_id) => {
834
849
visitor. visit_fn ( FnKind :: Method ( impl_item. name ,
@@ -907,9 +922,9 @@ pub fn walk_expr<'v, V: Visitor<'v>>(visitor: &mut V, expression: &'v Expr) {
907
922
ExprArray ( ref subexpressions) => {
908
923
walk_list ! ( visitor, visit_expr, subexpressions) ;
909
924
}
910
- ExprRepeat ( ref element, ref count) => {
925
+ ExprRepeat ( ref element, count) => {
911
926
visitor. visit_expr ( element) ;
912
- visitor. visit_expr ( count)
927
+ visitor. visit_nested_body ( count)
913
928
}
914
929
ExprStruct ( ref qpath, ref fields, ref optional_base) => {
915
930
visitor. visit_qpath ( qpath, expression. id , expression. span ) ;
@@ -1016,8 +1031,6 @@ pub fn walk_expr<'v, V: Visitor<'v>>(visitor: &mut V, expression: &'v Expr) {
1016
1031
}
1017
1032
}
1018
1033
}
1019
-
1020
- visitor. visit_expr_post ( expression)
1021
1034
}
1022
1035
1023
1036
pub fn walk_arm < ' v , V : Visitor < ' v > > ( visitor : & mut V , arm : & ' v Arm ) {
@@ -1100,16 +1113,3 @@ impl<'a, 'ast> Visitor<'ast> for IdRangeComputingVisitor<'a, 'ast> {
1100
1113
self . result . add ( id) ;
1101
1114
}
1102
1115
}
1103
-
1104
- /// Computes the id range for a single fn body, ignoring nested items.
1105
- pub fn compute_id_range_for_fn_body < ' v > ( fk : FnKind < ' v > ,
1106
- decl : & ' v FnDecl ,
1107
- body : & ' v Expr ,
1108
- sp : Span ,
1109
- id : NodeId ,
1110
- map : & map:: Map < ' v > )
1111
- -> IdRange {
1112
- let mut visitor = IdRangeComputingVisitor :: new ( map) ;
1113
- walk_fn_with_body ( & mut visitor, fk, decl, body, sp, id) ;
1114
- visitor. result ( )
1115
- }
0 commit comments