fixes #101477: Recover from typo where == is used in place of =

This commit is contained in:
yukang 2022-09-07 12:26:50 +08:00
parent e7c7aa7288
commit ddb225f1f5
8 changed files with 73 additions and 0 deletions

View File

@ -153,3 +153,6 @@ parser_left_arrow_operator = unexpected token: `<-`
parser_remove_let = expected pattern, found `let`
.suggestion = remove the unnecessary `let` keyword
parser_use_eq_instead = unexpected `==`
.suggestion = try using `=` instead

View File

@ -713,6 +713,14 @@ pub(crate) struct RemoveLet {
pub span: Span,
}
#[derive(SessionDiagnostic)]
#[diag(parser::use_eq_instead)]
pub(crate) struct UseEqInstead {
#[primary_span]
#[suggestion_short(applicability = "machine-applicable", code = "=")]
pub span: Span,
}
// SnapshotParser is used to create a snapshot of the parser
// without causing duplicate errors being emitted when the `Parser`
// is dropped.
@ -957,6 +965,14 @@ impl<'a> Parser<'a> {
}
}
if self.token.kind == TokenKind::EqEq
&& self.prev_token.is_ident()
&& expected.iter().any(|tok| matches!(tok, TokenType::Token(TokenKind::Eq)))
{
// Likely typo: `=` → `==` in let expr or enum item
return Err(self.sess.create_err(UseEqInstead { span: self.token.span }));
}
let expect = tokens_to_string(&expected);
let actual = super::token_descr(&self.token);
let (msg_exp, (label_sp, label_exp)) = if expected.len() > 1 {

View File

@ -0,0 +1,10 @@
// run-rustfix
#[allow(dead_code)]
enum Demo {
A = 1,
B = 2 //~ ERROR unexpected `==`
//~^ expected item, found `==`
}
fn main() {}

View File

@ -0,0 +1,10 @@
// run-rustfix
#[allow(dead_code)]
enum Demo {
A = 1,
B == 2 //~ ERROR unexpected `==`
//~^ expected item, found `==`
}
fn main() {}

View File

@ -0,0 +1,14 @@
error: unexpected `==`
--> $DIR/issue-101477-enum.rs:6:7
|
LL | B == 2
| ^^ help: try using `=` instead
error: expected item, found `==`
--> $DIR/issue-101477-enum.rs:6:7
|
LL | B == 2
| ^^ expected item
error: aborting due to 2 previous errors

View File

@ -0,0 +1,6 @@
// run-rustfix
fn main() {
let x = 2; //~ ERROR unexpected `==`
println!("x: {}", x)
}

View File

@ -0,0 +1,6 @@
// run-rustfix
fn main() {
let x == 2; //~ ERROR unexpected `==`
println!("x: {}", x)
}

View File

@ -0,0 +1,8 @@
error: unexpected `==`
--> $DIR/issue-101477-let.rs:4:11
|
LL | let x == 2;
| ^^ help: try using `=` instead
error: aborting due to previous error