Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix E0433 No Typo Suggestions #103706

Merged
merged 4 commits into from
Nov 1, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
54 changes: 37 additions & 17 deletions compiler/rustc_resolve/src/late.rs
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ use smallvec::{smallvec, SmallVec};

use rustc_span::source_map::{respan, Spanned};
use std::collections::{hash_map::Entry, BTreeSet};
use std::mem::{replace, take};
use std::mem::{replace, swap, take};

mod diagnostics;

Expand Down Expand Up @@ -3334,11 +3334,6 @@ impl<'a: 'ast, 'b, 'ast> LateResolutionVisitor<'a, 'b, 'ast> {
let (mut err, candidates) =
this.smart_resolve_report_errors(path, path_span, PathSource::Type, None);

if candidates.is_empty() {
err.cancel();
return Some(parent_err);
}

// There are two different error messages user might receive at
// this point:
// - E0412 cannot find type `{}` in this scope
Expand All @@ -3348,37 +3343,62 @@ impl<'a: 'ast, 'b, 'ast> LateResolutionVisitor<'a, 'b, 'ast> {
// latter one - for paths in expression-position.
//
// Thus (since we're in expression-position at this point), not to
// confuse the user, we want to keep the *message* from E0432 (so
// confuse the user, we want to keep the *message* from E0433 (so
// `parent_err`), but we want *hints* from E0412 (so `err`).
//
// And that's what happens below - we're just mixing both messages
// into a single one.
let mut parent_err = this.r.into_struct_error(parent_err.span, parent_err.node);

// overwrite all properties with the parent's error message
err.message = take(&mut parent_err.message);
err.code = take(&mut parent_err.code);
swap(&mut err.span, &mut parent_err.span);
err.children = take(&mut parent_err.children);
err.sort_span = parent_err.sort_span;
err.is_lint = parent_err.is_lint;

// merge the parent's suggestions with the typo suggestions
fn append_result<T, E>(res1: &mut Result<Vec<T>, E>, res2: Result<Vec<T>, E>) {
match res1 {
Ok(vec1) => match res2 {
Ok(mut vec2) => vec1.append(&mut vec2),
Err(e) => *res1 = Err(e),
},
Err(_) => (),
};
}
append_result(&mut err.suggestions, parent_err.suggestions.clone());

parent_err.cancel();

let def_id = this.parent_scope.module.nearest_parent_mod();

if this.should_report_errs() {
this.r.use_injections.push(UseError {
err,
candidates,
def_id,
instead: false,
suggestion: None,
path: path.into(),
is_call: source.is_call(),
});
if candidates.is_empty() {
// When there is no suggested imports, we can just emit the error
// and suggestions immediately. Note that we bypass the usually error
// reporting routine (ie via `self.r.report_error`) because we need
// to post-process the `ResolutionError` above.
err.emit();
} else {
// If there are suggested imports, the error reporting is delayed
this.r.use_injections.push(UseError {
err,
candidates,
def_id,
instead: false,
suggestion: None,
path: path.into(),
is_call: source.is_call(),
});
}
} else {
err.cancel();
}

// We don't return `Some(parent_err)` here, because the error will
// be already printed as part of the `use` injections
// be already printed either immediately or as part of the `use` injections
None
};

