Try to recover from a => -> = or -> typo in a match arm

This commit is contained in:
Fabian Wolff 2021-10-03 14:14:35 +02:00
parent edebf77e00
commit cf19131cb3
4 changed files with 67 additions and 1 deletions

View File

@ -2322,7 +2322,21 @@ impl<'a> Parser<'a> {
None
};
let arrow_span = this.token.span;
this.expect(&token::FatArrow)?;
if let Err(mut err) = this.expect(&token::FatArrow) {
// We might have a `=>` -> `=` or `->` typo (issue #89396).
if let token::Eq | token::RArrow = this.token.kind {
err.span_suggestion(
this.token.span,
"try using a fat arrow here",
"=>".to_string(),
Applicability::MaybeIncorrect,
);
err.emit();
this.bump();
} else {
return Err(err);
}
}
let arm_start_span = this.token.span;
let expr = this.parse_expr_res(Restrictions::STMT_EXPR, None).map_err(|mut err| {

View File

@ -0,0 +1,16 @@
// Regression test for issue #89396: Try to recover from a
// `=>` -> `=` or `->` typo in a match arm.
// run-rustfix
fn main() {
let opt = Some(42);
let _ = match opt {
Some(_) => true,
//~^ ERROR: expected one of
//~| HELP: try using a fat arrow here
None => false,
//~^ ERROR: expected one of
//~| HELP: try using a fat arrow here
};
}

View File

@ -0,0 +1,16 @@
// Regression test for issue #89396: Try to recover from a
// `=>` -> `=` or `->` typo in a match arm.
// run-rustfix
fn main() {
let opt = Some(42);
let _ = match opt {
Some(_) = true,
//~^ ERROR: expected one of
//~| HELP: try using a fat arrow here
None -> false,
//~^ ERROR: expected one of
//~| HELP: try using a fat arrow here
};
}

View File

@ -0,0 +1,20 @@
error: expected one of `=>`, `if`, or `|`, found `=`
--> $DIR/issue-89396.rs:9:17
|
LL | Some(_) = true,
| ^
| |
| expected one of `=>`, `if`, or `|`
| help: try using a fat arrow here: `=>`
error: expected one of `=>`, `@`, `if`, or `|`, found `->`
--> $DIR/issue-89396.rs:12:14
|
LL | None -> false,
| ^^
| |
| expected one of `=>`, `@`, `if`, or `|`
| help: try using a fat arrow here: `=>`
error: aborting due to 2 previous errors