Skip to content

Commit 9ea6790

Browse files
committed
Deduplicate parse recovery code
1 parent b7dc8e7 commit 9ea6790

File tree

1 file changed

+43
-35
lines changed

1 file changed

+43
-35
lines changed

src/libsyntax/parse/parser.rs

+43-35
Original file line numberDiff line numberDiff line change
@@ -2639,11 +2639,9 @@ impl<'a> Parser<'a> {
26392639
while self.token != token::CloseDelim(token::Paren) {
26402640
es.push(match self.parse_expr() {
26412641
Ok(es) => es,
2642-
Err(mut err) => { // recover from parse error in tuple list
2643-
err.emit();
2644-
self.consume_block(token::Paren);
2645-
hi = self.prev_span;
2646-
return Ok(self.mk_expr(lo.to(hi), ExprKind::Err, ThinVec::new()));
2642+
Err(err) => {
2643+
// recover from parse error in tuple list
2644+
return Ok(self.recover_seq_parse_error(token::Paren, lo, Err(err)));
26472645
}
26482646
});
26492647
recovered = self.expect_one_of(
@@ -3254,44 +3252,54 @@ impl<'a> Parser<'a> {
32543252
}
32553253
if self.expr_is_complete(&e) { break; }
32563254
match self.token {
3257-
// expr(...)
3258-
token::OpenDelim(token::Paren) => {
3259-
match self.parse_unspanned_seq(
3260-
&token::OpenDelim(token::Paren),
3261-
&token::CloseDelim(token::Paren),
3262-
SeqSep::trailing_allowed(token::Comma),
3263-
|p| Ok(p.parse_expr()?)
3264-
) {
3265-
Ok(es) => {
3255+
// expr(...)
3256+
token::OpenDelim(token::Paren) => {
3257+
let seq = self.parse_unspanned_seq(
3258+
&token::OpenDelim(token::Paren),
3259+
&token::CloseDelim(token::Paren),
3260+
SeqSep::trailing_allowed(token::Comma),
3261+
|p| Ok(p.parse_expr()?)
3262+
).map(|es| {
32663263
let nd = self.mk_call(e, es);
3267-
hi = self.prev_span;
3268-
e = self.mk_expr(lo.to(hi), nd, ThinVec::new());
3269-
}
3270-
Err(mut err) => { // recover from parse error in argument list
3271-
err.emit();
3272-
self.consume_block(token::Paren);
3273-
hi = self.prev_span;
3274-
e = self.mk_expr(lo.to(hi), ExprKind::Err, ThinVec::new());
3275-
}
3264+
let hi = self.prev_span;
3265+
self.mk_expr(lo.to(hi), nd, ThinVec::new())
3266+
});
3267+
e = self.recover_seq_parse_error(token::Paren, lo, seq);
32763268
}
3277-
}
32783269

3279-
// expr[...]
3280-
// Could be either an index expression or a slicing expression.
3281-
token::OpenDelim(token::Bracket) => {
3282-
self.bump();
3283-
let ix = self.parse_expr()?;
3284-
hi = self.span;
3285-
self.expect(&token::CloseDelim(token::Bracket))?;
3286-
let index = self.mk_index(e, ix);
3287-
e = self.mk_expr(lo.to(hi), index, ThinVec::new())
3288-
}
3289-
_ => return Ok(e)
3270+
// expr[...]
3271+
// Could be either an index expression or a slicing expression.
3272+
token::OpenDelim(token::Bracket) => {
3273+
self.bump();
3274+
let ix = self.parse_expr()?;
3275+
hi = self.span;
3276+
self.expect(&token::CloseDelim(token::Bracket))?;
3277+
let index = self.mk_index(e, ix);
3278+
e = self.mk_expr(lo.to(hi), index, ThinVec::new())
3279+
}
3280+
_ => return Ok(e)
32903281
}
32913282
}
32923283
return Ok(e);
32933284
}
32943285

3286+
fn recover_seq_parse_error(
3287+
&mut self,
3288+
delim: token::DelimToken,
3289+
lo: Span,
3290+
result: PResult<'a, P<Expr>>,
3291+
) -> P<Expr> {
3292+
match result {
3293+
Ok(x) => x,
3294+
Err(mut err) => {
3295+
err.emit();
3296+
// recover from parse error
3297+
self.consume_block(delim);
3298+
self.mk_expr(lo.to(self.prev_span), ExprKind::Err, ThinVec::new())
3299+
}
3300+
}
3301+
}
3302+
32953303
crate fn process_potential_macro_variable(&mut self) {
32963304
let (token, span) = match self.token {
32973305
token::Dollar if self.span.ctxt() != syntax_pos::hygiene::SyntaxContext::empty() &&

0 commit comments

Comments
 (0)