Skip to content

Commit 564435f

Browse files
Suppress suggestions for nested use tree
1 parent caa64e5 commit 564435f

File tree

3 files changed

+50
-17
lines changed

3 files changed

+50
-17
lines changed

compiler/rustc_resolve/src/imports.rs

+27-17
Original file line numberDiff line numberDiff line change
@@ -475,12 +475,7 @@ impl<'a, 'b> ImportResolver<'a, 'b> {
475475
errors = vec![];
476476
}
477477
if seen_spans.insert(err.span) {
478-
let path = import_path_to_string(
479-
&import.module_path.iter().map(|seg| seg.ident).collect::<Vec<_>>(),
480-
&import.kind,
481-
err.span,
482-
);
483-
errors.push((path, err));
478+
errors.push((import, err));
484479
prev_root_id = import.root_id;
485480
}
486481
} else if is_indeterminate {
@@ -496,8 +491,10 @@ impl<'a, 'b> ImportResolver<'a, 'b> {
496491
suggestion: None,
497492
candidate: None,
498493
};
494+
// FIXME: there should be a better way of doing this than
495+
// formatting this as a string then checking for `::`
499496
if path.contains("::") {
500-
errors.push((path, err))
497+
errors.push((import, err))
501498
}
502499
}
503500
}
@@ -507,7 +504,7 @@ impl<'a, 'b> ImportResolver<'a, 'b> {
507504
}
508505
}
509506

510-
fn throw_unresolved_import_error(&self, errors: Vec<(String, UnresolvedImportError)>) {
507+
fn throw_unresolved_import_error(&self, errors: Vec<(&Import<'_>, UnresolvedImportError)>) {
511508
if errors.is_empty() {
512509
return;
513510
}
@@ -516,7 +513,17 @@ impl<'a, 'b> ImportResolver<'a, 'b> {
516513
const MAX_LABEL_COUNT: usize = 10;
517514

518515
let span = MultiSpan::from_spans(errors.iter().map(|(_, err)| err.span).collect());
519-
let paths = errors.iter().map(|(path, _)| format!("`{}`", path)).collect::<Vec<_>>();
516+
let paths = errors
517+
.iter()
518+
.map(|(import, err)| {
519+
let path = import_path_to_string(
520+
&import.module_path.iter().map(|seg| seg.ident).collect::<Vec<_>>(),
521+
&import.kind,
522+
err.span,
523+
);
524+
format!("`{path}`")
525+
})
526+
.collect::<Vec<_>>();
520527
let msg = format!("unresolved import{} {}", pluralize!(paths.len()), paths.join(", "),);
521528

522529
let mut diag = struct_span_err!(self.r.session, span, E0432, "{}", &msg);
@@ -525,7 +532,7 @@ impl<'a, 'b> ImportResolver<'a, 'b> {
525532
diag.note(note);
526533
}
527534

528-
for (_, err) in errors.into_iter().take(MAX_LABEL_COUNT) {
535+
for (import, err) in errors.into_iter().take(MAX_LABEL_COUNT) {
529536
if let Some(label) = err.label {
530537
diag.span_label(err.span, label);
531538
}
@@ -539,13 +546,16 @@ impl<'a, 'b> ImportResolver<'a, 'b> {
539546
}
540547

541548
if let Some(candidate) = &err.candidate {
542-
import_candidates(
543-
self.r.session,
544-
&self.r.untracked.source_span,
545-
&mut diag,
546-
Some(err.span),
547-
&candidate,
548-
)
549+
match &import.kind {
550+
ImportKind::Single { nested: false, .. } => import_candidates(
551+
self.r.session,
552+
&self.r.untracked.source_span,
553+
&mut diag,
554+
Some(err.span),
555+
&candidate,
556+
),
557+
_ => {}
558+
}
549559
}
550560
}
551561

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
#![allow(unused)]
2+
3+
mod A {
4+
pub(crate) type AA = ();
5+
}
6+
7+
mod C {}
8+
9+
mod B {
10+
use crate::C::{self, AA};
11+
//~^ ERROR unresolved import `crate::C::AA`
12+
}
13+
14+
fn main() {}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
error[E0432]: unresolved import `crate::C::AA`
2+
--> $DIR/bad-import-in-nested.rs:10:26
3+
|
4+
LL | use crate::C::{self, AA};
5+
| ^^ no `AA` in `C`
6+
7+
error: aborting due to previous error
8+
9+
For more information about this error, try `rustc --explain E0432`.

0 commit comments

Comments
 (0)