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

@ -13,6 +13,8 @@ impl ModuleScope {
ast::ModuleItem::StructDef(item) => Entry::new(item),
ast::ModuleItem::EnumDef(item) => Entry::new(item),
ast::ModuleItem::FnDef(item) => Entry::new(item),
ast::ModuleItem::ConstDef(item) => Entry::new(item),
ast::ModuleItem::StaticDef(item) => Entry::new(item),
ast::ModuleItem::TraitDef(item) => Entry::new(item),
ast::ModuleItem::ExternCrateItem(_) |
ast::ModuleItem::ImplItem(_) |

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;
}
};

View file

@ -1,4 +1,12 @@
fn foo() {
let foo =
let bar = 1;
let
let baz = 92;
let
if true {}
let
while true {}
let
loop {}
}

View file

@ -1,5 +1,5 @@
ROOT@[0; 44)
FN_DEF@[0; 43)
ROOT@[0; 139)
FN_DEF@[0; 138)
FN_KW@[0; 2)
WHITESPACE@[2; 3)
NAME@[3; 6)
@ -8,7 +8,7 @@ ROOT@[0; 44)
L_PAREN@[6; 7)
R_PAREN@[7; 8)
WHITESPACE@[8; 9)
BLOCK@[9; 43)
BLOCK@[9; 138)
L_CURLY@[9; 10)
WHITESPACE@[10; 15)
LET_STMT@[15; 24)
@ -34,6 +34,70 @@ ROOT@[0; 44)
LITERAL@[39; 40)
INT_NUMBER@[39; 40) "1"
SEMI@[40; 41)
WHITESPACE@[41; 42)
R_CURLY@[42; 43)
WHITESPACE@[43; 44)
WHITESPACE@[41; 46)
LET_STMT@[46; 49)
LET_KW@[46; 49)
err: `expected pattern`
err: `expected SEMI`
WHITESPACE@[49; 54)
LET_STMT@[54; 67)
LET_KW@[54; 57)
WHITESPACE@[57; 58)
BIND_PAT@[58; 61)
NAME@[58; 61)
IDENT@[58; 61) "baz"
WHITESPACE@[61; 62)
EQ@[62; 63)
WHITESPACE@[63; 64)
LITERAL@[64; 66)
INT_NUMBER@[64; 66) "92"
SEMI@[66; 67)
WHITESPACE@[67; 72)
LET_STMT@[72; 75)
LET_KW@[72; 75)
err: `expected pattern`
err: `expected SEMI`
WHITESPACE@[75; 80)
EXPR_STMT@[80; 90)
IF_EXPR@[80; 90)
IF_KW@[80; 82)
WHITESPACE@[82; 83)
CONDITION@[83; 87)
LITERAL@[83; 87)
TRUE_KW@[83; 87)
WHITESPACE@[87; 88)
BLOCK@[88; 90)
L_CURLY@[88; 89)
R_CURLY@[89; 90)
WHITESPACE@[90; 95)
LET_STMT@[95; 98)
LET_KW@[95; 98)
err: `expected pattern`
err: `expected SEMI`
WHITESPACE@[98; 103)
EXPR_STMT@[103; 116)
WHILE_EXPR@[103; 116)
WHILE_KW@[103; 108)
WHITESPACE@[108; 109)
CONDITION@[109; 113)
LITERAL@[109; 113)
TRUE_KW@[109; 113)
WHITESPACE@[113; 114)
BLOCK@[114; 116)
L_CURLY@[114; 115)
R_CURLY@[115; 116)
WHITESPACE@[116; 121)
LET_STMT@[121; 124)
LET_KW@[121; 124)
err: `expected pattern`
err: `expected SEMI`
WHITESPACE@[124; 129)
LOOP_EXPR@[129; 136)
LOOP_KW@[129; 133)
WHITESPACE@[133; 134)
BLOCK@[134; 136)
L_CURLY@[134; 135)
R_CURLY@[135; 136)
WHITESPACE@[136; 137)
R_CURLY@[137; 138)
WHITESPACE@[138; 139)