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

Fix E0433 No Typo Suggestions #103706

merged 4 commits into from
Nov 1, 2022

Conversation

zbyrn
Copy link
Contributor

@zbyrn zbyrn commented Oct 28, 2022

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:

  • If Struct is not found, it is E0433: failed to resolve: use of undeclared type `Struct` .
  • If foo is not found in Struct, it is E0599: 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 is E0412: cannot find type `Struct` in this scope.

Before #72923, E0433 does not implement any suggestions, and the PR introduces suggestions for missing uses. 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 to module::Struct::foo(). However, along with the suggestions, the smart-resolve function will report E0412 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 out E0412 errors returned by the smart-resolve function with the real E0433 error, but keeps the "missing use" 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 a E0412 messages, if there are use suggestions, but says the normal use of undeclared type otherwise.

Fixes
This fix swaps out all fields in Diagnostic returned by the smart-resolve function except for suggestions with the current error, and merges the suggestions of the returned error and that of the current error together. If there are use suggestions, the error is saved to use_injection to be reported at the end; otherwise, the error is emitted immediately as Resolver::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

@rustbot
Copy link
Collaborator

rustbot commented Oct 28, 2022

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.

@rustbot rustbot added S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue. labels Oct 28, 2022
@zbyrn
Copy link
Contributor Author

zbyrn commented Oct 28, 2022

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.

@zbyrn
Copy link
Contributor Author

zbyrn commented Oct 28, 2022

cc @jackh726 since you were the reviewer in one of the previous PR's that worked on this

@zbyrn
Copy link
Contributor Author

zbyrn commented Oct 31, 2022

@rustbot label T-compiler A-diagnostics

@rustbot rustbot added the A-diagnostics Area: Messages for errors, warnings, and lints label Oct 31, 2022
@estebank
Copy link
Contributor

r? @estebank
@bors r+

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.

Erring on the side of verbosity is better than the alternative :)

Thank you for taking this on!

@bors
Copy link
Contributor

bors commented Oct 31, 2022

📌 Commit a10737c has been approved by estebank

It is now in the queue for this repository.

@bors bors added S-waiting-on-bors Status: Waiting on bors to run and complete tests. Bors will change the label on completion. and removed S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. labels Oct 31, 2022
bors added a commit to rust-lang-ci/rust that referenced this pull request Nov 1, 2022
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
@bors bors merged commit 7dc3ace into rust-lang:master Nov 1, 2022
@rustbot rustbot added this to the 1.67.0 milestone Nov 1, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
A-diagnostics Area: Messages for errors, warnings, and lints S-waiting-on-bors Status: Waiting on bors to run and complete tests. Bors will change the label on completion. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue.
Projects
None yet
5 participants