From 7d527159457420d55f1ee2f70615098a10176b91 Mon Sep 17 00:00:00 2001 From: zombiefungus Date: Thu, 30 Jan 2020 23:14:20 -0500 Subject: add new ImportAlias enum to differentiate no alias from an _ alias --- crates/ra_hir_def/src/nameres/collector.rs | 5 ++++- crates/ra_hir_def/src/nameres/raw.rs | 15 +++++++++++++-- crates/ra_hir_def/src/path.rs | 7 ++++++- crates/ra_hir_def/src/path/lower/lower_use.rs | 14 +++++++------- 4 files changed, 30 insertions(+), 11 deletions(-) (limited to 'crates') diff --git a/crates/ra_hir_def/src/nameres/collector.rs b/crates/ra_hir_def/src/nameres/collector.rs index 7499dff31..193067f73 100644 --- a/crates/ra_hir_def/src/nameres/collector.rs +++ b/crates/ra_hir_def/src/nameres/collector.rs @@ -438,7 +438,10 @@ where } else { match import.path.segments.last() { Some(last_segment) => { - let name = import.alias.clone().unwrap_or_else(|| last_segment.clone()); + let name = match &import.alias { + raw::ImportAlias::Alias(name) => name.clone(), + _ => last_segment.clone(), // "use as ;" and "use as _;" are treated the same way + }; log::debug!("resolved import {:?} ({:?}) to {:?}", name, import, def); // extern crates in the crate root are special-cased to insert entries into the extern prelude: rust-lang/rust#54658 diff --git a/crates/ra_hir_def/src/nameres/raw.rs b/crates/ra_hir_def/src/nameres/raw.rs index fac1169ef..f068b4d4e 100644 --- a/crates/ra_hir_def/src/nameres/raw.rs +++ b/crates/ra_hir_def/src/nameres/raw.rs @@ -145,7 +145,7 @@ impl_arena_id!(Import); #[derive(Debug, Clone, PartialEq, Eq)] pub struct ImportData { pub(super) path: ModPath, - pub(super) alias: Option, + pub(super) alias: ImportAlias, pub(super) is_glob: bool, pub(super) is_prelude: bool, pub(super) is_extern_crate: bool, @@ -153,6 +153,13 @@ pub struct ImportData { pub(super) visibility: RawVisibility, } +#[derive(Debug, Clone, PartialEq, Eq)] +pub enum ImportAlias { + NoAlias, + Unnamed, // use Foo as _; + Alias(Name), +} + #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] pub(super) struct Def(RawId); impl_arena_id!(Def); @@ -353,7 +360,11 @@ impl RawItemsCollector { let path = ModPath::from_name_ref(&name_ref); let visibility = RawVisibility::from_ast_with_hygiene(extern_crate.visibility(), &self.hygiene); - let alias = extern_crate.alias().and_then(|a| a.name()).map(|it| it.as_name()); + let alias = extern_crate.alias().map_or(ImportAlias::NoAlias, |a| { + a.name() + .map(|it| it.as_name()) + .map_or(ImportAlias::Unnamed, |a| ImportAlias::Alias(a)) + }); let attrs = self.parse_attrs(&extern_crate); // FIXME: cfg_attr let is_macro_use = extern_crate.has_atom_attr("macro_use"); diff --git a/crates/ra_hir_def/src/path.rs b/crates/ra_hir_def/src/path.rs index ab290e2c9..27ccf6643 100644 --- a/crates/ra_hir_def/src/path.rs +++ b/crates/ra_hir_def/src/path.rs @@ -57,7 +57,12 @@ impl ModPath { pub(crate) fn expand_use_item( item_src: InFile, hygiene: &Hygiene, - mut cb: impl FnMut(ModPath, &ast::UseTree, /* is_glob */ bool, Option), + mut cb: impl FnMut( + ModPath, + &ast::UseTree, + /* is_glob */ bool, + crate::nameres::raw::ImportAlias, + ), ) { if let Some(tree) = item_src.value.use_tree() { lower::lower_use_tree(None, tree, hygiene, &mut cb); diff --git a/crates/ra_hir_def/src/path/lower/lower_use.rs b/crates/ra_hir_def/src/path/lower/lower_use.rs index 531878174..f693cefbc 100644 --- a/crates/ra_hir_def/src/path/lower/lower_use.rs +++ b/crates/ra_hir_def/src/path/lower/lower_use.rs @@ -4,20 +4,18 @@ use std::iter; use either::Either; -use hir_expand::{ - hygiene::Hygiene, - name::{AsName, Name}, -}; +use hir_expand::{hygiene::Hygiene, name::AsName}; use ra_syntax::ast::{self, NameOwner}; use test_utils::tested_by; +use crate::nameres::raw::ImportAlias; use crate::path::{ModPath, PathKind}; pub(crate) fn lower_use_tree( prefix: Option, tree: ast::UseTree, hygiene: &Hygiene, - cb: &mut dyn FnMut(ModPath, &ast::UseTree, bool, Option), + cb: &mut dyn FnMut(ModPath, &ast::UseTree, bool, ImportAlias), ) { if let Some(use_tree_list) = tree.use_tree_list() { let prefix = match tree.path() { @@ -34,7 +32,9 @@ pub(crate) fn lower_use_tree( lower_use_tree(prefix.clone(), child_tree, hygiene, cb); } } else { - let alias = tree.alias().and_then(|a| a.name()).map(|a| a.as_name()); + let alias = tree.alias().map_or(ImportAlias::NoAlias, |a| { + a.name().map(|it| it.as_name()).map_or(ImportAlias::Unnamed, |a| ImportAlias::Alias(a)) + }); let is_glob = tree.has_star(); if let Some(ast_path) = tree.path() { // Handle self in a path. @@ -57,7 +57,7 @@ pub(crate) fn lower_use_tree( } else if is_glob { tested_by!(glob_enum_group); if let Some(prefix) = prefix { - cb(prefix, &tree, is_glob, None) + cb(prefix, &tree, is_glob, ImportAlias::NoAlias) } } } -- cgit v1.2.3 From f4f71e361ee632a7a09b633934a9c0a11f4a9be7 Mon Sep 17 00:00:00 2001 From: zombiefungus Date: Sun, 2 Feb 2020 08:04:06 -0500 Subject: include requested changes --- crates/ra_hir_def/src/nameres/collector.rs | 7 ++++--- crates/ra_hir_def/src/nameres/raw.rs | 20 ++++++++------------ crates/ra_hir_def/src/path.rs | 15 +++++++++------ crates/ra_hir_def/src/path/lower/lower_use.rs | 13 +++++++------ 4 files changed, 28 insertions(+), 27 deletions(-) (limited to 'crates') diff --git a/crates/ra_hir_def/src/nameres/collector.rs b/crates/ra_hir_def/src/nameres/collector.rs index 193067f73..6352c71ef 100644 --- a/crates/ra_hir_def/src/nameres/collector.rs +++ b/crates/ra_hir_def/src/nameres/collector.rs @@ -22,7 +22,7 @@ use crate::{ diagnostics::DefDiagnostic, mod_resolution::ModDir, path_resolution::ReachedFixedPoint, raw, BuiltinShadowMode, CrateDefMap, ModuleData, ModuleOrigin, ResolveMode, }, - path::{ModPath, PathKind}, + path::{ImportAlias, ModPath, PathKind}, per_ns::PerNs, visibility::Visibility, AdtId, AstId, ConstLoc, ContainerId, EnumLoc, EnumVariantId, FunctionLoc, ImplLoc, Intern, @@ -439,8 +439,9 @@ where match import.path.segments.last() { Some(last_segment) => { let name = match &import.alias { - raw::ImportAlias::Alias(name) => name.clone(), - _ => last_segment.clone(), // "use as ;" and "use as _;" are treated the same way + Some(ImportAlias::Alias(name)) => name.clone(), + Some(ImportAlias::Underscore) => last_segment.clone(), // FIXME rust-analyzer#2736 + None => last_segment.clone(), }; log::debug!("resolved import {:?} ({:?}) to {:?}", name, import, def); diff --git a/crates/ra_hir_def/src/nameres/raw.rs b/crates/ra_hir_def/src/nameres/raw.rs index f068b4d4e..650cf1f98 100644 --- a/crates/ra_hir_def/src/nameres/raw.rs +++ b/crates/ra_hir_def/src/nameres/raw.rs @@ -22,8 +22,11 @@ use ra_syntax::{ use test_utils::tested_by; use crate::{ - attr::Attrs, db::DefDatabase, path::ModPath, visibility::RawVisibility, FileAstId, HirFileId, - InFile, + attr::Attrs, + db::DefDatabase, + path::{ImportAlias, ModPath}, + visibility::RawVisibility, + FileAstId, HirFileId, InFile, }; /// `RawItems` is a set of top-level items in a file (except for impls). @@ -145,7 +148,7 @@ impl_arena_id!(Import); #[derive(Debug, Clone, PartialEq, Eq)] pub struct ImportData { pub(super) path: ModPath, - pub(super) alias: ImportAlias, + pub(super) alias: Option, pub(super) is_glob: bool, pub(super) is_prelude: bool, pub(super) is_extern_crate: bool, @@ -153,13 +156,6 @@ pub struct ImportData { pub(super) visibility: RawVisibility, } -#[derive(Debug, Clone, PartialEq, Eq)] -pub enum ImportAlias { - NoAlias, - Unnamed, // use Foo as _; - Alias(Name), -} - #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] pub(super) struct Def(RawId); impl_arena_id!(Def); @@ -360,10 +356,10 @@ impl RawItemsCollector { let path = ModPath::from_name_ref(&name_ref); let visibility = RawVisibility::from_ast_with_hygiene(extern_crate.visibility(), &self.hygiene); - let alias = extern_crate.alias().map_or(ImportAlias::NoAlias, |a| { + let alias = extern_crate.alias().map(|a| { a.name() .map(|it| it.as_name()) - .map_or(ImportAlias::Unnamed, |a| ImportAlias::Alias(a)) + .map_or(ImportAlias::Underscore, |a| ImportAlias::Alias(a)) }); let attrs = self.parse_attrs(&extern_crate); // FIXME: cfg_attr diff --git a/crates/ra_hir_def/src/path.rs b/crates/ra_hir_def/src/path.rs index 27ccf6643..fb7692191 100644 --- a/crates/ra_hir_def/src/path.rs +++ b/crates/ra_hir_def/src/path.rs @@ -34,6 +34,14 @@ pub enum PathKind { DollarCrate(CrateId), } +#[derive(Debug, Clone, PartialEq, Eq)] +pub enum ImportAlias { + /// Unnamed alias, as in `use Foo as _;` + Underscore, + /// Named alias + Alias(Name), +} + impl ModPath { pub fn from_src(path: ast::Path, hygiene: &Hygiene) -> Option { lower::lower_path(path, hygiene).map(|it| it.mod_path) @@ -57,12 +65,7 @@ impl ModPath { pub(crate) fn expand_use_item( item_src: InFile, hygiene: &Hygiene, - mut cb: impl FnMut( - ModPath, - &ast::UseTree, - /* is_glob */ bool, - crate::nameres::raw::ImportAlias, - ), + mut cb: impl FnMut(ModPath, &ast::UseTree, /* is_glob */ bool, Option), ) { if let Some(tree) = item_src.value.use_tree() { lower::lower_use_tree(None, tree, hygiene, &mut cb); diff --git a/crates/ra_hir_def/src/path/lower/lower_use.rs b/crates/ra_hir_def/src/path/lower/lower_use.rs index f693cefbc..d2bc9d193 100644 --- a/crates/ra_hir_def/src/path/lower/lower_use.rs +++ b/crates/ra_hir_def/src/path/lower/lower_use.rs @@ -8,14 +8,13 @@ use hir_expand::{hygiene::Hygiene, name::AsName}; use ra_syntax::ast::{self, NameOwner}; use test_utils::tested_by; -use crate::nameres::raw::ImportAlias; -use crate::path::{ModPath, PathKind}; +use crate::path::{ImportAlias, ModPath, PathKind}; pub(crate) fn lower_use_tree( prefix: Option, tree: ast::UseTree, hygiene: &Hygiene, - cb: &mut dyn FnMut(ModPath, &ast::UseTree, bool, ImportAlias), + cb: &mut dyn FnMut(ModPath, &ast::UseTree, bool, Option), ) { if let Some(use_tree_list) = tree.use_tree_list() { let prefix = match tree.path() { @@ -32,8 +31,10 @@ pub(crate) fn lower_use_tree( lower_use_tree(prefix.clone(), child_tree, hygiene, cb); } } else { - let alias = tree.alias().map_or(ImportAlias::NoAlias, |a| { - a.name().map(|it| it.as_name()).map_or(ImportAlias::Unnamed, |a| ImportAlias::Alias(a)) + let alias = tree.alias().map(|a| { + a.name() + .map(|it| it.as_name()) + .map_or(ImportAlias::Underscore, |a| ImportAlias::Alias(a)) }); let is_glob = tree.has_star(); if let Some(ast_path) = tree.path() { @@ -57,7 +58,7 @@ pub(crate) fn lower_use_tree( } else if is_glob { tested_by!(glob_enum_group); if let Some(prefix) = prefix { - cb(prefix, &tree, is_glob, ImportAlias::NoAlias) + cb(prefix, &tree, is_glob, None) } } } -- cgit v1.2.3