@@ -56,12 +56,7 @@ impl<'b> Resolver<'b> {
56
56
pub fn build_reduced_graph ( & mut self , krate : & Crate ) {
57
57
let no_implicit_prelude = attr:: contains_name ( & krate. attrs , "no_implicit_prelude" ) ;
58
58
self . graph_root . no_implicit_prelude . set ( no_implicit_prelude) ;
59
-
60
- let mut visitor = BuildReducedGraphVisitor {
61
- parent : self . graph_root ,
62
- resolver : self ,
63
- } ;
64
- visit:: walk_crate ( & mut visitor, krate) ;
59
+ visit:: walk_crate ( & mut BuildReducedGraphVisitor { resolver : self } , krate) ;
65
60
}
66
61
67
62
/// Defines `name` in namespace `ns` of module `parent` to be `def` if it is not yet defined;
@@ -84,11 +79,11 @@ impl<'b> Resolver<'b> {
84
79
}
85
80
86
81
/// Constructs the reduced graph for one item.
87
- fn build_reduced_graph_for_item ( & mut self , item : & Item , parent_ref : & mut Module < ' b > ) {
88
- let parent = * parent_ref;
82
+ fn build_reduced_graph_for_item ( & mut self , item : & Item ) {
83
+ let parent = self . current_module ;
84
+ let parent_vis = self . current_vis ;
89
85
let name = item. ident . name ;
90
86
let sp = item. span ;
91
- self . current_module = parent;
92
87
let vis = self . resolve_visibility ( & item. vis ) ;
93
88
94
89
match item. node {
@@ -130,8 +125,7 @@ impl<'b> Resolver<'b> {
130
125
131
126
let subclass = ImportDirectiveSubclass :: single ( binding. name , source_name) ;
132
127
let span = view_path. span ;
133
- parent. add_import_directive ( module_path, subclass, span, item. id , vis) ;
134
- self . unresolved_imports += 1 ;
128
+ self . add_import_directive ( module_path, subclass, span, item. id , vis) ;
135
129
}
136
130
ViewPathList ( _, ref source_items) => {
137
131
// Make sure there's at most one `mod` import in the list.
@@ -176,15 +170,13 @@ impl<'b> Resolver<'b> {
176
170
} ;
177
171
let subclass = ImportDirectiveSubclass :: single ( rename, name) ;
178
172
let ( span, id) = ( source_item. span , source_item. node . id ( ) ) ;
179
- parent. add_import_directive ( module_path, subclass, span, id, vis) ;
180
- self . unresolved_imports += 1 ;
173
+ self . add_import_directive ( module_path, subclass, span, id, vis) ;
181
174
}
182
175
}
183
176
ViewPathGlob ( _) => {
184
177
let subclass = GlobImport { is_prelude : is_prelude } ;
185
178
let span = view_path. span ;
186
- parent. add_import_directive ( module_path, subclass, span, item. id , vis) ;
187
- self . unresolved_imports += 1 ;
179
+ self . add_import_directive ( module_path, subclass, span, item. id , vis) ;
188
180
}
189
181
}
190
182
}
@@ -216,7 +208,10 @@ impl<'b> Resolver<'b> {
216
208
} ) ;
217
209
self . define ( parent, name, TypeNS , ( module, sp, vis) ) ;
218
210
self . module_map . insert ( item. id , module) ;
219
- * parent_ref = module;
211
+
212
+ // Descend into the module.
213
+ self . current_module = module;
214
+ self . current_vis = ty:: Visibility :: Restricted ( item. id ) ;
220
215
}
221
216
222
217
ItemKind :: ForeignMod ( ..) => { }
@@ -309,6 +304,10 @@ impl<'b> Resolver<'b> {
309
304
}
310
305
ItemKind :: Mac ( _) => panic ! ( "unexpanded macro in resolve!" ) ,
311
306
}
307
+
308
+ visit:: walk_item ( & mut BuildReducedGraphVisitor { resolver : self } , item) ;
309
+ self . current_module = parent;
310
+ self . current_vis = parent_vis;
312
311
}
313
312
314
313
// Constructs the reduced graph for one variant. Variants exist in the
@@ -333,9 +332,8 @@ impl<'b> Resolver<'b> {
333
332
}
334
333
335
334
/// Constructs the reduced graph for one foreign item.
336
- fn build_reduced_graph_for_foreign_item ( & mut self ,
337
- foreign_item : & ForeignItem ,
338
- parent : Module < ' b > ) {
335
+ fn build_reduced_graph_for_foreign_item ( & mut self , foreign_item : & ForeignItem ) {
336
+ let parent = self . current_module ;
339
337
let name = foreign_item. ident . name ;
340
338
341
339
let def = match foreign_item. node {
@@ -346,12 +344,12 @@ impl<'b> Resolver<'b> {
346
344
Def :: Static ( self . definitions . local_def_id ( foreign_item. id ) , m)
347
345
}
348
346
} ;
349
- self . current_module = parent;
350
347
let vis = self . resolve_visibility ( & foreign_item. vis ) ;
351
348
self . define ( parent, name, ValueNS , ( def, foreign_item. span , vis) ) ;
352
349
}
353
350
354
- fn build_reduced_graph_for_block ( & mut self , block : & Block , parent : & mut Module < ' b > ) {
351
+ fn build_reduced_graph_for_block ( & mut self , block : & Block ) {
352
+ let parent = self . current_module ;
355
353
if self . block_needs_anonymous_module ( block) {
356
354
let block_id = block. id ;
357
355
@@ -362,8 +360,11 @@ impl<'b> Resolver<'b> {
362
360
let parent_link = BlockParentLink ( parent, block_id) ;
363
361
let new_module = self . new_module ( parent_link, None , false ) ;
364
362
self . module_map . insert ( block_id, new_module) ;
365
- * parent = new_module;
363
+ self . current_module = new_module; // Descend into the block.
366
364
}
365
+
366
+ visit:: walk_block ( & mut BuildReducedGraphVisitor { resolver : self } , block) ;
367
+ self . current_module = parent;
367
368
}
368
369
369
370
/// Builds the reduced graph for a single item in an external crate.
@@ -487,25 +488,18 @@ impl<'b> Resolver<'b> {
487
488
488
489
struct BuildReducedGraphVisitor < ' a , ' b : ' a > {
489
490
resolver : & ' a mut Resolver < ' b > ,
490
- parent : Module < ' b > ,
491
491
}
492
492
493
493
impl < ' a , ' b > Visitor for BuildReducedGraphVisitor < ' a , ' b > {
494
494
fn visit_item ( & mut self , item : & Item ) {
495
- let old_parent = self . parent ;
496
- self . resolver . build_reduced_graph_for_item ( item, & mut self . parent ) ;
497
- visit:: walk_item ( self , item) ;
498
- self . parent = old_parent;
495
+ self . resolver . build_reduced_graph_for_item ( item) ;
499
496
}
500
497
501
498
fn visit_foreign_item ( & mut self , foreign_item : & ForeignItem ) {
502
- self . resolver . build_reduced_graph_for_foreign_item ( foreign_item, & self . parent ) ;
499
+ self . resolver . build_reduced_graph_for_foreign_item ( foreign_item) ;
503
500
}
504
501
505
502
fn visit_block ( & mut self , block : & Block ) {
506
- let old_parent = self . parent ;
507
- self . resolver . build_reduced_graph_for_block ( block, & mut self . parent ) ;
508
- visit:: walk_block ( self , block) ;
509
- self . parent = old_parent;
503
+ self . resolver . build_reduced_graph_for_block ( block) ;
510
504
}
511
505
}
0 commit comments