Skip to content

Commit 97bdf14

Browse files
authored
Merge pull request rust-lang#19723 from Veykril/push-skswknpxtzlz
fix: Improve parser recovery a bit
2 parents 1306a5a + 09188e6 commit 97bdf14

File tree

15 files changed

+86
-20
lines changed

15 files changed

+86
-20
lines changed

src/tools/rust-analyzer/crates/hir-def/src/macro_expansion_tests/builtin_fn_macro.rs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -285,8 +285,6 @@ fn main() {
285285
/* parse error: expected expression */
286286
builtin #format_args (x = );
287287
/* parse error: expected expression */
288-
/* parse error: expected R_PAREN */
289-
/* parse error: expected expression, item or let statement */
290288
builtin #format_args (x = , x = 2);
291289
/* parse error: expected expression */
292290
builtin #format_args ("{}", x = );

src/tools/rust-analyzer/crates/ide-completion/src/context/analysis.rs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -661,9 +661,8 @@ fn expected_type_and_name(
661661
))
662662
} else {
663663
cov_mark::hit!(expected_type_struct_field_without_leading_char);
664-
let expr_field = token.prev_sibling_or_token()?
665-
.into_node()
666-
.and_then(ast::RecordExprField::cast)?;
664+
cov_mark::hit!(expected_type_struct_field_followed_by_comma);
665+
let expr_field = previous_non_trivia_token(token.clone())?.parent().and_then(ast::RecordExprField::cast)?;
667666
let (_, _, ty) = sema.resolve_record_field(&expr_field)?;
668667
Some((
669668
Some(ty),
@@ -681,7 +680,6 @@ fn expected_type_and_name(
681680
.or_else(|| sema.type_of_expr(&expr).map(TypeInfo::original));
682681
(ty, field_name)
683682
} else {
684-
cov_mark::hit!(expected_type_struct_field_followed_by_comma);
685683
(field_ty, field_name)
686684
}
687685
},

src/tools/rust-analyzer/crates/parser/src/grammar/expressions.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use crate::grammar::attributes::ATTRIBUTE_FIRST;
44

55
use super::*;
66

7-
pub(super) use atom::{LITERAL_FIRST, literal};
7+
pub(super) use atom::{EXPR_RECOVERY_SET, LITERAL_FIRST, literal};
88
pub(crate) use atom::{block_expr, match_arm_list};
99

1010
#[derive(PartialEq, Eq)]

src/tools/rust-analyzer/crates/parser/src/grammar/expressions/atom.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,6 @@ pub(super) const ATOM_EXPR_FIRST: TokenSet =
4646
T!['['],
4747
T![|],
4848
T![async],
49-
T![box],
5049
T![break],
5150
T![const],
5251
T![continue],
@@ -68,7 +67,8 @@ pub(super) const ATOM_EXPR_FIRST: TokenSet =
6867
LIFETIME_IDENT,
6968
]));
7069

71-
pub(super) const EXPR_RECOVERY_SET: TokenSet = TokenSet::new(&[T![')'], T![']']]);
70+
pub(in crate::grammar) const EXPR_RECOVERY_SET: TokenSet =
71+
TokenSet::new(&[T!['}'], T![')'], T![']'], T![,]]);
7272

