@@ -67,6 +67,9 @@ pub fn generics_of_fn(fk: &fn_kind) -> Generics {
67
67
}
68
68
69
69
pub trait Visitor < E : Clone > {
70
+ fn visit_ident ( & mut self , _sp : Span , _ident : Ident , _e : E ) {
71
+ /*! Visit the idents */
72
+ }
70
73
fn visit_mod ( & mut self , m : & _mod , _s : Span , _n : NodeId , e : E ) { walk_mod ( self , m, e) }
71
74
fn visit_view_item ( & mut self , i : & view_item , e : E ) { walk_view_item ( self , i, e) }
72
75
fn visit_foreign_item ( & mut self , i : @foreign_item , e : E ) { walk_foreign_item ( self , i, e) }
@@ -132,8 +135,31 @@ pub fn walk_mod<E:Clone, V:Visitor<E>>(visitor: &mut V, module: &_mod, env: E) {
132
135
}
133
136
}
134
137
135
- pub fn walk_view_item < E : Clone , V : Visitor < E > > ( _: & mut V , _: & view_item , _: E ) {
136
- // Empty!
138
+ pub fn walk_view_item < E : Clone , V : Visitor < E > > ( visitor : & mut V , vi : & view_item , env : E ) {
139
+ match vi. node {
140
+ view_item_extern_mod( name, _, _, _) => {
141
+ visitor. visit_ident ( vi. span , name, env)
142
+ }
143
+ view_item_use( ref paths) => {
144
+ for vp in paths. iter ( ) {
145
+ let path = match vp. node {
146
+ view_path_simple( ident, ref path, _) => {
147
+ visitor. visit_ident ( vp. span , ident, env. clone ( ) ) ;
148
+ path
149
+ }
150
+ view_path_glob( ref path, _) => path,
151
+ view_path_list( ref path, ref list, _) => {
152
+ for id in list. iter ( ) {
153
+ visitor. visit_ident ( id. span , id. node . name , env. clone ( ) )
154
+ }
155
+ path
156
+ }
157
+ } ;
158
+
159
+ walk_path ( visitor, path, env. clone ( ) ) ;
160
+ }
161
+ }
162
+ }
137
163
}
138
164
139
165
pub fn walk_local < E : Clone , V : Visitor < E > > ( visitor : & mut V , local : & Local , env : E ) {
@@ -164,6 +190,7 @@ fn walk_trait_ref<E:Clone, V:Visitor<E>>(visitor: &mut V,
164
190
}
165
191
166
192
pub fn walk_item < E : Clone , V : Visitor < E > > ( visitor : & mut V , item : & item , env : E ) {
193
+ visitor. visit_ident ( item. span , item. ident , env. clone ( ) ) ;
167
194
match item. node {
168
195
item_static( ref typ, _, expr) => {
169
196
visitor. visit_ty ( typ, env. clone ( ) ) ;
@@ -243,6 +270,8 @@ pub fn walk_variant<E:Clone, V:Visitor<E>>(visitor:&mut V,
243
270
variant : & variant ,
244
271
generics : & Generics ,
245
272
env : E ) {
273
+ visitor. visit_ident ( variant. span , variant. node . name , env. clone ( ) ) ;
274
+
246
275
match variant. node . kind {
247
276
tuple_variant_kind( ref variant_arguments) => {
248
277
for variant_argument in variant_arguments. iter ( ) {
@@ -328,6 +357,8 @@ fn walk_lifetime_decls<E:Clone, V:Visitor<E>>(visitor: &mut V,
328
357
329
358
pub fn walk_path < E : Clone , V : Visitor < E > > ( visitor : & mut V , path : & Path , env : E ) {
330
359
for segment in path. segments . iter ( ) {
360
+ visitor. visit_ident ( path. span , segment. identifier , env. clone ( ) ) ;
361
+
331
362
for typ in segment. types . iter ( ) {
332
363
visitor. visit_ty ( typ, env. clone ( ) ) ;
333
364
}
@@ -393,6 +424,8 @@ pub fn walk_pat<E:Clone, V:Visitor<E>>(visitor: &mut V, pattern: &Pat, env: E) {
393
424
pub fn walk_foreign_item < E : Clone , V : Visitor < E > > ( visitor : & mut V ,
394
425
foreign_item : & foreign_item ,
395
426
env : E ) {
427
+ visitor. visit_ident ( foreign_item. span , foreign_item. ident , env. clone ( ) ) ;
428
+
396
429
match foreign_item. node {
397
430
foreign_item_fn( ref function_declaration, ref generics) => {
398
431
walk_fn_decl ( visitor, function_declaration, env. clone ( ) ) ;
@@ -441,6 +474,7 @@ pub fn walk_fn_decl<E:Clone, V:Visitor<E>>(visitor: &mut V,
441
474
pub fn walk_method_helper < E : Clone , V : Visitor < E > > ( visitor : & mut V ,
442
475
method : & method ,
443
476
env : E ) {
477
+ visitor. visit_ident ( method. span , method. ident , env. clone ( ) ) ;
444
478
visitor. visit_fn ( & fk_method ( method. ident , & method. generics , method) ,
445
479
& method. decl ,
446
480
& method. body ,
@@ -477,12 +511,13 @@ pub fn walk_fn<E:Clone, V:Visitor<E>>(visitor: &mut V,
477
511
pub fn walk_ty_method < E : Clone , V : Visitor < E > > ( visitor : & mut V ,
478
512
method_type : & TypeMethod ,
479
513
env : E ) {
514
+ visitor. visit_ident ( method_type. span , method_type. ident , env. clone ( ) ) ;
480
515
visitor. visit_explicit_self ( & method_type. explicit_self , env. clone ( ) ) ;
481
516
for argument_type in method_type. decl . inputs . iter ( ) {
482
517
visitor. visit_ty ( & argument_type. ty , env. clone ( ) )
483
518
}
484
519
visitor. visit_generics ( & method_type. generics , env. clone ( ) ) ;
485
- visitor. visit_ty ( & method_type. decl . output , env. clone ( ) )
520
+ visitor. visit_ty ( & method_type. decl . output , env) ;
486
521
}
487
522
488
523
pub fn walk_trait_method < E : Clone , V : Visitor < E > > ( visitor : & mut V ,
@@ -510,6 +545,13 @@ pub fn walk_struct_def<E:Clone, V:Visitor<E>>(visitor: &mut V,
510
545
pub fn walk_struct_field < E : Clone , V : Visitor < E > > ( visitor : & mut V ,
511
546
struct_field : & struct_field ,
512
547
env : E ) {
548
+ match struct_field. node . kind {
549
+ named_field( name, _) => {
550
+ visitor. visit_ident ( struct_field. span , name, env. clone ( ) )
551
+ }
552
+ _ => { }
553
+ }
554
+
513
555
visitor. visit_ty ( & struct_field. node . ty , env)
514
556
}
515
557
0 commit comments