better pattern recovery

This commit is contained in:
Aleksey Kladov
2018-08-28 19:35:09 +03:00
parent 537ea620bb
commit dea6ed73fa
6 changed files with 92 additions and 8 deletions

View File

@@ -893,6 +893,8 @@ pub enum ModuleItem<'a> {
ImplItem(ImplItem<'a>),
UseItem(UseItem<'a>),
ExternCrateItem(ExternCrateItem<'a>),
ConstDef(ConstDef<'a>),
StaticDef(StaticDef<'a>),
}
impl<'a> AstNode<'a> for ModuleItem<'a> {
@@ -905,6 +907,8 @@ impl<'a> AstNode<'a> for ModuleItem<'a> {
IMPL_ITEM => Some(ModuleItem::ImplItem(ImplItem { syntax })),
USE_ITEM => Some(ModuleItem::UseItem(UseItem { syntax })),
EXTERN_CRATE_ITEM => Some(ModuleItem::ExternCrateItem(ExternCrateItem { syntax })),
CONST_DEF => Some(ModuleItem::ConstDef(ConstDef { syntax })),
STATIC_DEF => Some(ModuleItem::StaticDef(StaticDef { syntax })),
_ => None,
}
}
@@ -917,6 +921,8 @@ impl<'a> AstNode<'a> for ModuleItem<'a> {
ModuleItem::ImplItem(inner) => inner.syntax(),
ModuleItem::UseItem(inner) => inner.syntax(),
ModuleItem::ExternCrateItem(inner) => inner.syntax(),
ModuleItem::ConstDef(inner) => inner.syntax(),
ModuleItem::StaticDef(inner) => inner.syntax(),
}
}
}

View File

@@ -334,7 +334,7 @@ Grammar(
),
"ModuleItem": (
enum: ["StructDef", "EnumDef", "FnDef", "TraitDef", "ImplItem",
"UseItem", "ExternCrateItem" ]
"UseItem", "ExternCrateItem", "ConstDef", "StaticDef" ]
),
"TupleExpr": (),

View File

@@ -22,6 +22,10 @@ pub(super) fn pattern(p: &mut Parser) {
}
}
const PAT_RECOVERY_SET: TokenSet =
token_set![LET_KW, IF_KW, WHILE_KW, LOOP_KW, MATCH_KW];
fn atom_pat(p: &mut Parser) -> Option<CompletedMarker> {
let la0 = p.nth(0);
let la1 = p.nth(1);
@@ -52,7 +56,7 @@ fn atom_pat(p: &mut Parser) -> Option<CompletedMarker> {
L_PAREN => tuple_pat(p),
L_BRACK => slice_pat(p),
_ => {
p.err_and_bump("expected pattern");
p.err_recover("expected pattern", PAT_RECOVERY_SET);
return None;
}
};