better error recovery for use trees

This commit is contained in:
Aleksey Kladov 2019-09-05 19:53:07 +03:00
parent edc2016f8b
commit b2be998b7b
5 changed files with 65 additions and 3 deletions

View file

@ -31,7 +31,7 @@ pub(super) enum ItemFlavor {
pub(super) 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
CRATE_KW, USE_KW
];
pub(super) fn item_or_macro(p: &mut Parser, stop_on_r_curly: bool, flavor: ItemFlavor) {

View file

@ -101,7 +101,10 @@ fn use_tree(p: &mut Parser) {
}
_ => {
m.abandon(p);
p.err_and_bump("expected one of `*`, `::`, `{`, `self`, `super` or an indentifier");
p.err_recover(
"expected one of `*`, `::`, `{`, `self`, `super` or an identifier",
ITEM_RECOVERY_SET,
);
return;
}
}

View file

@ -28,7 +28,7 @@ SOURCE_FILE@[0; 42)
WHITESPACE@[41; 42) "\n"
error 23: expected `[`
error 23: expected an item
error 27: expected one of `*`, `::`, `{`, `self`, `super` or an indentifier
error 27: expected one of `*`, `::`, `{`, `self`, `super` or an identifier
error 28: expected SEMI
error 31: expected EXCL
error 31: expected `{`, `[`, `(`

View file

@ -0,0 +1,5 @@
use foo::bar;
use
use crate::baz;
use
fn f() {}

View file

@ -0,0 +1,54 @@
SOURCE_FILE@[0; 48)
USE_ITEM@[0; 13)
USE_KW@[0; 3) "use"
WHITESPACE@[3; 4) " "
USE_TREE@[4; 12)
PATH@[4; 12)
PATH@[4; 7)
PATH_SEGMENT@[4; 7)
NAME_REF@[4; 7)
IDENT@[4; 7) "foo"
COLONCOLON@[7; 9) "::"
PATH_SEGMENT@[9; 12)
NAME_REF@[9; 12)
IDENT@[9; 12) "bar"
SEMI@[12; 13) ";"
WHITESPACE@[13; 14) "\n"
USE_ITEM@[14; 17)
USE_KW@[14; 17) "use"
WHITESPACE@[17; 18) "\n"
USE_ITEM@[18; 33)
USE_KW@[18; 21) "use"
WHITESPACE@[21; 22) " "
USE_TREE@[22; 32)
PATH@[22; 32)
PATH@[22; 27)
PATH_SEGMENT@[22; 27)
CRATE_KW@[22; 27) "crate"
COLONCOLON@[27; 29) "::"
PATH_SEGMENT@[29; 32)
NAME_REF@[29; 32)
IDENT@[29; 32) "baz"
SEMI@[32; 33) ";"
WHITESPACE@[33; 34) "\n"
USE_ITEM@[34; 37)
USE_KW@[34; 37) "use"
WHITESPACE@[37; 38) "\n"
FN_DEF@[38; 47)
FN_KW@[38; 40) "fn"
WHITESPACE@[40; 41) " "
NAME@[41; 42)
IDENT@[41; 42) "f"
PARAM_LIST@[42; 44)
L_PAREN@[42; 43) "("
R_PAREN@[43; 44) ")"
WHITESPACE@[44; 45) " "
BLOCK_EXPR@[45; 47)
BLOCK@[45; 47)
L_CURLY@[45; 46) "{"
R_CURLY@[46; 47) "}"
WHITESPACE@[47; 48) "\n"
error 17: expected one of `*`, `::`, `{`, `self`, `super` or an identifier
error 17: expected SEMI
error 37: expected one of `*`, `::`, `{`, `self`, `super` or an identifier
error 37: expected SEMI