Skip to content

Commit

Permalink
Rollup merge of #100817 - vincenzopalazzo:macros/bool_spelling_sugg, …
Browse files Browse the repository at this point in the history
…r=davidtwco

sugg: suggest the usage of boolean value when there is a typo in the keyword

Fixes #100686

This adds a new suggestion when there is a well-known typo

With the following program

```rust
fn main() {
    let x = True;
}
```

Now we have the following suggestion

```
error[E0425]: cannot find value `True` in this scope
 --> test.rs:2:13
  |
2 |     let x = True;
  |             ^^^^ not found in this scope
  |
help: you may want to use a bool value instead
  |
2 |     let x = true;
  |             ~~~~

error: aborting due to previous error
```

Signed-off-by: Vincenzo Palazzo <vincenzopalazzodev@gmail.com>
  • Loading branch information
compiler-errors committed Aug 26, 2022
2 parents 389dda1 + 69715c9 commit 5474460
Show file tree
Hide file tree
Showing 3 changed files with 59 additions and 5 deletions.
27 changes: 22 additions & 5 deletions compiler/rustc_resolve/src/late/diagnostics.rs
Original file line number Diff line number Diff line change
Expand Up @@ -250,13 +250,30 @@ impl<'a: 'ast, 'ast> LateResolutionVisitor<'a, '_, 'ast> {
.map_or_else(String::new, |res| format!("{} ", res.descr()));
(mod_prefix, format!("`{}`", Segment::names_to_string(mod_path)), None)
};

let (fallback_label, suggestion) = if path_str == "async"
&& expected.starts_with("struct")
{
("`async` blocks are only allowed in Rust 2018 or later".to_string(), suggestion)
} else {
// check if we are in situation of typo like `True` instead of `true`.
let override_suggestion =
if ["true", "false"].contains(&item_str.to_string().to_lowercase().as_str()) {
let item_typo = item_str.to_string().to_lowercase();
Some((
item_span,
"you may want to use a bool value instead",
format!("{}", item_typo),
))
} else {
suggestion
};
(format!("not found in {mod_str}"), override_suggestion)
};

BaseError {
msg: format!("cannot find {expected} `{item_str}` in {mod_prefix}{mod_str}"),
fallback_label: if path_str == "async" && expected.starts_with("struct") {
"`async` blocks are only allowed in Rust 2018 or later".to_string()
} else {
format!("not found in {mod_str}")
},
fallback_label,
span: item_span,
span_label: None,
could_be_expr: false,
Expand Down
12 changes: 12 additions & 0 deletions src/test/ui/suggestions/bool_typo_err_suggest.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
// Suggest the boolean value instead of emit a generic error that the value
// True is not in the scope.

fn main() {
let x = True;
//~^ ERROR cannot find value `True` in this scope
//~| HELP you may want to use a bool value instead

let y = False;
//~^ ERROR cannot find value `False` in this scope
//~| HELP you may want to use a bool value instead
}
25 changes: 25 additions & 0 deletions src/test/ui/suggestions/bool_typo_err_suggest.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
error[E0425]: cannot find value `True` in this scope
--> $DIR/bool_typo_err_suggest.rs:5:13
|
LL | let x = True;
| ^^^^ not found in this scope
|
help: you may want to use a bool value instead
|
LL | let x = true;
| ~~~~

error[E0425]: cannot find value `False` in this scope
--> $DIR/bool_typo_err_suggest.rs:9:13
|
LL | let y = False;
| ^^^^^ not found in this scope
|
help: you may want to use a bool value instead
|
LL | let y = false;
| ~~~~~

error: aborting due to 2 previous errors

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

0 comments on commit 5474460

Please sign in to comment.