From 54cd4d1472508af604e2fed328951dd5c622ecbc Mon Sep 17 00:00:00 2001 From: Jeffrey Seyfried Date: Wed, 9 Mar 2016 04:21:54 +0000 Subject: [PATCH] Add and use `resolve_name_in_lexical_scope` and exclude the prelude from `resolve_name(.., allow_private_imports = true)`. --- src/librustc_resolve/lib.rs | 15 ++++++++++----- src/librustc_resolve/resolve_imports.rs | 12 ++++++++++-- 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/src/librustc_resolve/lib.rs b/src/librustc_resolve/lib.rs index 763fa32795d..77fdc657b88 100644 --- a/src/librustc_resolve/lib.rs +++ b/src/librustc_resolve/lib.rs @@ -349,7 +349,8 @@ fn resolve_struct_error<'b, 'a: 'b, 'tcx: 'a>(resolver: &'b Resolver<'a, 'tcx>, if let Some(sp) = resolver.ast_map.span_if_local(did) { err.span_note(sp, "constant defined here"); } - if let Success(binding) = resolver.current_module.resolve_name(name, ValueNS, true) { + if let Some(binding) = resolver.current_module + .resolve_name_in_lexical_scope(name, ValueNS) { if binding.is_import() { err.span_note(binding.span.unwrap(), "constant imported here"); } @@ -1536,13 +1537,17 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> { module: Module<'a>, name: Name, namespace: Namespace, - allow_private_imports: bool, + use_lexical_scope: bool, record_used: bool) -> 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); - module.resolve_name(name, namespace, allow_private_imports).and_then(|binding| { + match use_lexical_scope { + true => module.resolve_name_in_lexical_scope(name, namespace) + .map(Success).unwrap_or(Failed(None)), + false => module.resolve_name(name, namespace, false), + }.and_then(|binding| { if record_used { self.record_use(name, namespace, binding); } @@ -2961,7 +2966,7 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> { if name_path.len() == 1 { match this.primitive_type_table.primitive_types.get(last_name) { Some(_) => None, - None => this.current_module.resolve_name(*last_name, TypeNS, true).success() + None => this.current_module.resolve_name_in_lexical_scope(*last_name, TypeNS) .and_then(NameBinding::module) } } else { @@ -3018,7 +3023,7 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> { // Look for a method in the current self type's impl module. if let Some(module) = get_module(self, path.span, &name_path) { - if let Success(binding) = module.resolve_name(name, ValueNS, true) { + if let Some(binding) = module.resolve_name_in_lexical_scope(name, ValueNS) { if let Some(Def::Method(did)) = binding.def() { if is_static_method(self, did) { return StaticMethod(path_names_to_string(&path, 0)); diff --git a/src/librustc_resolve/resolve_imports.rs b/src/librustc_resolve/resolve_imports.rs index 3e7a709345c..3af5031cc47 100644 --- a/src/librustc_resolve/resolve_imports.rs +++ b/src/librustc_resolve/resolve_imports.rs @@ -239,8 +239,16 @@ impl<'a> ::ModuleS<'a> { } } - self.prelude.borrow().map(|prelude| prelude.resolve_name(name, ns, false)) - .unwrap_or(Failed(None)) + Failed(None) + } + + // Invariant: this may not be called until import resolution is complete. + pub fn resolve_name_in_lexical_scope(&self, name: Name, ns: Namespace) + -> Option<&'a NameBinding<'a>> { + self.resolutions.borrow().get(&(name, ns)).and_then(|resolution| resolution.binding) + .or_else(|| self.prelude.borrow().and_then(|prelude| { + prelude.resolve_name(name, ns, false).success() + })) } // Define the name or return the existing binding if there is a collision.