Skip to content

Commit

Permalink
Typo suggestion to change bindings with leading underscore
Browse files Browse the repository at this point in the history
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 #60164.
  • Loading branch information
estebank committed Oct 19, 2023
1 parent cc705b8 commit 4bd5f7d
Show file tree
Hide file tree
Showing 4 changed files with 40 additions and 2 deletions.
18 changes: 16 additions & 2 deletions compiler/rustc_resolve/src/diagnostics.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1462,6 +1462,7 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
}
}

#[tracing::instrument(level = "info", skip(self, err))]
pub(crate) fn add_typo_suggestion(
&self,
err: &mut Diagnostic,
Expand Down Expand Up @@ -1511,17 +1512,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
&& suggestion.candidate.as_str().starts_with("_")
&& snippet == suggestion.candidate.as_str()[1..]
{
// 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 4bd5f7d

Please sign in to comment.