925: improve error recovery r=matklad a=matklad



Co-authored-by: Aleksey Kladov <aleksey.kladov@gmail.com>
This commit is contained in:
bors[bot] 2019-03-04 12:42:21 +00:00
commit 8a5d48b6c6
5 changed files with 83 additions and 61 deletions

View file

@ -182,21 +182,11 @@ fn name_ref(p: &mut Parser) {
}
fn error_block(p: &mut Parser, message: &str) {
go(p, Some(message));
fn go(p: &mut Parser, message: Option<&str>) {
assert!(p.at(L_CURLY));
let m = p.start();
if let Some(message) = message {
p.error(message);
}
p.bump();
while !p.at(EOF) && !p.at(R_CURLY) {
match p.current() {
L_CURLY => go(p, None),
_ => p.bump(),
}
}
p.eat(R_CURLY);
m.complete(p, ERROR);
}
assert!(p.at(L_CURLY));
let m = p.start();
p.error(message);
p.bump();
expressions::expr_block_contents(p);
p.eat(R_CURLY);
m.complete(p, ERROR);
}

View file

@ -33,6 +33,12 @@ pub(crate) fn block(p: &mut Parser) {
}
let m = p.start();
p.bump();
expr_block_contents(p);
p.expect(R_CURLY);
m.complete(p, BLOCK);
}
pub(crate) fn expr_block_contents(p: &mut Parser) {
// This is checked by a validator
attributes::inner_attributes(p);
@ -101,8 +107,6 @@ pub(crate) fn block(p: &mut Parser) {
}
}
}
p.expect(R_CURLY);
m.complete(p, BLOCK);
// test let_stmt;
// fn foo() {

View file

@ -28,29 +28,36 @@ SOURCE_FILE@[0; 95)
ERROR@[20; 80)
L_CURLY@[20; 21)
WHITESPACE@[21; 26)
IF_KW@[26; 28)
WHITESPACE@[28; 29)
TRUE_KW@[29; 33)
WHITESPACE@[33; 34)
ERROR@[34; 51)
L_CURLY@[34; 35)
WHITESPACE@[35; 44)
INT_NUMBER@[44; 45) "1"
WHITESPACE@[45; 50)
R_CURLY@[50; 51)
WHITESPACE@[51; 52)
ELSE_KW@[52; 56)
WHITESPACE@[56; 57)
ERROR@[57; 78)
L_CURLY@[57; 58)
WHITESPACE@[58; 67)
INT_NUMBER@[67; 68) "2"
WHITESPACE@[68; 69)
PLUS@[69; 70)
WHITESPACE@[70; 71)
INT_NUMBER@[71; 72) "3"
WHITESPACE@[72; 77)
R_CURLY@[77; 78)
IF_EXPR@[26; 78)
IF_KW@[26; 28)
WHITESPACE@[28; 29)
CONDITION@[29; 33)
LITERAL@[29; 33)
TRUE_KW@[29; 33)
WHITESPACE@[33; 34)
BLOCK@[34; 51)
L_CURLY@[34; 35)
WHITESPACE@[35; 44)
LITERAL@[44; 45)
INT_NUMBER@[44; 45) "1"
WHITESPACE@[45; 50)
R_CURLY@[50; 51)
WHITESPACE@[51; 52)
ELSE_KW@[52; 56)
WHITESPACE@[56; 57)
BLOCK@[57; 78)
L_CURLY@[57; 58)
WHITESPACE@[58; 67)
BIN_EXPR@[67; 72)
LITERAL@[67; 68)
INT_NUMBER@[67; 68) "2"
WHITESPACE@[68; 69)
PLUS@[69; 70)
WHITESPACE@[70; 71)
LITERAL@[71; 72)
INT_NUMBER@[71; 72) "3"
WHITESPACE@[72; 77)
R_CURLY@[77; 78)
WHITESPACE@[78; 79)
R_CURLY@[79; 80)
WHITESPACE@[80; 82)

View file

@ -28,10 +28,24 @@ SOURCE_FILE@[0; 43)
ERROR@[17; 31)
L_CURLY@[17; 18)
WHITESPACE@[18; 23)
IDENT@[23; 24) "f"
COLON@[24; 25)
EXPR_STMT@[23; 24)
PATH_EXPR@[23; 24)
PATH@[23; 24)
PATH_SEGMENT@[23; 24)
NAME_REF@[23; 24)
IDENT@[23; 24) "f"
err: `expected SEMI`
err: `expected expression`
EXPR_STMT@[24; 25)
ERROR@[24; 25)
COLON@[24; 25)
err: `expected SEMI`
WHITESPACE@[25; 26)
IDENT@[26; 29) "u32"
PATH_EXPR@[26; 29)
PATH@[26; 29)
PATH_SEGMENT@[26; 29)
NAME_REF@[26; 29)
IDENT@[26; 29) "u32"
WHITESPACE@[29; 30)
R_CURLY@[30; 31)
WHITESPACE@[31; 33)

View file

@ -34,22 +34,29 @@ SOURCE_FILE@[0; 349)
ERROR@[42; 93)
L_CURLY@[42; 43)
WHITESPACE@[43; 48)
IDENT@[48; 51) "vec"
EXCL@[51; 52)
L_BRACK@[52; 53)
WHITESPACE@[53; 62)
DOLLAR@[62; 63)
L_PAREN@[63; 64)
IDENT@[64; 78) "parse_use_tree"
L_PAREN@[78; 79)
DOLLAR@[79; 80)
IDENT@[80; 81) "s"
R_PAREN@[81; 82)
COMMA@[82; 83)
R_PAREN@[83; 84)
STAR@[84; 85)
WHITESPACE@[85; 90)
R_BRACK@[90; 91)
MACRO_CALL@[48; 91)
PATH@[48; 51)
PATH_SEGMENT@[48; 51)
NAME_REF@[48; 51)
IDENT@[48; 51) "vec"
EXCL@[51; 52)
TOKEN_TREE@[52; 91)
L_BRACK@[52; 53)
WHITESPACE@[53; 62)
DOLLAR@[62; 63)
TOKEN_TREE@[63; 84)
L_PAREN@[63; 64)
IDENT@[64; 78) "parse_use_tree"
TOKEN_TREE@[78; 82)
L_PAREN@[78; 79)
DOLLAR@[79; 80)
IDENT@[80; 81) "s"
R_PAREN@[81; 82)
COMMA@[82; 83)
R_PAREN@[83; 84)
STAR@[84; 85)
WHITESPACE@[85; 90)
R_BRACK@[90; 91)
WHITESPACE@[91; 92)
R_CURLY@[92; 93)
WHITESPACE@[93; 95)