]> git.lizzy.rs Git - rust.git/commitdiff
Suppress suggestions for nested use tree
authorMichael Goulet <michael@errs.io>
Tue, 27 Dec 2022 04:28:02 +0000 (04:28 +0000)
committerMichael Goulet <michael@errs.io>
Tue, 27 Dec 2022 05:09:43 +0000 (05:09 +0000)
compiler/rustc_resolve/src/imports.rs
src/test/ui/imports/bad-import-in-nested.rs [new file with mode: 0644]
src/test/ui/imports/bad-import-in-nested.stderr [new file with mode: 0644]

index 4d896b055268e975ab284861e93a8c85a4e70cda..f9121ae046ad8cf5053f51ff3e2e86d624238544 100644 (file)
@@ -475,12 +475,7 @@ pub fn finalize_imports(&mut self) {
                     errors = vec![];
                 }
                 if seen_spans.insert(err.span) {
-                    let path = import_path_to_string(
-                        &import.module_path.iter().map(|seg| seg.ident).collect::<Vec<_>>(),
-                        &import.kind,
-                        err.span,
-                    );
-                    errors.push((path, err));
+                    errors.push((import, err));
                     prev_root_id = import.root_id;
                 }
             } else if is_indeterminate {
@@ -496,8 +491,10 @@ pub fn finalize_imports(&mut self) {
                     suggestion: None,
                     candidate: None,
                 };
+                // FIXME: there should be a better way of doing this than
+                // formatting this as a string then checking for `::`
                 if path.contains("::") {
-                    errors.push((path, err))
+                    errors.push((import, err))
                 }
             }
         }
@@ -507,7 +504,7 @@ pub fn finalize_imports(&mut self) {
         }
     }
 
-    fn throw_unresolved_import_error(&self, errors: Vec<(String, UnresolvedImportError)>) {
+    fn throw_unresolved_import_error(&self, errors: Vec<(&Import<'_>, UnresolvedImportError)>) {
         if errors.is_empty() {
             return;
         }
@@ -516,7 +513,17 @@ fn throw_unresolved_import_error(&self, errors: Vec<(String, UnresolvedImportErr
         const MAX_LABEL_COUNT: usize = 10;
 
         let span = MultiSpan::from_spans(errors.iter().map(|(_, err)| err.span).collect());
-        let paths = errors.iter().map(|(path, _)| format!("`{}`", path)).collect::<Vec<_>>();
+        let paths = errors
+            .iter()
+            .map(|(import, err)| {
+                let path = import_path_to_string(
+                    &import.module_path.iter().map(|seg| seg.ident).collect::<Vec<_>>(),
+                    &import.kind,
+                    err.span,
+                );
+                format!("`{path}`")
+            })
+            .collect::<Vec<_>>();
         let msg = format!("unresolved import{} {}", pluralize!(paths.len()), paths.join(", "),);
 
         let mut diag = struct_span_err!(self.r.session, span, E0432, "{}", &msg);
@@ -525,7 +532,7 @@ fn throw_unresolved_import_error(&self, errors: Vec<(String, UnresolvedImportErr
             diag.note(note);
         }
 
-        for (_, err) in errors.into_iter().take(MAX_LABEL_COUNT) {
+        for (import, err) in errors.into_iter().take(MAX_LABEL_COUNT) {
             if let Some(label) = err.label {
                 diag.span_label(err.span, label);
             }
@@ -539,13 +546,16 @@ fn throw_unresolved_import_error(&self, errors: Vec<(String, UnresolvedImportErr
             }
 
             if let Some(candidate) = &err.candidate {
-                import_candidates(
-                    self.r.session,
-                    &self.r.untracked.source_span,
-                    &mut diag,
-                    Some(err.span),
-                    &candidate,
-                )
+                match &import.kind {
+                    ImportKind::Single { nested: false, .. } => import_candidates(
+                        self.r.session,
+                        &self.r.untracked.source_span,
+                        &mut diag,
+                        Some(err.span),
+                        &candidate,
+                    ),
+                    _ => {}
+                }
             }
         }
 
diff --git a/src/test/ui/imports/bad-import-in-nested.rs b/src/test/ui/imports/bad-import-in-nested.rs
new file mode 100644 (file)
index 0000000..5ab0d3d
--- /dev/null
@@ -0,0 +1,14 @@
+#![allow(unused)]
+
+mod A {
+    pub(crate) type AA = ();
+}
+
+mod C {}
+
+mod B {
+    use crate::C::{self, AA};
+    //~^ ERROR unresolved import `crate::C::AA`
+}
+
+fn main() {}
diff --git a/src/test/ui/imports/bad-import-in-nested.stderr b/src/test/ui/imports/bad-import-in-nested.stderr
new file mode 100644 (file)
index 0000000..a107048
--- /dev/null
@@ -0,0 +1,9 @@
+error[E0432]: unresolved import `crate::C::AA`
+  --> $DIR/bad-import-in-nested.rs:10:26
+   |
+LL |     use crate::C::{self, AA};
+   |                          ^^ no `AA` in `C`
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0432`.