Expand Down
2 changes: 1 addition & 1 deletion src/test/ui/const-generics/issues/issue-82956.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ error[E0433]: failed to resolve: use of undeclared type `IntoIter`
--> $DIR/issue-82956.rs:25:24
|
LL | let mut iter = IntoIter::new(self);
| ^^^^^^^^ not found in this scope
| ^^^^^^^^ use of undeclared type `IntoIter`
|
help: consider importing one of these items
|
Expand Down
2 changes: 1 addition & 1 deletion src/test/ui/derived-errors/issue-31997-1.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ error[E0433]: failed to resolve: use of undeclared type `HashMap`
--> $DIR/issue-31997-1.rs:20:19
|
LL | let mut map = HashMap::new();
| ^^^^^^^ not found in this scope
| ^^^^^^^ use of undeclared type `HashMap`
|
help: consider importing this struct
|
Expand Down
2 changes: 1 addition & 1 deletion src/test/ui/hygiene/no_implicit_prelude.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ LL | fn f() { ::bar::m!(); }
| ----------- in this macro invocation
...
LL | Vec::new();
| ^^^ not found in this scope
| ^^^ use of undeclared type `Vec`
|
= note: this error originates in the macro `::bar::m` (in Nightly builds, run with -Z macro-backtrace for more info)
help: consider importing this struct
Expand Down
4 changes: 2 additions & 2 deletions src/test/ui/proc-macro/amputate-span.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ error[E0433]: failed to resolve: use of undeclared type `Command`
--> $DIR/amputate-span.rs:49:5
|
LL | Command::new("git");
| ^^^^^^^ not found in this scope
| ^^^^^^^ use of undeclared type `Command`
|
help: consider importing this struct
|
Expand All @@ -13,7 +13,7 @@ error[E0433]: failed to resolve: use of undeclared type `Command`
--> $DIR/amputate-span.rs:63:9
|
LL | Command::new("git");
| ^^^^^^^ not found in this scope
| ^^^^^^^ use of undeclared type `Command`
|
help: consider importing this struct
|
Expand Down
4 changes: 2 additions & 2 deletions src/test/ui/resolve/missing-in-namespace.stderr
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
error[E0433]: failed to resolve: could not find `hahmap` in `std`
--> $DIR/missing-in-namespace.rs:2:29
--> $DIR/missing-in-namespace.rs:2:21
|
LL | let _map = std::hahmap::HashMap::new();
| ^^^^^^^ not found in `std::hahmap`
| ^^^^^^ could not find `hahmap` in `std`
|
help: consider importing this struct
|
Expand Down
42 changes: 42 additions & 0 deletions src/test/ui/resolve/typo-suggestion-mistyped-in-path.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
struct Struct;
//~^ NOTE function or associated item `fob` not found for this struct

impl Struct {
fn foo() { }
}

mod module {
fn foo() { }

struct Struct;

impl Struct {
fn foo() { }
}
}

trait Trait {
fn foo();
}

fn main() {
Struct::fob();
//~^ ERROR no function or associated item named `fob` found for struct `Struct` in the current scope
//~| NOTE function or associated item not found in `Struct`

Struc::foo();
//~^ ERROR failed to resolve: use of undeclared type `Struc`
//~| NOTE use of undeclared type `Struc`

modul::foo();
//~^ ERROR failed to resolve: use of undeclared crate or module `modul`
//~| NOTE use of undeclared crate or module `modul`

module::Struc::foo();
//~^ ERROR failed to resolve: could not find `Struc` in `module`
//~| NOTE could not find `Struc` in `module`

Trai::foo();
//~^ ERROR failed to resolve: use of undeclared type `Trai`
//~| NOTE use of undeclared type `Trai`
}
54 changes: 54 additions & 0 deletions src/test/ui/resolve/typo-suggestion-mistyped-in-path.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
error[E0433]: failed to resolve: use of undeclared type `Struc`
--> $DIR/typo-suggestion-mistyped-in-path.rs:27:5
|
LL | Struc::foo();
| ^^^^^
| |
| use of undeclared type `Struc`
| help: a struct with a similar name exists: `Struct`

error[E0433]: failed to resolve: use of undeclared crate or module `modul`
--> $DIR/typo-suggestion-mistyped-in-path.rs:31:5
|
LL | modul::foo();
| ^^^^^ use of undeclared crate or module `modul`
|
help: there is a crate or module with a similar name
|
LL | module::foo();
| ~~~~~~

error[E0433]: failed to resolve: could not find `Struc` in `module`
--> $DIR/typo-suggestion-mistyped-in-path.rs:35:13
|
LL | module::Struc::foo();
| ^^^^^
| |
| could not find `Struc` in `module`
| help: a struct with a similar name exists: `Struct`

error[E0433]: failed to resolve: use of undeclared type `Trai`
--> $DIR/typo-suggestion-mistyped-in-path.rs:39:5
|
LL | Trai::foo();
| ^^^^
| |
| use of undeclared type `Trai`
| help: a trait with a similar name exists: `Trait`

error[E0599]: no function or associated item named `fob` found for struct `Struct` in the current scope
--> $DIR/typo-suggestion-mistyped-in-path.rs:23:13
|
LL | struct Struct;
| ------------- function or associated item `fob` not found for this struct
...
LL | Struct::fob();
| ^^^
| |
| function or associated item not found in `Struct`
| help: there is an associated function with a similar name: `foo`

