Skip to content

Commit

Permalink
Auto merge of #117303 - sjwang05:issue-117245, r=estebank
Browse files Browse the repository at this point in the history
Suggest `=>` --> `>=` in comparisons

Fixes #117245
  • Loading branch information
bors committed Dec 27, 2023
2 parents 15755f3 + 97cf1c8 commit a861c89
Show file tree
Hide file tree
Showing 6 changed files with 230 additions and 0 deletions.
20 changes: 20 additions & 0 deletions compiler/rustc_parse/src/parser/diagnostics.rs
Original file line number Diff line number Diff line change
Expand Up @@ -598,6 +598,26 @@ impl<'a> Parser<'a> {
// FIXME: translation requires list formatting (for `expect`)
let mut err = self.dcx().struct_span_err(self.token.span, msg_exp);

// Look for usages of '=>' where '>=' was probably intended
if self.token == token::FatArrow
&& expected
.iter()
.any(|tok| matches!(tok, TokenType::Operator | TokenType::Token(TokenKind::Le)))
&& !expected.iter().any(|tok| {
matches!(
tok,
TokenType::Token(TokenKind::FatArrow) | TokenType::Token(TokenKind::Comma)
)
})
{
err.span_suggestion(
self.token.span,
"you might have meant to write a \"greater than or equal to\" comparison",
">=",
Applicability::MaybeIncorrect,
);
}

if let TokenKind::Ident(symbol, _) = &self.prev_token.kind {
if ["def", "fun", "func", "function"].contains(&symbol.as_str()) {
err.span_suggestion_short(
Expand Down
10 changes: 10 additions & 0 deletions compiler/rustc_parse/src/parser/expr.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2445,6 +2445,7 @@ impl<'a> Parser<'a> {
}
} else {
let attrs = self.parse_outer_attributes()?; // For recovery.
let maybe_fatarrow = self.token.clone();
let block = if self.check(&token::OpenDelim(Delimiter::Brace)) {
self.parse_block()?
} else {
Expand All @@ -2469,6 +2470,15 @@ impl<'a> Parser<'a> {
"you likely meant to continue parsing the let-chain starting here",
);
} else {
// Look for usages of '=>' where '>=' might be intended
if maybe_fatarrow.kind == token::FatArrow {
err.span_suggestion(
maybe_fatarrow.span,
"you might have meant to write a \"greater than or equal to\" comparison",
">=",
Applicability::MaybeIncorrect,
);
}
err.span_note(
cond_span,
"the `if` expression is missing a block after this condition",
Expand Down
4 changes: 4 additions & 0 deletions tests/ui/missing/missing-block-hint.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,10 @@ note: the `if` expression is missing a block after this condition
|
LL | if (foo) => {}
| ^^^^^
help: you might have meant to write a "greater than or equal to" comparison
|
LL | if (foo) >= {}
| ~~

error: expected `{`, found `bar`
--> $DIR/missing-block-hint.rs:7:13
Expand Down
45 changes: 45 additions & 0 deletions tests/ui/parser/eq-gt-to-gt-eq.fixed
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
// run-rustfix
// Check that we try to correct `=>` to `>=` in conditions.
#![allow(unused)]

fn main() {
let a = 0;
let b = 1;
if a >= b {} //~ERROR
}

fn foo() {
let a = 0;
if a >= 1 {} //~ERROR
}

fn a() {
let a = 0;
if 1 >= a {} //~ERROR
}

fn bar() {
let a = 0;
let b = 1;
if a >= b && a != b {} //~ERROR
}

fn qux() {
let a = 0;
let b = 1;
if a != b && a >= b {} //~ERROR
}

fn baz() {
let a = 0;
let b = 1;
let _ = a >= b; //~ERROR
}

fn b() {
let a = 0;
let b = 1;
match a >= b { //~ERROR
_ => todo!(),
}
}
45 changes: 45 additions & 0 deletions tests/ui/parser/eq-gt-to-gt-eq.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
// run-rustfix
// Check that we try to correct `=>` to `>=` in conditions.
#![allow(unused)]

fn main() {
let a = 0;
let b = 1;
if a => b {} //~ERROR
}

fn foo() {
let a = 0;
if a => 1 {} //~ERROR
}

fn a() {
let a = 0;
if 1 => a {} //~ERROR
}

fn bar() {
let a = 0;
let b = 1;
if a => b && a != b {} //~ERROR
}

fn qux() {
let a = 0;
let b = 1;
if a != b && a => b {} //~ERROR
}

fn baz() {
let a = 0;
let b = 1;
let _ = a => b; //~ERROR
}

fn b() {
let a = 0;
let b = 1;
match a => b { //~ERROR
_ => todo!(),
}
}
106 changes: 106 additions & 0 deletions tests/ui/parser/eq-gt-to-gt-eq.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
error: expected `{`, found `=>`
--> $DIR/eq-gt-to-gt-eq.rs:8:10
|
LL | if a => b {}
| ^^ expected `{`
|
note: the `if` expression is missing a block after this condition
--> $DIR/eq-gt-to-gt-eq.rs:8:8
|
LL | if a => b {}
| ^
help: you might have meant to write a "greater than or equal to" comparison
|
LL | if a >= b {}
| ~~

error: expected `{`, found `=>`
--> $DIR/eq-gt-to-gt-eq.rs:13:10
|
LL | if a => 1 {}
| ^^ expected `{`
|
note: the `if` expression is missing a block after this condition
--> $DIR/eq-gt-to-gt-eq.rs:13:8
|
LL | if a => 1 {}
| ^
help: you might have meant to write a "greater than or equal to" comparison
|
LL | if a >= 1 {}
| ~~

error: expected `{`, found `=>`
--> $DIR/eq-gt-to-gt-eq.rs:18:10
|
LL | if 1 => a {}
| ^^ expected `{`
|
note: the `if` expression is missing a block after this condition
--> $DIR/eq-gt-to-gt-eq.rs:18:8
|
LL | if 1 => a {}
| ^
help: you might have meant to write a "greater than or equal to" comparison
|
LL | if 1 >= a {}
| ~~

error: expected `{`, found `=>`
--> $DIR/eq-gt-to-gt-eq.rs:24:10
|
LL | if a => b && a != b {}
| ^^ expected `{`
|
note: the `if` expression is missing a block after this condition
--> $DIR/eq-gt-to-gt-eq.rs:24:8
|
LL | if a => b && a != b {}
| ^
help: you might have meant to write a "greater than or equal to" comparison
|
LL | if a >= b && a != b {}
| ~~

error: expected `{`, found `=>`
--> $DIR/eq-gt-to-gt-eq.rs:30:20
|
LL | if a != b && a => b {}
| ^^ expected `{`
|
note: the `if` expression is missing a block after this condition
--> $DIR/eq-gt-to-gt-eq.rs:30:8
|
LL | if a != b && a => b {}
| ^^^^^^^^^^^
help: you might have meant to write a "greater than or equal to" comparison
|
LL | if a != b && a >= b {}
| ~~

error: expected one of `!`, `.`, `::`, `;`, `?`, `else`, `{`, or an operator, found `=>`
--> $DIR/eq-gt-to-gt-eq.rs:36:15
|
LL | let _ = a => b;
| ^^ expected one of 8 possible tokens
|
help: you might have meant to write a "greater than or equal to" comparison
|
LL | let _ = a >= b;
| ~~

error: expected one of `!`, `.`, `::`, `?`, `{`, or an operator, found `=>`
--> $DIR/eq-gt-to-gt-eq.rs:42:13
|
LL | match a => b {
| ----- ^^ expected one of `!`, `.`, `::`, `?`, `{`, or an operator
| |
| while parsing this `match` expression
|
help: you might have meant to write a "greater than or equal to" comparison
|
LL | match a >= b {
| ~~

error: aborting due to 7 previous errors

0 comments on commit a861c89

Please sign in to comment.