diff options
| author | Jeffrey Seyfried <jeffrey.seyfried@gmail.com> | 2016-12-12 03:35:48 +0000 |
|---|---|---|
| committer | Jeffrey Seyfried <jeffrey.seyfried@gmail.com> | 2017-01-10 05:54:22 +0000 |
| commit | 235a7a743cc01ab0d5484e02eebe02152b368e99 (patch) | |
| tree | cd72af8b518f85614f70b406f4220f32a0c7eafc /src/librustc_resolve | |
| parent | aee21e2594c0dfe07f074be0da95c95b5b65ed50 (diff) | |
| download | rust-235a7a743cc01ab0d5484e02eebe02152b368e99.tar.gz rust-235a7a743cc01ab0d5484e02eebe02152b368e99.zip | |
Change `self` in an import list `use foo::{self, ...}` to only import a module or enum `foo`.
Diffstat (limited to 'src/librustc_resolve')
| -rw-r--r-- | src/librustc_resolve/build_reduced_graph.rs | 8 | ||||
| -rw-r--r-- | src/librustc_resolve/resolve_imports.rs | 16 |
2 files changed, 14 insertions, 10 deletions
diff --git a/src/librustc_resolve/build_reduced_graph.rs b/src/librustc_resolve/build_reduced_graph.rs index 1b3791355d2..5be21bc62c5 100644 --- a/src/librustc_resolve/build_reduced_graph.rs +++ b/src/librustc_resolve/build_reduced_graph.rs @@ -168,6 +168,7 @@ impl<'a> Resolver<'a> { 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, @@ -195,10 +196,10 @@ impl<'a> Resolver<'a> { 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() { @@ -212,13 +213,14 @@ impl<'a> Resolver<'a> { } 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( diff --git a/src/librustc_resolve/resolve_imports.rs b/src/librustc_resolve/resolve_imports.rs index 91197e53d3c..1702a1441bf 100644 --- a/src/librustc_resolve/resolve_imports.rs +++ b/src/librustc_resolve/resolve_imports.rs @@ -41,6 +41,7 @@ pub enum ImportDirectiveSubclass<'a> { target: Ident, source: Ident, result: PerNS<Cell<Result<&'a NameBinding<'a>, Determinacy>>>, + type_ns_only: bool, }, GlobImport { is_prelude: bool, @@ -503,8 +504,9 @@ impl<'a, 'b:'a> ImportResolver<'a, 'b> { }; 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; @@ -513,7 +515,7 @@ impl<'a, 'b:'a> ImportResolver<'a, 'b> { }; 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 { @@ -573,8 +575,8 @@ impl<'a, 'b:'a> ImportResolver<'a, 'b> { _ => 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()); @@ -592,7 +594,7 @@ impl<'a, 'b:'a> ImportResolver<'a, 'b> { }; 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) { @@ -604,7 +606,7 @@ impl<'a, 'b:'a> ImportResolver<'a, 'b> { 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, _ => {} |
