Skip to content

Commit b7c45fb

Browse files
committed
Extract expr_with_attrs
1 parent 90b8a31 commit b7c45fb

File tree

3 files changed

+36
-23
lines changed

3 files changed

+36
-23
lines changed

crates/ra_parser/src/grammar/expressions.rs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,26 @@ pub(super) fn expr(p: &mut Parser) -> (Option<CompletedMarker>, BlockLike) {
1919
expr_bp(p, r, 1)
2020
}
2121

22+
pub(super) fn expr_with_attrs(p: &mut Parser) -> bool {
23+
let m = p.start();
24+
let has_attrs = p.at(T![#]);
25+
attributes::outer_attributes(p);
26+
27+
let (cm, _block_like) = expr(p);
28+
let success = cm.is_some();
29+
30+
match (has_attrs, cm) {
31+
(true, Some(cm)) => {
32+
let kind = cm.kind();
33+
cm.undo_completion(p).abandon(p);
34+
m.complete(p, kind);
35+
}
36+
_ => m.abandon(p),
37+
}
38+
39+
success
40+
}
41+
2242
pub(super) fn expr_stmt(p: &mut Parser) -> (Option<CompletedMarker>, BlockLike) {
2343
let r = Restrictions { forbid_structs: false, prefer_stmt: true };
2444
expr_bp(p, r, 1)

crates/ra_parser/src/grammar/expressions/atom.rs

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -191,19 +191,8 @@ fn array_expr(p: &mut Parser) -> CompletedMarker {
191191

192192
// test array_attrs
193193
// const A: &[i64] = &[1, #[cfg(test)] 2];
194-
let m = p.start();
195-
let has_attrs = p.at(T![#]);
196-
attributes::outer_attributes(p);
197-
198-
let cm = expr(p).0;
199-
200-
match (has_attrs, cm) {
201-
(true, Some(cm)) => {
202-
let kind = cm.kind();
203-
cm.undo_completion(p).abandon(p);
204-
m.complete(p, kind);
205-
}
206-
_ => m.abandon(p),
194+
if !expr_with_attrs(p) {
195+
break;
207196
}
208197

209198
if n_exprs == 1 && p.eat(T![;]) {

crates/ra_syntax/test_data/parser/err/0022_bad_exprs.txt

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ SOURCE_FILE@[0; 112)
1212
BLOCK@[7; 33)
1313
L_CURLY@[7; 8) "{"
1414
WHITESPACE@[8; 9) " "
15-
EXPR_STMT@[9; 26)
16-
ARRAY_EXPR@[9; 26)
15+
EXPR_STMT@[9; 17)
16+
ARRAY_EXPR@[9; 17)
1717
L_BRACK@[9; 10) "["
1818
LITERAL@[10; 11)
1919
INT_NUMBER@[10; 11) "1"
@@ -25,10 +25,13 @@ SOURCE_FILE@[0; 112)
2525
WHITESPACE@[15; 16) " "
2626
ERROR@[16; 17)
2727
AT@[16; 17) "@"
28+
EXPR_STMT@[17; 18)
29+
ERROR@[17; 18)
2830
COMMA@[17; 18) ","
29-
WHITESPACE@[18; 19) " "
30-
ERROR@[19; 25)
31-
STRUCT_KW@[19; 25) "struct"
31+
WHITESPACE@[18; 19) " "
32+
STRUCT_DEF@[19; 26)
33+
STRUCT_KW@[19; 25) "struct"
34+
ERROR@[25; 26)
3235
COMMA@[25; 26) ","
3336
WHITESPACE@[26; 27) " "
3437
LET_STMT@[27; 31)
@@ -148,11 +151,12 @@ SOURCE_FILE@[0; 112)
148151
R_CURLY@[110; 111) "}"
149152
WHITESPACE@[111; 112) "\n"
150153
error 16: expected expression
151-
error 19: expected expression
152-
error 26: expected expression
153-
error 26: expected COMMA
154-
error 26: expected R_BRACK
155-
error 26: expected SEMI
154+
error 17: expected R_BRACK
155+
error 17: expected SEMI
156+
error 17: expected expression
157+
error 18: expected SEMI
158+
error 25: expected a name
159+
error 26: expected `;`, `{`, or `(`
156160
error 30: expected pattern
157161
error 31: expected SEMI
158162
error 52: expected expression

0 commit comments

Comments
 (0)