Skip to content

Commit

Permalink
Rollup merge of rust-lang#116961 - estebank:issue-60164, r=oli-obk
Browse files Browse the repository at this point in the history
Typo suggestion to change bindings with leading underscore

When encountering a binding that isn't found but has a typo suggestion for a binding with a leading underscore, suggest changing the binding definition instead of the use place.

Fix rust-lang#60164.
  • Loading branch information
matthiaskrgr committed Oct 20, 2023
2 parents 4d1cb02 + b0d17f3 commit da76602
Show file tree
Hide file tree
Showing 4 changed files with 39 additions and 2 deletions.
17 changes: 15 additions & 2 deletions compiler/rustc_resolve/src/diagnostics.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1511,17 +1511,30 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
),
);
}

let (span, sugg, post) = if let SuggestionTarget::SimilarlyNamed = suggestion.target
&& let Ok(snippet) = self.tcx.sess.source_map().span_to_snippet(span)
&& let Some(span) = suggestion.span
&& let Some(candidate) = suggestion.candidate.as_str().strip_prefix("_")
&& snippet == candidate
{
// When the suggested binding change would be from `x` to `_x`, suggest changing the
// original binding definition instead. (#60164)
(span, snippet, ", consider changing it")
} else {
(span, suggestion.candidate.to_string(), "")
};
let msg = match suggestion.target {
SuggestionTarget::SimilarlyNamed => format!(
"{} {} with a similar name exists",
"{} {} with a similar name exists{post}",
suggestion.res.article(),
suggestion.res.descr()
),
SuggestionTarget::SingleItem => {
format!("maybe you meant this {}", suggestion.res.descr())
}
};
err.span_suggestion(span, msg, suggestion.candidate, Applicability::MaybeIncorrect);
err.span_suggestion(span, msg, sugg, Applicability::MaybeIncorrect);
true
}

Expand Down
5 changes: 5 additions & 0 deletions tests/ui/suggestions/silenced-binding-typo.fixed
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
// run-rustfix
fn main() {
let x = 42; //~ HELP
let _y = x; //~ ERROR
}
5 changes: 5 additions & 0 deletions tests/ui/suggestions/silenced-binding-typo.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
// run-rustfix
fn main() {
let _x = 42; //~ HELP
let _y = x; //~ ERROR
}
14 changes: 14 additions & 0 deletions tests/ui/suggestions/silenced-binding-typo.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
error[E0425]: cannot find value `x` in this scope
--> $DIR/silenced-binding-typo.rs:4:14
|
LL | let _y = x;
| ^
|
help: a local variable with a similar name exists, consider changing it
|
LL | let x = 42;
| ~

error: aborting due to previous error

For more information about this error, try `rustc --explain E0425`.

0 comments on commit da76602

Please sign in to comment.