mirror of
https://github.com/rust-lang/rust-analyzer
synced 2024-12-27 05:23:24 +00:00
Merge #925
925: improve error recovery r=matklad a=matklad Co-authored-by: Aleksey Kladov <aleksey.kladov@gmail.com>
This commit is contained in:
commit
8a5d48b6c6
5 changed files with 83 additions and 61 deletions
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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() {
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in a new issue