about summary refs log tree commit diff
diff options
context:
space:
mode:
authorCldfire <cldfire@3grid.net>2017-10-31 13:31:48 -0400
committerCldfire <cldfire@3grid.net>2017-10-31 13:31:48 -0400
commitff832405d07d6c34ee060e26acf0aa6143b79d3f (patch)
tree0ec6a276f609a3d40e05a34f484322b194f720f0
parent6713736275181abb3304730603afd785b0470ae3 (diff)
downloadrust-ff832405d07d6c34ee060e26acf0aa6143b79d3f.tar.gz
rust-ff832405d07d6c34ee060e26acf0aa6143b79d3f.zip
Suggest renaming import if names clash
-rw-r--r--src/librustc_resolve/lib.rs26
1 files changed, 23 insertions, 3 deletions
diff --git a/src/librustc_resolve/lib.rs b/src/librustc_resolve/lib.rs
index 83eeaf551c5..3b27890013a 100644
--- a/src/librustc_resolve/lib.rs
+++ b/src/librustc_resolve/lib.rs
@@ -3606,12 +3606,12 @@ impl<'a> Resolver<'a> {
         }
     }
 
-    fn report_conflict(&mut self,
+    fn report_conflict<'b>(&mut self,
                        parent: Module,
                        ident: Ident,
                        ns: Namespace,
-                       new_binding: &NameBinding,
-                       old_binding: &NameBinding) {
+                       new_binding: &NameBinding<'b>,
+                       old_binding: &NameBinding<'b>) {
         // Error on the second of two conflicting names
         if old_binding.span.lo() > new_binding.span.lo() {
             return self.report_conflict(parent, ident, ns, old_binding, new_binding);
@@ -3683,6 +3683,26 @@ impl<'a> Resolver<'a> {
                                                       old_noun, old_kind, name));
         }
 
+        // 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
+            } else {
+                old_binding
+            };
+
+            let cm = self.session.codemap();
+            let rename_msg = "You can use `as` to change the binding name of the import";
+
+            if let Ok(snippet) = cm.span_to_snippet(binding.span) {
+                err.span_suggestion(binding.span,
+                                    rename_msg,
+                                    format!("{} as Other{}", snippet, name));
+            } else {
+                err.span_label(binding.span, rename_msg);
+            }
+        }
+
         err.emit();
         self.name_already_seen.insert(name, span);
     }