@@ -13,7 +13,7 @@ use super::MapEntry::*;
1313
1414use rustc_front:: hir:: * ;
1515use rustc_front:: util;
16- use rustc_front:: visit :: { self , Visitor } ;
16+ use rustc_front:: intravisit :: { self , Visitor } ;
1717use middle:: def_id:: { CRATE_DEF_INDEX , DefIndex } ;
1818use std:: iter:: repeat;
1919use syntax:: ast:: { NodeId , CRATE_NODE_ID , DUMMY_NODE_ID } ;
@@ -22,14 +22,16 @@ use syntax::codemap::Span;
2222/// A Visitor that walks over an AST and collects Node's into an AST
2323/// Map.
2424pub struct NodeCollector < ' ast > {
25+ pub krate : & ' ast Crate ,
2526 pub map : Vec < MapEntry < ' ast > > ,
2627 pub definitions : Definitions ,
2728 pub parent_node : NodeId ,
2829}
2930
3031impl < ' ast > NodeCollector < ' ast > {
31- pub fn root ( ) -> NodeCollector < ' ast > {
32+ pub fn root ( krate : & ' ast Crate ) -> NodeCollector < ' ast > {
3233 let mut collector = NodeCollector {
34+ krate : krate,
3335 map : vec ! [ ] ,
3436 definitions : Definitions :: new ( ) ,
3537 parent_node : CRATE_NODE_ID ,
@@ -44,13 +46,15 @@ impl<'ast> NodeCollector<'ast> {
4446 collector
4547 }
4648
47- pub fn extend ( parent : & ' ast InlinedParent ,
49+ pub fn extend ( krate : & ' ast Crate ,
50+ parent : & ' ast InlinedParent ,
4851 parent_node : NodeId ,
4952 parent_def_path : DefPath ,
5053 map : Vec < MapEntry < ' ast > > ,
5154 definitions : Definitions )
5255 -> NodeCollector < ' ast > {
5356 let mut collector = NodeCollector {
57+ krate : krate,
5458 map : map,
5559 parent_node : parent_node,
5660 definitions : definitions,
@@ -107,6 +111,13 @@ impl<'ast> NodeCollector<'ast> {
107111}
108112
109113impl < ' 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+
110121 fn visit_item ( & mut self , i : & ' ast Item ) {
111122 // Pick the def data. This need not be unique, but the more
112123 // information we encapsulate into
@@ -173,7 +184,7 @@ impl<'ast> Visitor<'ast> for NodeCollector<'ast> {
173184 }
174185 _ => { }
175186 }
176- visit :: walk_item ( self , i) ;
187+ intravisit :: walk_item ( self , i) ;
177188 self . parent_node = parent_node;
178189 }
179190
@@ -184,7 +195,7 @@ impl<'ast> Visitor<'ast> for NodeCollector<'ast> {
184195
185196 let parent_node = self . parent_node ;
186197 self . parent_node = foreign_item. id ;
187- visit :: walk_foreign_item ( self , foreign_item) ;
198+ intravisit :: walk_foreign_item ( self , foreign_item) ;
188199 self . parent_node = parent_node;
189200 }
190201
@@ -195,7 +206,7 @@ impl<'ast> Visitor<'ast> for NodeCollector<'ast> {
195206 DefPathData :: TypeParam ( ty_param. name ) ) ;
196207 }
197208
198- visit :: walk_generics ( self , generics) ;
209+ intravisit :: walk_generics ( self , generics) ;
199210 }
200211
201212 fn visit_trait_item ( & mut self , ti : & ' ast TraitItem ) {
@@ -217,7 +228,7 @@ impl<'ast> Visitor<'ast> for NodeCollector<'ast> {
217228 _ => { }
218229 }
219230
220- visit :: walk_trait_item ( self , ti) ;
231+ intravisit :: walk_trait_item ( self , ti) ;
221232
222233 self . parent_node = parent_node;
223234 }
@@ -240,7 +251,7 @@ impl<'ast> Visitor<'ast> for NodeCollector<'ast> {
240251 _ => { }
241252 }
242253
243- visit :: walk_impl_item ( self , ii) ;
254+ intravisit :: walk_impl_item ( self , ii) ;
244255
245256 self . parent_node = parent_node;
246257 }
@@ -259,7 +270,7 @@ impl<'ast> Visitor<'ast> for NodeCollector<'ast> {
259270
260271 let parent_node = self . parent_node ;
261272 self . parent_node = pat. id ;
262- visit :: walk_pat ( self , pat) ;
273+ intravisit :: walk_pat ( self , pat) ;
263274 self . parent_node = parent_node;
264275 }
265276
@@ -273,7 +284,7 @@ impl<'ast> Visitor<'ast> for NodeCollector<'ast> {
273284
274285 let parent_node = self . parent_node ;
275286 self . parent_node = expr. id ;
276- visit :: walk_expr ( self , expr) ;
287+ intravisit :: walk_expr ( self , expr) ;
277288 self . parent_node = parent_node;
278289 }
279290
@@ -282,21 +293,21 @@ impl<'ast> Visitor<'ast> for NodeCollector<'ast> {
282293 self . insert ( id, NodeStmt ( stmt) ) ;
283294 let parent_node = self . parent_node ;
284295 self . parent_node = id;
285- visit :: walk_stmt ( self , stmt) ;
296+ intravisit :: walk_stmt ( self , stmt) ;
286297 self . parent_node = parent_node;
287298 }
288299
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 ,
290301 b : & ' ast Block , s : Span , id : NodeId ) {
291302 assert_eq ! ( self . parent_node, id) ;
292- visit :: walk_fn ( self , fk, fd, b, s) ;
303+ intravisit :: walk_fn ( self , fk, fd, b, s) ;
293304 }
294305
295306 fn visit_block ( & mut self , block : & ' ast Block ) {
296307 self . insert ( block. id , NodeBlock ( block) ) ;
297308 let parent_node = self . parent_node ;
298309 self . parent_node = block. id ;
299- visit :: walk_block ( self , block) ;
310+ intravisit :: walk_block ( self , block) ;
300311 self . parent_node = parent_node;
301312 }
302313
0 commit comments