about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorVadim Petrochenkov <vadim.petrochenkov@gmail.com>2019-01-26 00:36:50 +0300
committerVadim Petrochenkov <vadim.petrochenkov@gmail.com>2019-01-26 01:49:55 +0300
commit1b659d69bc0ba7fe534cc26bda8544a558a7d2b2 (patch)
treec702f5a45edc951a503130163b89f4f1f1fcb0ad /src
parentac4b685650d1ba0a38806ce8f7cbf12e7a00f573 (diff)
downloadrust-1b659d69bc0ba7fe534cc26bda8544a558a7d2b2.tar.gz
rust-1b659d69bc0ba7fe534cc26bda8544a558a7d2b2.zip
Address review comments and cleanup code
Diffstat (limited to 'src')
-rw-r--r--src/librustc_resolve/lib.rs93
-rw-r--r--src/test/ui/issues/issue-56411.rs6
-rw-r--r--src/test/ui/issues/issue-56411.stderr22
-rw-r--r--src/test/ui/issues/issue_56411_aux.rs (renamed from src/test/ui/issues/issue_56411.rs)0
4 files changed, 59 insertions, 62 deletions
diff --git a/src/librustc_resolve/lib.rs b/src/librustc_resolve/lib.rs
index 8dd09076a00..873ace90172 100644
--- a/src/librustc_resolve/lib.rs
+++ b/src/librustc_resolve/lib.rs
@@ -5134,62 +5134,59 @@ impl<'a> Resolver<'a> {
         );
 
         // See https://github.com/rust-lang/rust/issues/32354
