Deduplicate parse recovery code
This commit is contained in:
parent
b7dc8e71cc
commit
9ea6790a64
1 changed files with 43 additions and 35 deletions
|
@ -2639,11 +2639,9 @@ impl<'a> Parser<'a> {
|
||||||
while self.token != token::CloseDelim(token::Paren) {
|
while self.token != token::CloseDelim(token::Paren) {
|
||||||
es.push(match self.parse_expr() {
|
es.push(match self.parse_expr() {
|
||||||
Ok(es) => es,
|
Ok(es) => es,
|
||||||
Err(mut err) => { // recover from parse error in tuple list
|
Err(err) => {
|
||||||
err.emit();
|
// recover from parse error in tuple list
|
||||||
self.consume_block(token::Paren);
|
return Ok(self.recover_seq_parse_error(token::Paren, lo, Err(err)));
|
||||||
hi = self.prev_span;
|
|
||||||
return Ok(self.mk_expr(lo.to(hi), ExprKind::Err, ThinVec::new()));
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
recovered = self.expect_one_of(
|
recovered = self.expect_one_of(
|
||||||
|
@ -3256,24 +3254,17 @@ impl<'a> Parser<'a> {
|
||||||
match self.token {
|
match self.token {
|
||||||
// expr(...)
|
// expr(...)
|
||||||
token::OpenDelim(token::Paren) => {
|
token::OpenDelim(token::Paren) => {
|
||||||
match self.parse_unspanned_seq(
|
let seq = self.parse_unspanned_seq(
|
||||||
&token::OpenDelim(token::Paren),
|
&token::OpenDelim(token::Paren),
|
||||||
&token::CloseDelim(token::Paren),
|
&token::CloseDelim(token::Paren),
|
||||||
SeqSep::trailing_allowed(token::Comma),
|
SeqSep::trailing_allowed(token::Comma),
|
||||||
|p| Ok(p.parse_expr()?)
|
|p| Ok(p.parse_expr()?)
|
||||||
) {
|
).map(|es| {
|
||||||
Ok(es) => {
|
|
||||||
let nd = self.mk_call(e, es);
|
let nd = self.mk_call(e, es);
|
||||||
hi = self.prev_span;
|
let hi = self.prev_span;
|
||||||
e = self.mk_expr(lo.to(hi), nd, ThinVec::new());
|
self.mk_expr(lo.to(hi), nd, ThinVec::new())
|
||||||
}
|
});
|
||||||
Err(mut err) => { // recover from parse error in argument list
|
e = self.recover_seq_parse_error(token::Paren, lo, seq);
|
||||||
err.emit();
|
|
||||||
self.consume_block(token::Paren);
|
|
||||||
hi = self.prev_span;
|
|
||||||
e = self.mk_expr(lo.to(hi), ExprKind::Err, ThinVec::new());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// expr[...]
|
// expr[...]
|
||||||
|
@ -3292,6 +3283,23 @@ impl<'a> Parser<'a> {
|
||||||
return Ok(e);
|
return Ok(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn recover_seq_parse_error(
|
||||||
|
&mut self,
|
||||||
|
delim: token::DelimToken,
|
||||||
|
lo: Span,
|
||||||
|
result: PResult<'a, P<Expr>>,
|
||||||
|
) -> P<Expr> {
|
||||||
|
match result {
|
||||||
|
Ok(x) => x,
|
||||||
|
Err(mut err) => {
|
||||||
|
err.emit();
|
||||||
|
// recover from parse error
|
||||||
|
self.consume_block(delim);
|
||||||
|
self.mk_expr(lo.to(self.prev_span), ExprKind::Err, ThinVec::new())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
crate fn process_potential_macro_variable(&mut self) {
|
crate fn process_potential_macro_variable(&mut self) {
|
||||||
let (token, span) = match self.token {
|
let (token, span) = match self.token {
|
||||||
token::Dollar if self.span.ctxt() != syntax_pos::hygiene::SyntaxContext::empty() &&
|
token::Dollar if self.span.ctxt() != syntax_pos::hygiene::SyntaxContext::empty() &&
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue