From 8fc7f438c4347e027deda5cda4bcd5e560610bb7 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Fri, 31 Aug 2018 13:35:48 +0300 Subject: start item recovery --- crates/libsyntax2/src/grammar/items/mod.rs | 6 +++++- crates/libsyntax2/src/grammar/items/structs.rs | 4 ++-- crates/libsyntax2/src/grammar/items/traits.rs | 2 +- crates/libsyntax2/src/grammar/mod.rs | 8 ++++++-- 4 files changed, 14 insertions(+), 6 deletions(-) (limited to 'crates/libsyntax2/src/grammar') diff --git a/crates/libsyntax2/src/grammar/items/mod.rs b/crates/libsyntax2/src/grammar/items/mod.rs index 7c6f7b63e..e672aa419 100644 --- a/crates/libsyntax2/src/grammar/items/mod.rs +++ b/crates/libsyntax2/src/grammar/items/mod.rs @@ -24,6 +24,10 @@ pub(super) enum ItemFlavor { Mod, Trait } +const ITEM_RECOVERY_SET: TokenSet = + token_set![FN_KW, STRUCT_KW, ENUM_KW, IMPL_KW, TRAIT_KW, CONST_KW, STATIC_KW, LET_KW, + MOD_KW, PUB_KW, CRATE_KW]; + pub(super) fn item_or_macro(p: &mut Parser, stop_on_r_curly: bool, flavor: ItemFlavor) { let m = p.start(); match maybe_item(p, flavor) { @@ -231,7 +235,7 @@ fn fn_def(p: &mut Parser, flavor: ItemFlavor) { assert!(p.at(FN_KW)); p.bump(); - name(p); + name_r(p, ITEM_RECOVERY_SET); // test function_type_params // fn foo(){} type_params::opt_type_param_list(p); diff --git a/crates/libsyntax2/src/grammar/items/structs.rs b/crates/libsyntax2/src/grammar/items/structs.rs index 180205393..f1e78865c 100644 --- a/crates/libsyntax2/src/grammar/items/structs.rs +++ b/crates/libsyntax2/src/grammar/items/structs.rs @@ -4,7 +4,7 @@ pub(super) fn struct_def(p: &mut Parser) { assert!(p.at(STRUCT_KW)); p.bump(); - name(p); + name_r(p, ITEM_RECOVERY_SET); type_params::opt_type_param_list(p); match p.current() { WHERE_KW => { @@ -41,7 +41,7 @@ pub(super) fn struct_def(p: &mut Parser) { pub(super) fn enum_def(p: &mut Parser) { assert!(p.at(ENUM_KW)); p.bump(); - name(p); + name_r(p, ITEM_RECOVERY_SET); type_params::opt_type_param_list(p); type_params::opt_where_clause(p); if p.at(L_CURLY) { diff --git a/crates/libsyntax2/src/grammar/items/traits.rs b/crates/libsyntax2/src/grammar/items/traits.rs index 01b79e3c9..9d21d4d36 100644 --- a/crates/libsyntax2/src/grammar/items/traits.rs +++ b/crates/libsyntax2/src/grammar/items/traits.rs @@ -5,7 +5,7 @@ use super::*; pub(super) fn trait_def(p: &mut Parser) { assert!(p.at(TRAIT_KW)); p.bump(); - name(p); + name_r(p, ITEM_RECOVERY_SET); type_params::opt_type_param_list(p); if p.at(COLON) { type_params::bounds(p); diff --git a/crates/libsyntax2/src/grammar/mod.rs b/crates/libsyntax2/src/grammar/mod.rs index 1acecac41..339664af3 100644 --- a/crates/libsyntax2/src/grammar/mod.rs +++ b/crates/libsyntax2/src/grammar/mod.rs @@ -129,16 +129,20 @@ fn opt_fn_ret_type(p: &mut Parser) -> bool { } } -fn name(p: &mut Parser) { +fn name_r(p: &mut Parser, recovery: TokenSet) { if p.at(IDENT) { let m = p.start(); p.bump(); m.complete(p, NAME); } else { - p.err_and_bump("expected a name"); + p.err_recover("expected a name", recovery); } } +fn name(p: &mut Parser) { + name_r(p, TokenSet::EMPTY) +} + fn name_ref(p: &mut Parser) { if p.at(IDENT) { let m = p.start(); -- cgit v1.2.3