Auto merge of #37245 - goffrie:recovery, r=nrc

Recover out of an enum or struct's braced block.

If we encounter a syntax error inside of a braced block, then we should
fail by consuming the rest of the block if possible.
This implements such recovery for enums and structs.

Fixes #37113.
This commit is contained in:
bors 2016-10-27 07:19:16 -07:00 committed by GitHub
commit 07436946b6
5 changed files with 112 additions and 2 deletions

View file

@ -5145,7 +5145,11 @@ impl<'a> Parser<'a> {
let mut fields = Vec::new();
if self.eat(&token::OpenDelim(token::Brace)) {
while self.token != token::CloseDelim(token::Brace) {
fields.push(self.parse_struct_decl_field()?);
fields.push(self.parse_struct_decl_field().map_err(|e| {
self.recover_stmt();
self.eat(&token::CloseDelim(token::Brace));
e
})?);
}
self.bump();
@ -5673,7 +5677,11 @@ impl<'a> Parser<'a> {
generics.where_clause = self.parse_where_clause()?;
self.expect(&token::OpenDelim(token::Brace))?;
let enum_definition = self.parse_enum_def(&generics)?;
let enum_definition = self.parse_enum_def(&generics).map_err(|e| {
self.recover_stmt();
self.eat(&token::CloseDelim(token::Brace));
e
})?;
Ok((id, ItemKind::Enum(enum_definition, generics), None))
}