@@ -13,7 +13,7 @@ use super::MapEntry::*;
13
13
14
14
use rustc_front:: hir:: * ;
15
15
use rustc_front:: util;
16
- use rustc_front:: visit :: { self , Visitor } ;
16
+ use rustc_front:: intravisit :: { self , Visitor } ;
17
17
use middle:: def_id:: { CRATE_DEF_INDEX , DefIndex } ;
18
18
use std:: iter:: repeat;
19
19
use syntax:: ast:: { NodeId , CRATE_NODE_ID , DUMMY_NODE_ID } ;
@@ -22,14 +22,16 @@ use syntax::codemap::Span;
22
22
/// A Visitor that walks over an AST and collects Node's into an AST
23
23
/// Map.
24
24
pub struct NodeCollector < ' ast > {
25
+ pub krate : & ' ast Crate ,
25
26
pub map : Vec < MapEntry < ' ast > > ,
26
27
pub definitions : Definitions ,
27
28
pub parent_node : NodeId ,
28
29
}
29
30
30
31
impl < ' ast > NodeCollector < ' ast > {
31
- pub fn root ( ) -> NodeCollector < ' ast > {
32
+ pub fn root ( krate : & ' ast Crate ) -> NodeCollector < ' ast > {
32
33
let mut collector = NodeCollector {
34
+ krate : krate,
33
35
map : vec ! [ ] ,
34
36
definitions : Definitions :: new ( ) ,
35
37
parent_node : CRATE_NODE_ID ,
@@ -44,13 +46,15 @@ impl<'ast> NodeCollector<'ast> {
44
46
collector
45
47
}
46
48
47
- pub fn extend ( parent : & ' ast InlinedParent ,
49
+ pub fn extend ( krate : & ' ast Crate ,
50
+ parent : & ' ast InlinedParent ,
48
51
parent_node : NodeId ,
49
52
parent_def_path : DefPath ,
50
53
map : Vec < MapEntry < ' ast > > ,
51
54
definitions : Definitions )
52
55
-> NodeCollector < ' ast > {
53
56
let mut collector = NodeCollector {
57
+ krate : krate,
54
58
map : map,
55
59
parent_node : parent_node,
56
60
definitions : definitions,
@@ -107,6 +111,13 @@ impl<'ast> NodeCollector<'ast> {
107
111
}
108
112
109
113
impl < ' ast > Visitor < ' ast > for NodeCollector < ' ast > {
114
+ /// Because we want to track parent items and so forth, enable
115
+ /// deep walking so that we walk nested items in the context of
116
+ /// their outer items.
117
+ fn visit_nested_item ( & mut self , item : ItemId ) {
118
+ self . visit_item ( self . krate . item ( item. id ) )
119
+ }
120
+
110
121
fn visit_item ( & mut self , i : & ' ast Item ) {
111
122
// Pick the def data. This need not be unique, but the more
112
123
// information we encapsulate into
@@ -173,7 +184,7 @@ impl<'ast> Visitor<'ast> for NodeCollector<'ast> {
173
184
}
174
185
_ => { }
175
186
}
176
- visit :: walk_item ( self , i) ;
187
+ intravisit :: walk_item ( self , i) ;
177
188
self . parent_node = parent_node;
178
189
}
179
190
@@ -184,7 +195,7 @@ impl<'ast> Visitor<'ast> for NodeCollector<'ast> {
184
195
185
196
let parent_node = self . parent_node ;
186
197
self . parent_node = foreign_item. id ;
187
- visit :: walk_foreign_item ( self , foreign_item) ;
198
+ intravisit :: walk_foreign_item ( self , foreign_item) ;
188
199
self . parent_node = parent_node;
189
200
}
190
201
@@ -195,7 +206,7 @@ impl<'ast> Visitor<'ast> for NodeCollector<'ast> {
195
206
DefPathData :: TypeParam ( ty_param. name ) ) ;
196
207
}
197
208
198
- visit :: walk_generics ( self , generics) ;
209
+ intravisit :: walk_generics ( self , generics) ;
199
210
}
200
211
201
212
fn visit_trait_item ( & mut self , ti : & ' ast TraitItem ) {
@@ -217,7 +228,7 @@ impl<'ast> Visitor<'ast> for NodeCollector<'ast> {
217
228
_ => { }
218
229
}
219
230
220
- visit :: walk_trait_item ( self , ti) ;
231
+ intravisit :: walk_trait_item ( self , ti) ;
221
232
222
233
self . parent_node = parent_node;
223
234
}
@@ -240,7 +251,7 @@ impl<'ast> Visitor<'ast> for NodeCollector<'ast> {
240
251
_ => { }
241
252
}
242
253
243
- visit :: walk_impl_item ( self , ii) ;
254
+ intravisit :: walk_impl_item ( self , ii) ;
244
255
245
256
self . parent_node = parent_node;
246
257
}
@@ -259,7 +270,7 @@ impl<'ast> Visitor<'ast> for NodeCollector<'ast> {
259
270
260
271
let parent_node = self . parent_node ;
261
272
self . parent_node = pat. id ;
262
- visit :: walk_pat ( self , pat) ;
273
+ intravisit :: walk_pat ( self , pat) ;
263
274
self . parent_node = parent_node;
264
275
}
265
276
@@ -273,7 +284,7 @@ impl<'ast> Visitor<'ast> for NodeCollector<'ast> {
273
284
274
285
let parent_node = self . parent_node ;
275
286
self . parent_node = expr. id ;
276
- visit :: walk_expr ( self , expr) ;
287
+ intravisit :: walk_expr ( self , expr) ;
277
288
self . parent_node = parent_node;
278
289
}
279
290
@@ -282,21 +293,21 @@ impl<'ast> Visitor<'ast> for NodeCollector<'ast> {
282
293
self . insert ( id, NodeStmt ( stmt) ) ;
283
294
let parent_node = self . parent_node ;
284
295
self . parent_node = id;
285
- visit :: walk_stmt ( self , stmt) ;
296
+ intravisit :: walk_stmt ( self , stmt) ;
286
297
self . parent_node = parent_node;
287
298
}
288
299
289
- fn visit_fn ( & mut self , fk : visit :: FnKind < ' ast > , fd : & ' ast FnDecl ,
300
+ fn visit_fn ( & mut self , fk : intravisit :: FnKind < ' ast > , fd : & ' ast FnDecl ,
290
301
b : & ' ast Block , s : Span , id : NodeId ) {
291
302
assert_eq ! ( self . parent_node, id) ;
292
- visit :: walk_fn ( self , fk, fd, b, s) ;
303
+ intravisit :: walk_fn ( self , fk, fd, b, s) ;
293
304
}
294
305
295
306
fn visit_block ( & mut self , block : & ' ast Block ) {
296
307
self . insert ( block. id , NodeBlock ( block) ) ;
297
308
let parent_node = self . parent_node ;
298
309
self . parent_node = block. id ;
299
- visit :: walk_block ( self , block) ;
310
+ intravisit :: walk_block ( self , block) ;
300
311
self . parent_node = parent_node;
301
312
}
302
313
0 commit comments