Skip to content

Commit 1576de0

Browse files
authored
Auto merge of #35776 - jseyfried:more_groundwork, r=nrc
resolve: More groundwork for `item_like_imports` (RFC 1560) r? @nrc
2 parents 4901896 + a6e8f3b commit 1576de0

File tree

5 files changed

+379
-405
lines changed

5 files changed

+379
-405
lines changed

src/librustc_resolve/build_reduced_graph.rs

+26-32
Original file line numberDiff line numberDiff line change
@@ -56,12 +56,7 @@ impl<'b> Resolver<'b> {
5656
pub fn build_reduced_graph(&mut self, krate: &Crate) {
5757
let no_implicit_prelude = attr::contains_name(&krate.attrs, "no_implicit_prelude");
5858
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);
6560
}
6661

6762
/// 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> {
8479
}
8580

8681
/// 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;
8985
let name = item.ident.name;
9086
let sp = item.span;
91-
self.current_module = parent;
9287
let vis = self.resolve_visibility(&item.vis);
9388

9489
match item.node {
@@ -130,8 +125,7 @@ impl<'b> Resolver<'b> {
130125

131126
let subclass = ImportDirectiveSubclass::single(binding.name, source_name);
132127
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);
135129
}
136130
ViewPathList(_, ref source_items) => {
137131
// Make sure there's at most one `mod` import in the list.
@@ -176,15 +170,13 @@ impl<'b> Resolver<'b> {
176170
};
177171
let subclass = ImportDirectiveSubclass::single(rename, name);
178172
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);
181174
}
182175
}
183176
ViewPathGlob(_) => {
184177
let subclass = GlobImport { is_prelude: is_prelude };
185178
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);
188180
}
189181
}
190182
}
@@ -216,7 +208,10 @@ impl<'b> Resolver<'b> {
216208
});
217209
self.define(parent, name, TypeNS, (module, sp, vis));
218210
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);
220215
}
221216

222217
ItemKind::ForeignMod(..) => {}
@@ -309,6 +304,10 @@ impl<'b> Resolver<'b> {
309304
}
310305
ItemKind::Mac(_) => panic!("unexpanded macro in resolve!"),
311306
}
307+
308+
visit::walk_item(&mut BuildReducedGraphVisitor { resolver: self }, item);
309+
self.current_module = parent;
310+
self.current_vis = parent_vis;
312311
}
313312

314313
// Constructs the reduced graph for one variant. Variants exist in the
@@ -333,9 +332,8 @@ impl<'b> Resolver<'b> {
333332
}
334333

335334
/// 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;
339337
let name = foreign_item.ident.name;
340338

341339
let def = match foreign_item.node {
@@ -346,12 +344,12 @@ impl<'b> Resolver<'b> {
346344
Def::Static(self.definitions.local_def_id(foreign_item.id), m)
347345
}
348346
};
349-
self.current_module = parent;
350347
let vis = self.resolve_visibility(&foreign_item.vis);
351348
self.define(parent, name, ValueNS, (def, foreign_item.span, vis));
352349
}
353350

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;
355353
if self.block_needs_anonymous_module(block) {
356354
let block_id = block.id;
357355

@@ -362,8 +360,11 @@ impl<'b> Resolver<'b> {
362360
let parent_link = BlockParentLink(parent, block_id);
363361
let new_module = self.new_module(parent_link, None, false);
364362
self.module_map.insert(block_id, new_module);
365-
*parent = new_module;
363+
self.current_module = new_module; // Descend into the block.
366364
}
365+
366+
visit::walk_block(&mut BuildReducedGraphVisitor { resolver: self }, block);
367+
self.current_module = parent;
367368
}
368369

369370
/// Builds the reduced graph for a single item in an external crate.
@@ -487,25 +488,18 @@ impl<'b> Resolver<'b> {
487488

488489
struct BuildReducedGraphVisitor<'a, 'b: 'a> {
489490
resolver: &'a mut Resolver<'b>,
490-
parent: Module<'b>,
491491
}
492492

493493
impl<'a, 'b> Visitor for BuildReducedGraphVisitor<'a, 'b> {
494494
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);
499496
}
500497

501498
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);
503500
}
504501

505502
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);
510504
}
511505
}

0 commit comments

Comments
 (0)