Skip to content

Commit

Permalink
review comment: move recovery code to its own function
Browse files Browse the repository at this point in the history
  • Loading branch information
estebank committed Sep 14, 2021
1 parent b82ec36 commit ffc623a
Showing 1 changed file with 19 additions and 2 deletions.
21 changes: 19 additions & 2 deletions compiler/rustc_parse/src/parser/expr.rs
Expand Up @@ -1049,6 +1049,23 @@ impl<'a> Parser<'a> {
let mut seq = self.parse_paren_expr_seq().map(|args| {
self.mk_expr(lo.to(self.prev_token.span), self.mk_call(fun, args), AttrVec::new())
});
if let Some(expr) =
self.maybe_recover_struct_lit_bad_delims(lo, open_paren, &mut seq, snapshot)
{
return expr;
}
self.recover_seq_parse_error(token::Paren, lo, seq)
}

/// If we encounter a parser state that looks like the user has written a `struct` literal with
/// parentheses instead of braces, recover the parser state and provide suggestions.
fn maybe_recover_struct_lit_bad_delims(
&mut self,
lo: Span,
open_paren: Span,
seq: &mut PResult<'a, P<Expr>>,
snapshot: Option<(Self, ExprKind)>,
) -> Option<P<Expr>> {
match (seq.as_mut(), snapshot) {
(Err(ref mut err), Some((mut snapshot, ExprKind::Path(None, path)))) => {
let name = pprust::path_to_string(&path);
Expand Down Expand Up @@ -1079,15 +1096,15 @@ impl<'a> Parser<'a> {
Applicability::MaybeIncorrect,
)
.emit();
return self.mk_expr_err(span);
return Some(self.mk_expr_err(span));
}
Ok(_) => {}
Err(mut err) => err.emit(),
}
}
_ => {}
}
self.recover_seq_parse_error(token::Paren, lo, seq)
None
}

/// Parse an indexing expression `expr[...]`.
Expand Down

0 comments on commit ffc623a

Please sign in to comment.