]> git.lizzy.rs Git - rust.git/commitdiff
Address review comments and cleanup code
authorVadim Petrochenkov <vadim.petrochenkov@gmail.com>
Fri, 25 Jan 2019 21:36:50 +0000 (00:36 +0300)
committerVadim Petrochenkov <vadim.petrochenkov@gmail.com>
Fri, 25 Jan 2019 22:49:55 +0000 (01:49 +0300)
src/librustc_resolve/lib.rs
src/test/ui/issues/issue-56411.rs
src/test/ui/issues/issue-56411.stderr
src/test/ui/issues/issue_56411.rs [deleted file]
src/test/ui/issues/issue_56411_aux.rs [new file with mode: 0644]

index 8dd09076a00acbdf12c205982c5e04b94c72f7f4..873ace90172602f93b294b5ad075a4e4c4a500b8 100644 (file)
@@ -5134,62 +5134,59 @@ fn report_conflict<'b>(&mut self,
         );
 
         // 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);
             }
         }
 
index 599f277123cc8c3a56ab716141a2103fbaf03619..3561c21cc7ee34d4ebc8759d80d88d68691d9a2f 100644 (file)
@@ -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!");
index 842d86f4a3a9cdd96b161a521fdc776813da71aa..dd05852c091599c3521e9648677bd9fdab44336b 100644 (file)
@@ -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.rs
deleted file mode 100644 (file)
index bd689e9..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-// compile-pass
-
-struct T {}
-
-fn main() {}
diff --git a/src/test/ui/issues/issue_56411_aux.rs b/src/test/ui/issues/issue_56411_aux.rs
new file mode 100644 (file)
index 0000000..bd689e9
--- /dev/null
@@ -0,0 +1,5 @@
+// compile-pass
+
+struct T {}
+
+fn main() {}