error: aborting due to 5 previous errors

Some errors have detailed explanations: E0433, E0599.
For more information about an error, try `rustc --explain E0433`.
2 changes: 1 addition & 1 deletion src/test/ui/resolve/use_suggestion.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ error[E0433]: failed to resolve: use of undeclared type `HashMap`
--> $DIR/use_suggestion.rs:2:14
|
LL | let x1 = HashMap::new();
| ^^^^^^^ not found in this scope
| ^^^^^^^ use of undeclared type `HashMap`
|
help: consider importing this struct
|
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ error[E0433]: failed to resolve: use of undeclared type `NonZeroU32`
--> $DIR/core-std-import-order-issue-83564.rs:8:14
|
LL | let _x = NonZeroU32::new(5).unwrap();
| ^^^^^^^^^^ not found in this scope
| ^^^^^^^^^^ use of undeclared type `NonZeroU32`
|
help: consider importing one of these items
|
Expand Down
5 changes: 3 additions & 2 deletions src/test/ui/suggestions/suggest-tryinto-edition-change.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,18 +10,19 @@ fn test() {

let _i: i16 = TryFrom::try_from(0_i32).unwrap();
//~^ ERROR failed to resolve: use of undeclared type
//~| NOTE not found in this scope
//~| NOTE use of undeclared type
//~| NOTE 'std::convert::TryFrom' is included in the prelude starting in Edition 2021
//~| NOTE 'core::convert::TryFrom' is included in the prelude starting in Edition 2021

let _i: i16 = TryInto::try_into(0_i32).unwrap();
//~^ ERROR failed to resolve: use of undeclared type
//~| NOTE not found in this scope
//~| NOTE use of undeclared type
//~| NOTE 'std::convert::TryInto' is included in the prelude starting in Edition 2021
//~| NOTE 'core::convert::TryInto' is included in the prelude starting in Edition 2021

let _v: Vec<_> = FromIterator::from_iter(&[1]);
//~^ ERROR failed to resolve: use of undeclared type
//~| NOTE use of undeclared type
//~| NOTE 'std::iter::FromIterator' is included in the prelude starting in Edition 2021
//~| NOTE 'core::iter::FromIterator' is included in the prelude starting in Edition 2021
}
Expand Down
11 changes: 3 additions & 8 deletions src/test/ui/suggestions/suggest-tryinto-edition-change.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ error[E0433]: failed to resolve: use of undeclared type `TryFrom`
--> $DIR/suggest-tryinto-edition-change.rs:11:19
|
LL | let _i: i16 = TryFrom::try_from(0_i32).unwrap();
| ^^^^^^^ not found in this scope
| ^^^^^^^ use of undeclared type `TryFrom`
|
= note: 'std::convert::TryFrom' is included in the prelude starting in Edition 2021
= note: 'core::convert::TryFrom' is included in the prelude starting in Edition 2021
Expand All @@ -17,7 +17,7 @@ error[E0433]: failed to resolve: use of undeclared type `TryInto`
--> $DIR/suggest-tryinto-edition-change.rs:17:19
|
LL | let _i: i16 = TryInto::try_into(0_i32).unwrap();
| ^^^^^^^ not found in this scope
| ^^^^^^^ use of undeclared type `TryInto`
|
= note: 'std::convert::TryInto' is included in the prelude starting in Edition 2021
= note: 'core::convert::TryInto' is included in the prelude starting in Edition 2021
Expand All @@ -32,12 +32,7 @@ error[E0433]: failed to resolve: use of undeclared type `FromIterator`
--> $DIR/suggest-tryinto-edition-change.rs:23:22
|
LL | let _v: Vec<_> = FromIterator::from_iter(&[1]);
| ^^^^^^^^^^^^
|
::: $SRC_DIR/core/src/iter/traits/collect.rs:LL:COL
|
LL | pub trait IntoIterator {
| ---------------------- similarly named trait `IntoIterator` defined here
| ^^^^^^^^^^^^ use of undeclared type `FromIterator`
|
= note: 'std::iter::FromIterator' is included in the prelude starting in Edition 2021
= note: 'core::iter::FromIterator' is included in the prelude starting in Edition 2021
Expand Down