diff options
3 files changed, 91 insertions, 2 deletions
diff --git a/crates/ra_parser/src/grammar/patterns.rs b/crates/ra_parser/src/grammar/patterns.rs index a4ffd6960..877ae5b7a 100644 --- a/crates/ra_parser/src/grammar/patterns.rs +++ b/crates/ra_parser/src/grammar/patterns.rs | |||
@@ -168,6 +168,7 @@ fn record_field_pat_list(p: &mut Parser) { | |||
168 | T![.] if p.at(T![..]) => p.bump(T![..]), | 168 | T![.] if p.at(T![..]) => p.bump(T![..]), |
169 | 169 | ||
170 | IDENT if p.nth(1) == T![:] => record_field_pat(p), | 170 | IDENT if p.nth(1) == T![:] => record_field_pat(p), |
171 | INT_NUMBER if p.nth(1) == T![:] => record_field_pat(p), | ||
171 | T!['{'] => error_block(p, "expected ident"), | 172 | T!['{'] => error_block(p, "expected ident"), |
172 | T![box] => { | 173 | T![box] => { |
173 | box_pat(p); | 174 | box_pat(p); |
@@ -184,12 +185,21 @@ fn record_field_pat_list(p: &mut Parser) { | |||
184 | m.complete(p, RECORD_FIELD_PAT_LIST); | 185 | m.complete(p, RECORD_FIELD_PAT_LIST); |
185 | } | 186 | } |
186 | 187 | ||
188 | // test record_field_pat | ||
189 | // fn foo() { | ||
190 | // let S { 0: 1 } = (); | ||
191 | // let S { x: 1 } = (); | ||
192 | // } | ||
187 | fn record_field_pat(p: &mut Parser) { | 193 | fn record_field_pat(p: &mut Parser) { |
188 | assert!(p.at(IDENT)); | 194 | assert!(p.at(IDENT) || p.at(INT_NUMBER)); |
189 | assert!(p.nth(1) == T![:]); | 195 | assert!(p.nth(1) == T![:]); |
190 | 196 | ||
191 | let m = p.start(); | 197 | let m = p.start(); |
192 | name(p); | 198 | |
199 | if !p.eat(INT_NUMBER) { | ||
200 | name(p) | ||
201 | } | ||
202 | |||
193 | p.bump_any(); | 203 | p.bump_any(); |
194 | pattern(p); | 204 | pattern(p); |
195 | m.complete(p, RECORD_FIELD_PAT); | 205 | m.complete(p, RECORD_FIELD_PAT); |
diff --git a/crates/ra_syntax/test_data/parser/inline/ok/0145_record_field_pat.rs b/crates/ra_syntax/test_data/parser/inline/ok/0145_record_field_pat.rs new file mode 100644 index 000000000..26b1d5f89 --- /dev/null +++ b/crates/ra_syntax/test_data/parser/inline/ok/0145_record_field_pat.rs | |||
@@ -0,0 +1,4 @@ | |||
1 | fn foo() { | ||
2 | let S { 0: 1 } = (); | ||
3 | let S { x: 1 } = (); | ||
4 | } | ||
diff --git a/crates/ra_syntax/test_data/parser/inline/ok/0145_record_field_pat.txt b/crates/ra_syntax/test_data/parser/inline/ok/0145_record_field_pat.txt new file mode 100644 index 000000000..06fbdfabf --- /dev/null +++ b/crates/ra_syntax/test_data/parser/inline/ok/0145_record_field_pat.txt | |||
@@ -0,0 +1,75 @@ | |||
1 | SOURCE_FILE@[0; 63) | ||
2 | FN_DEF@[0; 62) | ||
3 | FN_KW@[0; 2) "fn" | ||
4 | WHITESPACE@[2; 3) " " | ||
5 | NAME@[3; 6) | ||
6 | IDENT@[3; 6) "foo" | ||
7 | PARAM_LIST@[6; 8) | ||
8 | L_PAREN@[6; 7) "(" | ||
9 | R_PAREN@[7; 8) ")" | ||
10 | WHITESPACE@[8; 9) " " | ||
11 | BLOCK_EXPR@[9; 62) | ||
12 | BLOCK@[9; 62) | ||
13 | L_CURLY@[9; 10) "{" | ||
14 | WHITESPACE@[10; 15) "\n " | ||
15 | LET_STMT@[15; 35) | ||
16 | LET_KW@[15; 18) "let" | ||
17 | WHITESPACE@[18; 19) " " | ||
18 | RECORD_PAT@[19; 29) | ||
19 | PATH@[19; 20) | ||
20 | PATH_SEGMENT@[19; 20) | ||
21 | NAME_REF@[19; 20) | ||
22 | IDENT@[19; 20) "S" | ||
23 | WHITESPACE@[20; 21) " " | ||
24 | RECORD_FIELD_PAT_LIST@[21; 29) | ||
25 | L_CURLY@[21; 22) "{" | ||
26 | WHITESPACE@[22; 23) " " | ||
27 | RECORD_FIELD_PAT@[23; 27) | ||
28 | INT_NUMBER@[23; 24) "0" | ||
29 | COLON@[24; 25) ":" | ||
30 | WHITESPACE@[25; 26) " " | ||
31 | LITERAL_PAT@[26; 27) | ||
32 | LITERAL@[26; 27) | ||
33 | INT_NUMBER@[26; 27) "1" | ||
34 | WHITESPACE@[27; 28) " " | ||
35 | R_CURLY@[28; 29) "}" | ||
36 | WHITESPACE@[29; 30) " " | ||
37 | EQ@[30; 31) "=" | ||
38 | WHITESPACE@[31; 32) " " | ||
39 | TUPLE_EXPR@[32; 34) | ||
40 | L_PAREN@[32; 33) "(" | ||
41 | R_PAREN@[33; 34) ")" | ||
42 | SEMI@[34; 35) ";" | ||
43 | WHITESPACE@[35; 40) "\n " | ||
44 | LET_STMT@[40; 60) | ||
45 | LET_KW@[40; 43) "let" | ||
46 | WHITESPACE@[43; 44) " " | ||
47 | RECORD_PAT@[44; 54) | ||
48 | PATH@[44; 45) | ||
49 | PATH_SEGMENT@[44; 45) | ||
50 | NAME_REF@[44; 45) | ||
51 | IDENT@[44; 45) "S" | ||
52 | WHITESPACE@[45; 46) " " | ||
53 | RECORD_FIELD_PAT_LIST@[46; 54) | ||
54 | L_CURLY@[46; 47) "{" | ||
55 | WHITESPACE@[47; 48) " " | ||
56 | RECORD_FIELD_PAT@[48; 52) | ||
57 | NAME@[48; 49) | ||
58 | IDENT@[48; 49) "x" | ||
59 | COLON@[49; 50) ":" | ||
60 | WHITESPACE@[50; 51) " " | ||
61 | LITERAL_PAT@[51; 52) | ||
62 | LITERAL@[51; 52) | ||
63 | INT_NUMBER@[51; 52) "1" | ||
64 | WHITESPACE@[52; 53) " " | ||
65 | R_CURLY@[53; 54) "}" | ||
66 | WHITESPACE@[54; 55) " " | ||
67 | EQ@[55; 56) "=" | ||
68 | WHITESPACE@[56; 57) " " | ||
69 | TUPLE_EXPR@[57; 59) | ||
70 | L_PAREN@[57; 58) "(" | ||
71 | R_PAREN@[58; 59) ")" | ||
72 | SEMI@[59; 60) ";" | ||
73 | WHITESPACE@[60; 61) "\n" | ||
74 | R_CURLY@[61; 62) "}" | ||
75 | WHITESPACE@[62; 63) "\n" | ||