Fix error recovery in format macro parsing
This commit is contained in:
parent
497ee321af
commit
a8421cacfe
4 changed files with 94 additions and 18 deletions
|
@ -164,23 +164,22 @@ fn parse_args<'a>(
|
|||
p.clear_expected_tokens();
|
||||
}
|
||||
|
||||
// `Parser::expect` tries to recover using the
|
||||
// `Parser::unexpected_try_recover` function. This function is able
|
||||
// to recover if the expected token is a closing delimiter.
|
||||
//
|
||||
// As `,` is not a closing delimiter, it will always return an `Err`
|
||||
// variant.
|
||||
let mut err = p.expect(&token::Comma).unwrap_err();
|
||||
|
||||
match token::TokenKind::Comma.similar_tokens() {
|
||||
Some(tks) if tks.contains(&p.token.kind) => {
|
||||
// If a similar token is found, then it may be a typo. We
|
||||
// consider it as a comma, and continue parsing.
|
||||
err.emit();
|
||||
p.bump();
|
||||
match p.expect(&token::Comma) {
|
||||
Err(mut err) => {
|
||||
match token::TokenKind::Comma.similar_tokens() {
|
||||
Some(tks) if tks.contains(&p.token.kind) => {
|
||||
// If a similar token is found, then it may be a typo. We
|
||||
// consider it as a comma, and continue parsing.
|
||||
err.emit();
|
||||
p.bump();
|
||||
}
|
||||
// Otherwise stop the parsing and return the error.
|
||||
_ => return Err(err),
|
||||
}
|
||||
}
|
||||
Ok(recovered) => {
|
||||
assert!(recovered);
|
||||
}
|
||||
// Otherwise stop the parsing and return the error.
|
||||
_ => return Err(err),
|
||||
}
|
||||
}
|
||||
first = false;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue