target: binding,
source: source,
result: self.per_ns(|_, _| Cell::new(Err(Undetermined))),
+ type_ns_only: false,
};
self.add_import_directive(
module_path, subclass, view_path.span, item.id, vis, expansion,
for source_item in source_items {
let node = source_item.node;
- let (module_path, ident, rename) = {
+ let (module_path, ident, rename, type_ns_only) = {
if node.name.name != keywords::SelfValue.name() {
let rename = node.rename.unwrap_or(node.name);
- (module_path.clone(), node.name, rename)
+ (module_path.clone(), node.name, rename, false)
} else {
let ident = *module_path.last().unwrap();
if ident.name == keywords::CrateRoot.name() {
}
let module_path = module_path.split_last().unwrap().1;
let rename = node.rename.unwrap_or(ident);
- (module_path.to_vec(), ident, rename)
+ (module_path.to_vec(), ident, rename, true)
}
};
let subclass = SingleImport {
target: rename,
source: ident,
result: self.per_ns(|_, _| Cell::new(Err(Undetermined))),
+ type_ns_only: type_ns_only,
};
let id = source_item.node.id;
self.add_import_directive(
target: Ident,
source: Ident,
result: PerNS<Cell<Result<&'a NameBinding<'a>, Determinacy>>>,
+ type_ns_only: bool,
},
GlobImport {
is_prelude: bool,
};
directive.imported_module.set(Some(module));
- let (source, target, result) = match directive.subclass {
- SingleImport { source, target, ref result } => (source, target, result),
+ let (source, target, result, type_ns_only) = match directive.subclass {
+ SingleImport { source, target, ref result, type_ns_only } =>
+ (source, target, result, type_ns_only),
GlobImport { .. } => {
self.resolve_glob_import(directive);
return true;
};
let mut indeterminate = false;
- self.per_ns(|this, ns| {
+ self.per_ns(|this, ns| if !type_ns_only || ns == TypeNS {
if let Err(Undetermined) = result[ns].get() {
result[ns].set(this.resolve_ident_in_module(module, source, ns, false, None));
} else {
_ => return None,
};
- let (ident, result) = match directive.subclass {
- SingleImport { source, ref result, .. } => (source, result),
+ let (ident, result, type_ns_only) = match directive.subclass {
+ SingleImport { source, ref result, type_ns_only, .. } => (source, result, type_ns_only),
GlobImport { .. } if module.def_id() == directive.parent.def_id() => {
// Importing a module into itself is not allowed.
return Some("Cannot glob-import a module into itself.".to_string());
};
let mut all_ns_err = true;
- self.per_ns(|this, ns| {
+ self.per_ns(|this, ns| if !type_ns_only || ns == TypeNS {
if let Ok(binding) = result[ns].get() {
all_ns_err = false;
if this.record_use(ident, ns, binding, directive.span) {
if all_ns_err {
let mut all_ns_failed = true;
- self.per_ns(|this, ns| {
+ self.per_ns(|this, ns| if !type_ns_only || ns == TypeNS {
match this.resolve_ident_in_module(module, ident, ns, false, Some(span)) {
Ok(_) => all_ns_failed = false,
_ => {}
--- /dev/null
+// Copyright 2016 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+// Test that `fn foo::bar::{self}` only imports `bar` in the type namespace.
+
+mod foo {
+ pub fn f() { }
+}
+use foo::f::{self};
+//~^ ERROR unresolved import
+//~| NOTE no `f` in `foo`
+
+mod bar {
+ pub fn baz() {}
+ pub mod baz {}
+}
+use bar::baz::{self};
+
+fn main() {
+ baz();
+ //~^ ERROR unresolved name `baz`
+ //~| NOTE unresolved name
+ //~| HELP module `baz` cannot be used as an expression
+}