Make populate_module_if_necessary a method of resolver

This commit is contained in:
Jeffrey Seyfried 2016-03-02 09:18:47 +00:00
parent 77f0f4a624
commit 0bed9aea2d
3 changed files with 16 additions and 20 deletions

View File

@ -532,16 +532,6 @@ impl<'a, 'b:'a, 'tcx:'b> GraphBuilder<'a, 'b, 'tcx> {
}
}
/// Ensures that the reduced graph rooted at the given external module
/// is built, building it if it is not.
fn populate_module_if_necessary(&mut self, module: Module<'b>) {
if module.populated.get() { return }
for child in self.session.cstore.item_children(module.def_id().unwrap()) {
self.build_reduced_graph_for_external_crate_def(module, child);
}
module.populated.set(true)
}
/// Builds the reduced graph rooted at the 'use' directive for an external
/// crate.
fn build_reduced_graph_for_external_crate(&mut self, root: Module<'b>) {
@ -585,6 +575,19 @@ impl<'a, 'b:'a, 'tcx:'b> GraphBuilder<'a, 'b, 'tcx> {
}
}
impl<'a, 'tcx> Resolver<'a, 'tcx> {
/// Ensures that the reduced graph rooted at the given external module
/// is built, building it if it is not.
pub fn populate_module_if_necessary(&mut self, module: Module<'a>) {
if module.populated.get() { return }
let mut builder = GraphBuilder { resolver: self };
for child in self.session.cstore.item_children(module.def_id().unwrap()) {
builder.build_reduced_graph_for_external_crate_def(module, child);
}
module.populated.set(true)
}
}
struct BuildReducedGraphVisitor<'a, 'b: 'a, 'tcx: 'b> {
builder: GraphBuilder<'a, 'b, 'tcx>,
parent: Module<'b>,
@ -617,8 +620,3 @@ impl<'a, 'b, 'v, 'tcx> Visitor<'v> for BuildReducedGraphVisitor<'a, 'b, 'tcx> {
pub fn build_reduced_graph(resolver: &mut Resolver, krate: &hir::Crate) {
GraphBuilder { resolver: resolver }.build_reduced_graph(krate);
}
pub fn populate_module_if_necessary<'a, 'tcx>(resolver: &mut Resolver<'a, 'tcx>,
module: Module<'a>) {
GraphBuilder { resolver: resolver }.populate_module_if_necessary(module);
}

View File

@ -1542,7 +1542,7 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
-> ResolveResult<&'a NameBinding<'a>> {
debug!("(resolving name in module) resolving `{}` in `{}`", name, module_to_string(module));
build_reduced_graph::populate_module_if_necessary(self, module);
self.populate_module_if_necessary(module);
match use_lexical_scope {
true => module.resolve_name_in_lexical_scope(name, namespace)
.map(Success).unwrap_or(Failed(None)),
@ -3363,7 +3363,7 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
while let Some((in_module,
path_segments,
in_module_is_extern)) = worklist.pop() {
build_reduced_graph::populate_module_if_necessary(self, &in_module);
self.populate_module_if_necessary(in_module);
in_module.for_each_child(|name, ns, name_binding| {

View File

@ -21,8 +21,6 @@ use UseLexicalScopeFlag;
use {names_to_string, module_to_string};
use {resolve_error, ResolutionError};
use build_reduced_graph;
use rustc::lint;
use rustc::middle::def::*;
@ -610,7 +608,7 @@ impl<'a, 'b:'a, 'tcx:'b> ImportResolver<'a, 'b, 'tcx> {
let msg = "Cannot glob-import a module into itself.".into();
return Failed(Some((directive.span, msg)));
}
build_reduced_graph::populate_module_if_necessary(self.resolver, target_module);
self.resolver.populate_module_if_necessary(target_module);
if directive.is_prelude {
*module_.prelude.borrow_mut() = Some(target_module);