-
Notifications
You must be signed in to change notification settings - Fork 12.9k
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
Fix E0433 No Typo Suggestions #103706
Conversation
Thanks for the pull request, and welcome! The Rust team is excited to review your changes, and you should hear from @TaKO8Ki (or someone else) soon. Please see the contribution instructions for more information. |
Oops, I don't know if people think there is too much text here. If so, please let me know I'll keep it short next time. |
cc @jackh726 since you were the reviewer in one of the previous PR's that worked on this |
@rustbot label T-compiler A-diagnostics |
Rollup of 6 pull requests Successful merges: - rust-lang#103061 (Rewrite implementation of `#[alloc_error_handler]`) - rust-lang#103584 (Remove bounds check when array is indexed by enum) - rust-lang#103706 (Fix E0433 No Typo Suggestions) - rust-lang#103729 (interpret: fix align_of_val on packed types) - rust-lang#103759 (Use `adt_def` during type collection.) - rust-lang#103809 (Fix a typo in std::net mod doc comment) Failed merges: r? `@ghost` `@rustbot` modify labels: rollup
Fixes #48676
Fixes #87791
Fixes #96625
Fixes #95462
Fixes #101637
Follows up PR #72923
Several open issues refer to the problem that E0433 does not suggest typos like other errors normally do. This fix augments the implementation of PR #72923.
Background
When the path of a function call, e.g.
Struct::foo()
, involves names that cannot be resolved, there are two errors that could be emitted by the compiler:Struct
is not found, it isE0433: failed to resolve: use of undeclared type `Struct`
.foo
is not found inStruct
, it isE0599: no function or associated item named `foo` found for struct `Struct` in the current scope
When a name is used as a type,
e.g. fn foo() -> Struct
, and the name cannot be resolved, it isE0412: cannot find type `Struct` in this scope
.Before #72923,
E0433
does not implement any suggestions, and the PR introduces suggestions for missinguse
s. When a resolution error occurs in the path of a function call, it tries to smart resolve just the type part of the path, e.g.module::Struct
of a call tomodule::Struct::foo()
. However, along with the suggestions, the smart-resolve function will reportE0412
since it only knows that it is a type that we cannot resolve instead of being a part of the path. So, the original implementation swap outE0412
errors returned by the smart-resolve function with the realE0433
error, but keeps the "missinguse
" suggestions to be reported to the programmer.Issue
The current implementation only reports if there are "missing
use
" suggestions returned by the smart-resolve function; otherwise, it would fall back the normal reporting, which does not emit suggestions. But the smart-resolve function could also produce typo suggestions, which are omitted currently.Also, it seems like that not all info has been swapped out when there are missing suggestions. The error message underlining the name in the snippet still says
not found in this scope
, which is aE0412
messages, if there areuse
suggestions, but says the normaluse of undeclared type
otherwise.Fixes
This fix swaps out all fields in
Diagnostic
returned by the smart-resolve function except forsuggestions
with the current error, and merges thesuggestions
of the returned error and that of the current error together. If there areuse
suggestions, the error is saved touse_injection
to be reported at the end; otherwise, the error is emitted immediately asResolver::report_error
does.Some tests are updated to use the correct underlining error messages, and one additional test for typo suggestion is added to the test suite.
r? rust-lang/diagnostics