-        if old_binding.is_import() || new_binding.is_import() {
-            let binding = if new_binding.is_import() && !new_binding.span.is_dummy() {
-                new_binding
+        let directive = match (&new_binding.kind, &old_binding.kind) {
+            (NameBindingKind::Import { directive, .. }, _) if !new_binding.span.is_dummy() =>
+                Some((directive, new_binding.span)),
+            (_, NameBindingKind::Import { directive, .. }) if !old_binding.span.is_dummy() =>
+                Some((directive, old_binding.span)),
+            _ => None,
+        };
+        if let Some((directive, binding_span)) = directive {
+            let suggested_name = if name.as_str().chars().next().unwrap().is_uppercase() {
+                format!("Other{}", name)
             } else {
-                old_binding
+                format!("other_{}", name)
             };
 
-            let cm = self.session.source_map();
-            let rename_msg = "you can use `as` to change the binding name of the import";
-
-            if let (
-                Ok(snippet),
-                NameBindingKind::Import { directive, ..},
-                false,
-                false,
-            ) = (
-                cm.span_to_snippet(binding.span),
-                binding.kind.clone(),
-                binding.span.is_dummy(),
-                binding.span.ctxt().outer().expn_info().is_some(),
-            ) {
-                let suggested_name = if name.as_str().chars().next().unwrap().is_uppercase() {
-                    format!("Other{}", name)
-                } else {
-                    format!("other_{}", name)
-                };
+            let mut suggestion = None;
+            match directive.subclass {
+                ImportDirectiveSubclass::SingleImport { type_ns_only: true, .. } =>
+                    suggestion = Some(format!("self as {}", suggested_name)),
+                ImportDirectiveSubclass::SingleImport { source, .. } => {
+                    if let Some(pos) = source.span.hi().0.checked_sub(binding_span.lo().0)
+                                                         .map(|pos| pos as usize) {
+                        if let Ok(snippet) = self.session.source_map()
+                                                         .span_to_snippet(binding_span) {
+                            if pos <= snippet.len() {
+                                suggestion = Some(format!(
+                                    "{} as {}{}",
+                                    &snippet[..pos],
+                                    suggested_name,
+                                    if snippet.ends_with(";") { ";" } else { "" }
+                                ))
+                            }
+                        }
+                    }
+                }
+                ImportDirectiveSubclass::ExternCrate { source, target, .. } =>
+                    suggestion = Some(format!(
+                        "extern crate {} as {};",
+                        source.unwrap_or(target.name),
+                        suggested_name,
+                    )),
+                _ => unreachable!(),
+            }
 
+            let rename_msg = "you can use `as` to change the binding name of the import";
+            if let Some(suggestion) = suggestion {
                 err.span_suggestion_with_applicability(
-                    binding.span,
-                    &rename_msg,
-                    match directive.subclass {
-                        ImportDirectiveSubclass::SingleImport { type_ns_only: true, .. } =>
-                            format!("self as {}", suggested_name),
-                        ImportDirectiveSubclass::SingleImport { source, .. } =>
-                            format!(
-                                "{} as {}{}",
-                                &snippet[..((source.span.hi().0 - binding.span.lo().0) as usize)],
-                                suggested_name,
-                                if snippet.ends_with(";") {
-                                    ";"
-                                } else {
-                                    ""
-                                }
-                            ),
-                        ImportDirectiveSubclass::ExternCrate { source, target, .. } =>
-                            format!(
-                                "extern crate {} as {};",
-                                source.unwrap_or(target.name),
-                                suggested_name,
-                            ),
-                        _ => unreachable!(),
-                    },
+                    binding_span,
+                    rename_msg,
+                    suggestion,
                     Applicability::MaybeIncorrect,
                 );
             } else {
-                err.span_label(binding.span, rename_msg);
+                err.span_label(binding_span, rename_msg);
             }
         }
 
diff --git a/src/test/ui/issues/issue-56411.rs b/src/test/ui/issues/issue-56411.rs
index 599f277123c..3561c21cc7e 100644
--- a/src/test/ui/issues/issue-56411.rs
+++ b/src/test/ui/issues/issue-56411.rs
@@ -3,14 +3,14 @@ macro_rules! import {
         $(
             mod $name;
             pub use self::$name;
-            //~^ ERROR the name `issue_56411` is defined multiple times
-            //~| ERROR `issue_56411` is private, and cannot be re-exported
+            //~^ ERROR the name `issue_56411_aux` is defined multiple times
+            //~| ERROR `issue_56411_aux` is private, and cannot be re-exported
 
         )*
     }
 }
 
-import!(issue_56411);
+import!(issue_56411_aux);
 
 fn main() {
     println!("Hello, world!");
diff --git a/src/test/ui/issues/issue-56411.stderr b/src/test/ui/issues/issue-56411.stderr
index 842d86f4a3a..dd05852c091 100644
--- a/src/test/ui/issues/issue-56411.stderr
+++ b/src/test/ui/issues/issue-56411.stderr
@@ -1,29 +1,29 @@
-error[E0255]: the name `issue_56411` is defined multiple times
+error[E0255]: the name `issue_56411_aux` is defined multiple times
   --> $DIR/issue-56411.rs:5:21
    |
 LL |             mod $name;
-   |             ---------- previous definition of the module `issue_56411` here
+   |             ---------- previous definition of the module `issue_56411_aux` here
 LL |             pub use self::$name;
    |                     ^^^^^^^^^^^
    |                     |
-   |                     `issue_56411` reimported here
+   |                     `issue_56411_aux` reimported here
    |                     you can use `as` to change the binding name of the import
 ...
-LL | import!(issue_56411);
-   | --------------------- in this macro invocation
+LL | import!(issue_56411_aux);
+   | ------------------------- in this macro invocation
    |
-   = note: `issue_56411` must be defined only once in the type namespace of this module
+   = note: `issue_56411_aux` must be defined only once in the type namespace of this module
 
-error[E0365]: `issue_56411` is private, and cannot be re-exported
+error[E0365]: `issue_56411_aux` is private, and cannot be re-exported
   --> $DIR/issue-56411.rs:5:21
    |
 LL |             pub use self::$name;
-   |                     ^^^^^^^^^^^ re-export of private `issue_56411`
+   |                     ^^^^^^^^^^^ re-export of private `issue_56411_aux`
 ...
-LL | import!(issue_56411);
-   | --------------------- in this macro invocation
+LL | import!(issue_56411_aux);
+   | ------------------------- in this macro invocation
    |
-   = note: consider declaring type or module `issue_56411` with `pub`
+   = note: consider declaring type or module `issue_56411_aux` with `pub`
 
 error: aborting due to 2 previous errors
 
diff --git a/src/test/ui/issues/issue_56411.rs b/src/test/ui/issues/issue_56411_aux.rs
index bd689e913ab..bd689e913ab 100644
--- a/src/test/ui/issues/issue_56411.rs
+++ b/src/test/ui/issues/issue_56411_aux.rs