Rollup merge of #138790 - xizheyin:issue-138626, r=compiler-errors
Note potential but private items in show_candidates Closes #138626 . We should add potential private items to give ample hints. And for the other seemingly false positive ` pub use crate:1️⃣:Foo;` should be kept because we don't know if the user wants to import other module's items or not, and therefore should be given the full option to do so. r? compiler
This commit is contained in:
commit
068594e365
12 changed files with 135 additions and 14 deletions
|
@ -1325,11 +1325,6 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
|
|||
})
|
||||
}
|
||||
|
||||
// If only some candidates are accessible, take just them
|
||||
if !candidates.iter().all(|v: &ImportSuggestion| !v.accessible) {
|
||||
candidates.retain(|x| x.accessible)
|
||||
}
|
||||
|
||||
candidates
|
||||
}
|
||||
|
||||
|
@ -1793,7 +1788,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
|
|||
&import_suggestions,
|
||||
Instead::Yes,
|
||||
FoundUse::Yes,
|
||||
DiagMode::Import { append: single_nested },
|
||||
DiagMode::Import { append: single_nested, unresolved_import: false },
|
||||
vec![],
|
||||
"",
|
||||
);
|
||||
|
@ -2750,6 +2745,8 @@ pub(crate) enum DiagMode {
|
|||
Pattern,
|
||||
/// The binding is part of a use statement
|
||||
Import {
|
||||
/// `true` means diagnostics is for unresolved import
|
||||
unresolved_import: bool,
|
||||
/// `true` mean add the tips afterward for case `use a::{b,c}`,
|
||||
/// rather than replacing within.
|
||||
append: bool,
|
||||
|
@ -2800,6 +2797,7 @@ fn show_candidates(
|
|||
return false;
|
||||
}
|
||||
|
||||
let mut showed = false;
|
||||
let mut accessible_path_strings: Vec<PathString<'_>> = Vec::new();
|
||||
let mut inaccessible_path_strings: Vec<PathString<'_>> = Vec::new();
|
||||
|
||||
|
@ -2958,8 +2956,11 @@ fn show_candidates(
|
|||
append_candidates(&mut msg, accessible_path_strings);
|
||||
err.help(msg);
|
||||
}
|
||||
true
|
||||
} else if !(inaccessible_path_strings.is_empty() || matches!(mode, DiagMode::Import { .. })) {
|
||||
showed = true;
|
||||
}
|
||||
if !inaccessible_path_strings.is_empty()
|
||||
&& (!matches!(mode, DiagMode::Import { unresolved_import: false, .. }))
|
||||
{
|
||||
let prefix =
|
||||
if let DiagMode::Pattern = mode { "you might have meant to match on " } else { "" };
|
||||
if let [(name, descr, source_span, note, _)] = &inaccessible_path_strings[..] {
|
||||
|
@ -3022,10 +3023,9 @@ fn show_candidates(
|
|||
|
||||
err.span_note(multi_span, msg);
|
||||
}
|
||||
true
|
||||
} else {
|
||||
false
|
||||
showed = true;
|
||||
}
|
||||
showed
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
|
|
|
@ -734,7 +734,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
|
|||
&mut diag,
|
||||
Some(err.span),
|
||||
candidates,
|
||||
DiagMode::Import { append: false },
|
||||
DiagMode::Import { append: false, unresolved_import: true },
|
||||
(source != target)
|
||||
.then(|| format!(" as {target}"))
|
||||
.as_deref()
|
||||
|
|
|
@ -58,6 +58,11 @@ error[E0425]: cannot find function `import` in this scope
|
|||
LL | import();
|
||||
| ^^^^^^ not found in this scope
|
||||
|
|
||||
note: function `bar::import` exists but is inaccessible
|
||||
--> $DIR/glob-resolve1.rs:7:5
|
||||
|
|
||||
LL | fn fpriv() {}
|
||||
| ^^^^^^^^^^ not accessible
|
||||
help: consider importing this function
|
||||
|
|
||||
LL + use other::import;
|
||||
|
|
|
@ -16,6 +16,11 @@ error[E0423]: expected function, found module `foo`
|
|||
LL | foo();
|
||||
| ^^^ not a function
|
||||
|
|
||||
note: function `m1::foo` exists but is inaccessible
|
||||
--> $DIR/issue-4366-2.rs:21:5
|
||||
|
|
||||
LL | fn foo() {}
|
||||
| ^^^^^^^^ not accessible
|
||||
help: consider importing this function instead
|
||||
|
|
||||
LL + use foo::foo;
|
||||
|
|
|
@ -4,6 +4,11 @@ error[E0425]: cannot find function `foo` in this scope
|
|||
LL | fn sub() -> isize { foo(); 1 }
|
||||
| ^^^ not found in this scope
|
||||
|
|
||||
note: function `m1::foo` exists but is inaccessible
|
||||
--> $DIR/issue-4366.rs:23:5
|
||||
|
|
||||
LL | fn foo() {}
|
||||
| ^^^^^^^^ not accessible
|
||||
help: consider importing this function
|
||||
|
|
||||
LL + use foo::foo;
|
||||
|
|
19
tests/ui/imports/show-private-items-issue-138626.rs
Normal file
19
tests/ui/imports/show-private-items-issue-138626.rs
Normal file
|
@ -0,0 +1,19 @@
|
|||
pub mod one {
|
||||
mod foo {
|
||||
pub struct Foo;
|
||||
}
|
||||
|
||||
pub use self::foo::Foo;
|
||||
}
|
||||
|
||||
pub mod two {
|
||||
mod foo {
|
||||
mod bar {
|
||||
pub struct Foo;
|
||||
}
|
||||
}
|
||||
|
||||
pub use crate::two::foo::Foo; //~ ERROR unresolved import `crate::two::foo::Foo` [E0432]
|
||||
}
|
||||
|
||||
fn main() {}
|
20
tests/ui/imports/show-private-items-issue-138626.stderr
Normal file
20
tests/ui/imports/show-private-items-issue-138626.stderr
Normal file
|
@ -0,0 +1,20 @@
|
|||
error[E0432]: unresolved import `crate::two::foo::Foo`
|
||||
--> $DIR/show-private-items-issue-138626.rs:16:13
|
||||
|
|
||||
LL | pub use crate::two::foo::Foo;
|
||||
| ^^^^^^^^^^^^^^^^^^^^ no `Foo` in `two::foo`
|
||||
|
|
||||
note: struct `two::foo::bar::Foo` exists but is inaccessible
|
||||
--> $DIR/show-private-items-issue-138626.rs:12:13
|
||||
|
|
||||
LL | pub struct Foo;
|
||||
| ^^^^^^^^^^^^^^^ not accessible
|
||||
help: consider importing this struct through its public re-export instead
|
||||
|
|
||||
LL - pub use crate::two::foo::Foo;
|
||||
LL + pub use one::Foo;
|
||||
|
|
||||
|
||||
error: aborting due to 1 previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0432`.
|
|
@ -7,6 +7,14 @@ LL | pub struct Baz;
|
|||
LL | Bar();
|
||||
| ^^^
|
||||
|
|
||||
note: these functions exist but are inaccessible
|
||||
--> $DIR/privacy-ns1.rs:14:5
|
||||
|
|
||||
LL | fn Bar() { }
|
||||
| ^^^^^^^^ `foo1::Bar`: not accessible
|
||||
...
|
||||
LL | fn Bar() { }
|
||||
| ^^^^^^^^ `foo3::Bar`: not accessible
|
||||
help: a unit struct with a similar name exists
|
||||
|
|
||||
LL - Bar();
|
||||
|
@ -26,6 +34,14 @@ LL | pub struct Baz;
|
|||
LL | Bar();
|
||||
| ^^^
|
||||
|
|
||||
note: these functions exist but are inaccessible
|
||||
--> $DIR/privacy-ns1.rs:14:5
|
||||
|
|
||||
LL | fn Bar() { }
|
||||
| ^^^^^^^^ `foo1::Bar`: not accessible
|
||||
...
|
||||
LL | fn Bar() { }
|
||||
| ^^^^^^^^ `foo3::Bar`: not accessible
|
||||
help: a unit struct with a similar name exists
|
||||
|
|
||||
LL - Bar();
|
||||
|
@ -45,6 +61,14 @@ LL | pub struct Baz;
|
|||
LL | let _x: Box<Bar>;
|
||||
| ^^^
|
||||
|
|
||||
note: these traits exist but are inaccessible
|
||||
--> $DIR/privacy-ns1.rs:25:5
|
||||
|
|
||||
LL | trait Bar {
|
||||
| ^^^^^^^^^ `foo2::Bar`: not accessible
|
||||
...
|
||||
LL | trait Bar {
|
||||
| ^^^^^^^^^ `foo3::Bar`: not accessible
|
||||
help: a struct with a similar name exists
|
||||
|
|
||||
LL - let _x: Box<Bar>;
|
||||
|
|
|
@ -4,6 +4,14 @@ error[E0423]: expected function, tuple struct or tuple variant, found trait `Bar
|
|||
LL | Bar();
|
||||
| ^^^ not a function, tuple struct or tuple variant
|
||||
|
|
||||
note: these functions exist but are inaccessible
|
||||
--> $DIR/privacy-ns2.rs:14:5
|
||||
|
|
||||
LL | fn Bar() { }
|
||||
| ^^^^^^^^ `foo1::Bar`: not accessible
|
||||
...
|
||||
LL | fn Bar() { }
|
||||
| ^^^^^^^^ `foo3::Bar`: not accessible
|
||||
help: consider importing this function instead
|
||||
|
|
||||
LL + use foo2::Bar;
|
||||
|
@ -18,6 +26,14 @@ LL | pub struct Baz;
|
|||
LL | Bar();
|
||||
| ^^^
|
||||
|
|
||||
note: these functions exist but are inaccessible
|
||||
--> $DIR/privacy-ns2.rs:14:5
|
||||
|
|
||||
LL | fn Bar() { }
|
||||
| ^^^^^^^^ `foo1::Bar`: not accessible
|
||||
...
|
||||
LL | fn Bar() { }
|
||||
| ^^^^^^^^ `foo3::Bar`: not accessible
|
||||
help: a unit struct with a similar name exists
|
||||
|
|
||||
LL - Bar();
|
||||
|
@ -34,6 +50,14 @@ error[E0573]: expected type, found function `Bar`
|
|||
LL | let _x : Bar();
|
||||
| ^^^^^ not a type
|
||||
|
|
||||
note: these traits exist but are inaccessible
|
||||
--> $DIR/privacy-ns2.rs:31:5
|
||||
|
|
||||
LL | trait Bar {
|
||||
| ^^^^^^^^^ `foo2::Bar`: not accessible
|
||||
...
|
||||
LL | trait Bar {
|
||||
| ^^^^^^^^^ `foo3::Bar`: not accessible
|
||||
help: use `=` if you meant to assign
|
||||
|
|
||||
LL - let _x : Bar();
|
||||
|
|
|
@ -19,6 +19,17 @@ error[E0412]: cannot find type `Mul` in this scope
|
|||
LL | fn getMul() -> Mul {
|
||||
| ^^^ not found in this scope
|
||||
|
|
||||
note: these items exist but are inaccessible
|
||||
--> $DIR/issue-21221-1.rs:10:5
|
||||
|
|
||||
LL | enum Mul {
|
||||
| ^^^^^^^^ `mul3::Mul`: not accessible
|
||||
...
|
||||
LL | type Mul = String;
|
||||
| ^^^^^^^^^^^^^^^^^^ `mul4::Mul`: not accessible
|
||||
...
|
||||
LL | struct Mul{
|
||||
| ^^^^^^^^^^ `mul5::Mul`: not accessible
|
||||
help: consider importing one of these traits
|
||||
|
|
||||
LL + use std::ops::Mul;
|
||||
|
|
|
@ -31,6 +31,8 @@ mod food {
|
|||
|
||||
mod zug {
|
||||
pub mod baz {
|
||||
//~^ NOTE module `food::zug::baz` exists but is inaccessible
|
||||
//~| NOTE not accessible
|
||||
pub struct Foobar;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -26,6 +26,12 @@ LL | use food::baz;
|
|||
| | |
|
||||
| | help: a similar name exists in the module: `bag`
|
||||
| no `baz` in `food`
|
||||
|
|
||||
note: module `food::zug::baz` exists but is inaccessible
|
||||
--> $DIR/unresolved-import.rs:33:9
|
||||
|
|
||||
LL | pub mod baz {
|
||||
| ^^^^^^^^^^^ not accessible
|
||||
|
||||
error[E0432]: unresolved import `food::beens`
|
||||
--> $DIR/unresolved-import.rs:19:12
|
||||
|
@ -37,13 +43,13 @@ LL | use food::{beens as Foo};
|
|||
| help: a similar name exists in the module: `beans`
|
||||
|
||||
error[E0432]: unresolved import `MyEnum`
|
||||
--> $DIR/unresolved-import.rs:44:9
|
||||
--> $DIR/unresolved-import.rs:46:9
|
||||
|
|
||||
LL | use MyEnum::*;
|
||||
| ^^^^^^ help: a similar path exists: `self::MyEnum`
|
||||
|
||||
error[E0432]: unresolved import `Enum`
|
||||
--> $DIR/unresolved-import.rs:55:9
|
||||
--> $DIR/unresolved-import.rs:57:9
|
||||
|
|
||||
LL | use Enum::*;
|
||||
| ^^^^ help: a similar path exists: `self::Enum`
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue