diff options
author | Aleksey Kladov <[email protected]> | 2019-03-04 11:24:02 +0000 |
---|---|---|
committer | Aleksey Kladov <[email protected]> | 2019-03-04 12:31:18 +0000 |
commit | 77f2381eea2ca4da6c6d7dc81322be542e3dbb87 (patch) | |
tree | a6d825136ef86cef49f57d1cf358911d24735b21 /crates | |
parent | 3000b13df21fc8e9bbcaf91310d3eaaf21bc413e (diff) |
improve error recovery
parse the contents of error block as an expression
Diffstat (limited to 'crates')
4 files changed, 77 insertions, 59 deletions
diff --git a/crates/ra_parser/src/grammar.rs b/crates/ra_parser/src/grammar.rs index 15aab6c6f..f94702e97 100644 --- a/crates/ra_parser/src/grammar.rs +++ b/crates/ra_parser/src/grammar.rs | |||
@@ -182,21 +182,11 @@ fn name_ref(p: &mut Parser) { | |||
182 | } | 182 | } |
183 | 183 | ||
184 | fn error_block(p: &mut Parser, message: &str) { | 184 | fn error_block(p: &mut Parser, message: &str) { |
185 | go(p, Some(message)); | 185 | assert!(p.at(L_CURLY)); |
186 | fn go(p: &mut Parser, message: Option<&str>) { | 186 | let m = p.start(); |
187 | assert!(p.at(L_CURLY)); | 187 | p.error(message); |
188 | let m = p.start(); | 188 | p.bump(); |
189 | if let Some(message) = message { | 189 | expressions::expr_block_contents(p); |
190 | p.error(message); | 190 | p.eat(R_CURLY); |
191 | } | 191 | m.complete(p, ERROR); |
192 | p.bump(); | ||
193 | while !p.at(EOF) && !p.at(R_CURLY) { | ||
194 | match p.current() { | ||
195 | L_CURLY => go(p, None), | ||
196 | _ => p.bump(), | ||
197 | } | ||
198 | } | ||
199 | p.eat(R_CURLY); | ||
200 | m.complete(p, ERROR); | ||
201 | } | ||
202 | } | 192 | } |
diff --git a/crates/ra_syntax/tests/data/parser/err/0008_item_block_recovery.txt b/crates/ra_syntax/tests/data/parser/err/0008_item_block_recovery.txt index de5c81f29..870c818ae 100644 --- a/crates/ra_syntax/tests/data/parser/err/0008_item_block_recovery.txt +++ b/crates/ra_syntax/tests/data/parser/err/0008_item_block_recovery.txt | |||
@@ -28,29 +28,36 @@ SOURCE_FILE@[0; 95) | |||
28 | ERROR@[20; 80) | 28 | ERROR@[20; 80) |
29 | L_CURLY@[20; 21) | 29 | L_CURLY@[20; 21) |
30 | WHITESPACE@[21; 26) | 30 | WHITESPACE@[21; 26) |
31 | IF_KW@[26; 28) | 31 | IF_EXPR@[26; 78) |
32 | WHITESPACE@[28; 29) | 32 | IF_KW@[26; 28) |
33 | TRUE_KW@[29; 33) | 33 | WHITESPACE@[28; 29) |
34 | WHITESPACE@[33; 34) | 34 | CONDITION@[29; 33) |
35 | ERROR@[34; 51) | 35 | LITERAL@[29; 33) |
36 | L_CURLY@[34; 35) | 36 | TRUE_KW@[29; 33) |
37 | WHITESPACE@[35; 44) | 37 | WHITESPACE@[33; 34) |
38 | INT_NUMBER@[44; 45) "1" | 38 | BLOCK@[34; 51) |
39 | WHITESPACE@[45; 50) | 39 | L_CURLY@[34; 35) |
40 | R_CURLY@[50; 51) | 40 | WHITESPACE@[35; 44) |
41 | WHITESPACE@[51; 52) | 41 | LITERAL@[44; 45) |
42 | ELSE_KW@[52; 56) | 42 | INT_NUMBER@[44; 45) "1" |
43 | WHITESPACE@[56; 57) | 43 | WHITESPACE@[45; 50) |
44 | ERROR@[57; 78) | 44 | R_CURLY@[50; 51) |
45 | L_CURLY@[57; 58) | 45 | WHITESPACE@[51; 52) |
46 | WHITESPACE@[58; 67) | 46 | ELSE_KW@[52; 56) |
47 | INT_NUMBER@[67; 68) "2" | 47 | WHITESPACE@[56; 57) |
48 | WHITESPACE@[68; 69) | 48 | BLOCK@[57; 78) |
49 | PLUS@[69; 70) | 49 | L_CURLY@[57; 58) |
50 | WHITESPACE@[70; 71) | 50 | WHITESPACE@[58; 67) |
51 | INT_NUMBER@[71; 72) "3" | 51 | BIN_EXPR@[67; 72) |
52 | WHITESPACE@[72; 77) | 52 | LITERAL@[67; 68) |
53 | R_CURLY@[77; 78) | 53 | INT_NUMBER@[67; 68) "2" |
54 | WHITESPACE@[68; 69) | ||
55 | PLUS@[69; 70) | ||
56 | WHITESPACE@[70; 71) | ||
57 | LITERAL@[71; 72) | ||
58 | INT_NUMBER@[71; 72) "3" | ||
59 | WHITESPACE@[72; 77) | ||
60 | R_CURLY@[77; 78) | ||
54 | WHITESPACE@[78; 79) | 61 | WHITESPACE@[78; 79) |
55 | R_CURLY@[79; 80) | 62 | R_CURLY@[79; 80) |
56 | WHITESPACE@[80; 82) | 63 | WHITESPACE@[80; 82) |
diff --git a/crates/ra_syntax/tests/data/parser/err/0009_broken_struct_type_parameter.txt b/crates/ra_syntax/tests/data/parser/err/0009_broken_struct_type_parameter.txt index e22c061d2..26c5d395c 100644 --- a/crates/ra_syntax/tests/data/parser/err/0009_broken_struct_type_parameter.txt +++ b/crates/ra_syntax/tests/data/parser/err/0009_broken_struct_type_parameter.txt | |||
@@ -28,10 +28,24 @@ SOURCE_FILE@[0; 43) | |||
28 | ERROR@[17; 31) | 28 | ERROR@[17; 31) |
29 | L_CURLY@[17; 18) | 29 | L_CURLY@[17; 18) |
30 | WHITESPACE@[18; 23) | 30 | WHITESPACE@[18; 23) |
31 | IDENT@[23; 24) "f" | 31 | EXPR_STMT@[23; 24) |
32 | COLON@[24; 25) | 32 | PATH_EXPR@[23; 24) |
33 | PATH@[23; 24) | ||
34 | PATH_SEGMENT@[23; 24) | ||
35 | NAME_REF@[23; 24) | ||
36 | IDENT@[23; 24) "f" | ||
37 | err: `expected SEMI` | ||
38 | err: `expected expression` | ||
39 | EXPR_STMT@[24; 25) | ||
40 | ERROR@[24; 25) | ||
41 | COLON@[24; 25) | ||
42 | err: `expected SEMI` | ||
33 | WHITESPACE@[25; 26) | 43 | WHITESPACE@[25; 26) |
34 | IDENT@[26; 29) "u32" | 44 | PATH_EXPR@[26; 29) |
45 | PATH@[26; 29) | ||
46 | PATH_SEGMENT@[26; 29) | ||
47 | NAME_REF@[26; 29) | ||
48 | IDENT@[26; 29) "u32" | ||
35 | WHITESPACE@[29; 30) | 49 | WHITESPACE@[29; 30) |
36 | R_CURLY@[30; 31) | 50 | R_CURLY@[30; 31) |
37 | WHITESPACE@[31; 33) | 51 | WHITESPACE@[31; 33) |
diff --git a/crates/ra_syntax/tests/data/parser/err/0028_macro_2.0.txt b/crates/ra_syntax/tests/data/parser/err/0028_macro_2.0.txt index 440bd7f92..181ccfa25 100644 --- a/crates/ra_syntax/tests/data/parser/err/0028_macro_2.0.txt +++ b/crates/ra_syntax/tests/data/parser/err/0028_macro_2.0.txt | |||
@@ -34,22 +34,29 @@ SOURCE_FILE@[0; 349) | |||
34 | ERROR@[42; 93) | 34 | ERROR@[42; 93) |
35 | L_CURLY@[42; 43) | 35 | L_CURLY@[42; 43) |
36 | WHITESPACE@[43; 48) | 36 | WHITESPACE@[43; 48) |
37 | IDENT@[48; 51) "vec" | 37 | MACRO_CALL@[48; 91) |
38 | EXCL@[51; 52) | 38 | PATH@[48; 51) |
39 | L_BRACK@[52; 53) | 39 | PATH_SEGMENT@[48; 51) |
40 | WHITESPACE@[53; 62) | 40 | NAME_REF@[48; 51) |
41 | DOLLAR@[62; 63) | 41 | IDENT@[48; 51) "vec" |
42 | L_PAREN@[63; 64) | 42 | EXCL@[51; 52) |
43 | IDENT@[64; 78) "parse_use_tree" | 43 | TOKEN_TREE@[52; 91) |
44 | L_PAREN@[78; 79) | 44 | L_BRACK@[52; 53) |
45 | DOLLAR@[79; 80) | 45 | WHITESPACE@[53; 62) |
46 | IDENT@[80; 81) "s" | 46 | DOLLAR@[62; 63) |
47 | R_PAREN@[81; 82) | 47 | TOKEN_TREE@[63; 84) |
48 | COMMA@[82; 83) | 48 | L_PAREN@[63; 64) |
49 | R_PAREN@[83; 84) | 49 | IDENT@[64; 78) "parse_use_tree" |
50 | STAR@[84; 85) | 50 | TOKEN_TREE@[78; 82) |
51 | WHITESPACE@[85; 90) | 51 | L_PAREN@[78; 79) |
52 | R_BRACK@[90; 91) | 52 | DOLLAR@[79; 80) |
53 | IDENT@[80; 81) "s" | ||
54 | R_PAREN@[81; 82) | ||
55 | COMMA@[82; 83) | ||
56 | R_PAREN@[83; 84) | ||
57 | STAR@[84; 85) | ||
58 | WHITESPACE@[85; 90) | ||
59 | R_BRACK@[90; 91) | ||
53 | WHITESPACE@[91; 92) | 60 | WHITESPACE@[91; 92) |
54 | R_CURLY@[92; 93) | 61 | R_CURLY@[92; 93) |
55 | WHITESPACE@[93; 95) | 62 | WHITESPACE@[93; 95) |