mirror of
https://github.com/rust-lang/rust-analyzer
synced 2025-01-12 21:28:51 +00:00
better pattern recovery
This commit is contained in:
parent
537ea620bb
commit
dea6ed73fa
6 changed files with 92 additions and 8 deletions
|
@ -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(_) |
|
||||
|
|
|
@ -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(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -334,7 +334,7 @@ Grammar(
|
|||
),
|
||||
"ModuleItem": (
|
||||
enum: ["StructDef", "EnumDef", "FnDef", "TraitDef", "ImplItem",
|
||||
"UseItem", "ExternCrateItem" ]
|
||||
"UseItem", "ExternCrateItem", "ConstDef", "StaticDef" ]
|
||||
),
|
||||
|
||||
"TupleExpr": (),
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
};
|
||||
|
|
|
@ -1,4 +1,12 @@
|
|||
fn foo() {
|
||||
let foo =
|
||||
let bar = 1;
|
||||
let
|
||||
let baz = 92;
|
||||
let
|
||||
if true {}
|
||||
let
|
||||
while true {}
|
||||
let
|
||||
loop {}
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in a new issue