7373
pub(super) fn atom_expr(
7474
p: &mut Parser<'_>,

src/tools/rust-analyzer/crates/parser/src/grammar/items.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,9 @@ pub(super) const ITEM_RECOVERY_SET: TokenSet = TokenSet::new(&[
3232
T![impl],
3333
T![trait],
3434
T![const],
35+
T![async],
36+
T![unsafe],
37+
T![extern],
3538
T![static],
3639
T![let],
3740
T![mod],

src/tools/rust-analyzer/crates/parser/src/grammar/paths.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ fn path_for_qualifier(
8181
}
8282

8383
const EXPR_PATH_SEGMENT_RECOVERY_SET: TokenSet =
84-
items::ITEM_RECOVERY_SET.union(TokenSet::new(&[T![')'], T![,], T![let]]));
84+
expressions::EXPR_RECOVERY_SET.union(items::ITEM_RECOVERY_SET);
8585
const TYPE_PATH_SEGMENT_RECOVERY_SET: TokenSet = types::TYPE_RECOVERY_SET;
8686

8787
fn path_segment(p: &mut Parser<'_>, mode: Mode, first: bool) -> Option<CompletedMarker> {

src/tools/rust-analyzer/crates/parser/src/grammar/patterns.rs

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -199,8 +199,19 @@ fn pattern_single_r(p: &mut Parser<'_>, recovery_set: TokenSet) {
199199
}
200200
}
201201

202-
const PAT_RECOVERY_SET: TokenSet =
203-
TokenSet::new(&[T![let], T![if], T![while], T![loop], T![match], T![')'], T![,], T![=]]);
202+
const PAT_RECOVERY_SET: TokenSet = TokenSet::new(&[
203+
T![let],
204+
T![if],
205+
T![while],
206+
T![loop],
207+
T![match],
208+
T![')'],
209+
T![']'],
210+
T!['}'],
211+
T![,],
212+
T![=],
213+
T![&],
214+
]);
204215

205216
fn atom_pat(p: &mut Parser<'_>, recovery_set: TokenSet) -> Option<CompletedMarker> {
206217
let m = match p.current() {

src/tools/rust-analyzer/crates/parser/src/grammar/types.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,15 @@ pub(super) const TYPE_FIRST: TokenSet = paths::PATH_FIRST.union(TokenSet::new(&[
2020

2121
pub(super) const TYPE_RECOVERY_SET: TokenSet = TokenSet::new(&[
2222
T![')'],
23+
// test_err type_in_array_recover
24+
// const _: [&];
25+
T![']'],
26+
T!['}'],
2327
T![>],
2428
T![,],
2529
// test_err struct_field_recover
2630
// struct S { f pub g: () }
31+
// struct S { f: pub g: () }
2732
T![pub],
2833
]);
2934

src/tools/rust-analyzer/crates/parser/test_data/generated/runner.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -870,6 +870,10 @@ mod err {
870870
run_and_expect_errors("test_data/parser/inline/err/tuple_pat_leading_comma.rs");
871871
}
872872
#[test]
873+
fn type_in_array_recover() {
874+
run_and_expect_errors("test_data/parser/inline/err/type_in_array_recover.rs");
875+
}
876+
#[test]
873877
fn unsafe_block_in_mod() {
874878
run_and_expect_errors("test_data/parser/inline/err/unsafe_block_in_mod.rs");
875879
}

src/tools/rust-analyzer/crates/parser/test_data/parser/err/0022_bad_exprs.rast

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,8 @@ SOURCE_FILE
3535
WHITESPACE " "
3636
LET_STMT
3737
LET_KW "let"
38-
ERROR
39-
R_BRACK "]"
38+
ERROR
39+
R_BRACK "]"
4040
WHITESPACE " "
4141
R_CURLY "}"
4242
WHITESPACE "\n"
@@ -149,7 +149,8 @@ error 17: expected expression, item or let statement
149149
error 25: expected a name
150150
error 26: expected `;`, `{`, or `(`
151151
error 30: expected pattern
152-
error 31: expected SEMICOLON
152+
error 30: expected SEMICOLON
153+
error 30: expected expression, item or let statement
153154
error 53: expected expression
154155
error 54: expected R_PAREN
155156
error 54: expected SEMICOLON

src/tools/rust-analyzer/crates/parser/test_data/parser/inline/err/comma_after_default_values_syntax.rast

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,7 @@ SOURCE_FILE
2323
L_CURLY "{"
2424
WHITESPACE " "
2525
DOT2 ".."
26-
ERROR
27-
COMMA ","
26+
COMMA ","
2827
WHITESPACE " "
2928
R_CURLY "}"
3029
SEMICOLON ";"
@@ -39,8 +38,7 @@ SOURCE_FILE
3938
L_CURLY "{"
4039
WHITESPACE " "
4140
DOT2 ".."
42-
ERROR
43-
COMMA ","
41+
COMMA ","
4442
WHITESPACE " "
4543
RECORD_EXPR_FIELD
4644
NAME_REF
@@ -55,5 +53,6 @@ SOURCE_FILE
5553
R_CURLY "}"
5654
WHITESPACE "\n"
5755
error 21: expected expression
56+
error 21: cannot use a comma after the base struct
5857
error 36: expected expression
59-
error 37: expected COMMA
58+
error 36: cannot use a comma after the base struct

src/tools/rust-analyzer/crates/parser/test_data/parser/inline/err/struct_field_recover.rast

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,36 @@ SOURCE_FILE
2626
WHITESPACE " "
2727
R_CURLY "}"
2828
WHITESPACE "\n"
29+
STRUCT
30+
STRUCT_KW "struct"
31+
WHITESPACE " "
32+
NAME
33+
IDENT "S"
34+
WHITESPACE " "
35+
RECORD_FIELD_LIST
36+
L_CURLY "{"
37+
WHITESPACE " "
38+
RECORD_FIELD
39+
NAME
40+
IDENT "f"
41+
COLON ":"
42+
WHITESPACE " "
43+
RECORD_FIELD
44+
VISIBILITY
45+
PUB_KW "pub"
46+
WHITESPACE " "
47+
NAME
48+
IDENT "g"
49+
COLON ":"
50+
WHITESPACE " "
51+
TUPLE_TYPE
52+
L_PAREN "("
53+
R_PAREN ")"
54+
WHITESPACE " "
55+
R_CURLY "}"
56+
WHITESPACE "\n"
2957
error 12: expected COLON
3058
error 12: expected type
3159
error 12: expected COMMA
60+
error 38: expected type
61+
error 38: expected COMMA
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
struct S { f pub g: () }
2+
struct S { f: pub g: () }
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
SOURCE_FILE
2+
CONST
3+
CONST_KW "const"
4+
WHITESPACE " "
5+
UNDERSCORE "_"
6+
COLON ":"
7+
WHITESPACE " "
8+
SLICE_TYPE
9+
L_BRACK "["
10+
REF_TYPE
11+
AMP "&"
12+
R_BRACK "]"
13+
SEMICOLON ";"
14+
WHITESPACE "\n"
15+
error 11: expected type
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
const _: [&];

0 commit comments

Comments
 (0)