From 7d527159457420d55f1ee2f70615098a10176b91 Mon Sep 17 00:00:00 2001
From: zombiefungus <divmermarlav@gmail.com>
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<Name>,
+    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<ast::UseItem>,
         hygiene: &Hygiene,
-        mut cb: impl FnMut(ModPath, &ast::UseTree, /* is_glob */ bool, Option<Name>),
+        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<ModPath>,
     tree: ast::UseTree,
     hygiene: &Hygiene,
-    cb: &mut dyn FnMut(ModPath, &ast::UseTree, bool, Option<Name>),
+    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