Skip to content

Commit 75192f7

Browse files
Handle Struct { box i } syntax
Named structs can have `box` patterns that will bind to their fields. This is similar to the behavior of the `ref` and `mut` fields, but is at least a little bit surprising.
1 parent 8454f59 commit 75192f7

File tree

3 files changed

+117
-20
lines changed

3 files changed

+117
-20
lines changed

crates/ra_parser/src/grammar/patterns.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,9 @@ fn record_field_pat_list(p: &mut Parser) {
162162
T![..] => p.bump(),
163163
IDENT if p.nth(1) == T![:] => record_field_pat(p),
164164
T!['{'] => error_block(p, "expected ident"),
165+
T![box] => {
166+
box_pat(p);
167+
}
165168
_ => {
166169
bind_pat(p, false);
167170
}
@@ -271,9 +274,6 @@ fn bind_pat(p: &mut Parser, with_at: bool) -> CompletedMarker {
271274
}
272275

273276
// test box_pat
274-
// struct Outer;
275-
// struct Inner;
276-
//
277277
// fn main() {
278278
// let box i = ();
279279
// let box Outer { box i, j: box Inner(box &x) } = ();
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,5 @@
1-
struct Outer;
2-
struct Inner;
1+
fn main() {
2+
let box i = ();
3+
let box Outer { box i, j: box Inner(box &x) } = ();
4+
let box ref mut i = ();
5+
}
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,109 @@
1-
SOURCE_FILE@[0; 28)
2-
STRUCT_DEF@[0; 13)
3-
STRUCT_KW@[0; 6) "struct"
4-
WHITESPACE@[6; 7) " "
5-
NAME@[7; 12)
6-
IDENT@[7; 12) "Outer"
7-
SEMI@[12; 13) ";"
8-
WHITESPACE@[13; 14) "\n"
9-
STRUCT_DEF@[14; 27)
10-
STRUCT_KW@[14; 20) "struct"
11-
WHITESPACE@[20; 21) " "
12-
NAME@[21; 26)
13-
IDENT@[21; 26) "Inner"
14-
SEMI@[26; 27) ";"
15-
WHITESPACE@[27; 28) "\n"
1+
SOURCE_FILE@[0; 118)
2+
FN_DEF@[0; 117)
3+
FN_KW@[0; 2) "fn"
4+
WHITESPACE@[2; 3) " "
5+
NAME@[3; 7)
6+
IDENT@[3; 7) "main"
7+
PARAM_LIST@[7; 9)
8+
L_PAREN@[7; 8) "("
9+
R_PAREN@[8; 9) ")"
10+
WHITESPACE@[9; 10) " "
11+
BLOCK@[10; 117)
12+
L_CURLY@[10; 11) "{"
13+
WHITESPACE@[11; 16) "\n "
14+
LET_STMT@[16; 31)
15+
LET_KW@[16; 19) "let"
16+
WHITESPACE@[19; 20) " "
17+
BOX_PAT@[20; 25)
18+
BOX_KW@[20; 23) "box"
19+
WHITESPACE@[23; 24) " "
20+
BIND_PAT@[24; 25)
21+
NAME@[24; 25)
22+
IDENT@[24; 25) "i"
23+
WHITESPACE@[25; 26) " "
24+
EQ@[26; 27) "="
25+
WHITESPACE@[27; 28) " "
26+
TUPLE_EXPR@[28; 30)
27+
L_PAREN@[28; 29) "("
28+
R_PAREN@[29; 30) ")"
29+
SEMI@[30; 31) ";"
30+
WHITESPACE@[31; 36) "\n "
31+
LET_STMT@[36; 87)
32+
LET_KW@[36; 39) "let"
33+
WHITESPACE@[39; 40) " "
34+
BOX_PAT@[40; 81)
35+
BOX_KW@[40; 43) "box"
36+
WHITESPACE@[43; 44) " "
37+
RECORD_PAT@[44; 81)
38+
PATH@[44; 49)
39+
PATH_SEGMENT@[44; 49)
40+
NAME_REF@[44; 49)
41+
IDENT@[44; 49) "Outer"
42+
WHITESPACE@[49; 50) " "
43+
RECORD_FIELD_PAT_LIST@[50; 81)
44+
L_CURLY@[50; 51) "{"
45+
WHITESPACE@[51; 52) " "
46+
BOX_PAT@[52; 57)
47+
BOX_KW@[52; 55) "box"
48+
WHITESPACE@[55; 56) " "
49+
BIND_PAT@[56; 57)
50+
NAME@[56; 57)
51+
IDENT@[56; 57) "i"
52+
COMMA@[57; 58) ","
53+
WHITESPACE@[58; 59) " "
54+
RECORD_FIELD_PAT@[59; 79)
55+
NAME@[59; 60)
56+
IDENT@[59; 60) "j"
57+
COLON@[60; 61) ":"
58+
WHITESPACE@[61; 62) " "
59+
BOX_PAT@[62; 79)
60+
BOX_KW@[62; 65) "box"
61+
WHITESPACE@[65; 66) " "
62+
TUPLE_STRUCT_PAT@[66; 79)
63+
PATH@[66; 71)
64+
PATH_SEGMENT@[66; 71)
65+
NAME_REF@[66; 71)
66+
IDENT@[66; 71) "Inner"
67+
L_PAREN@[71; 72) "("
68+
BOX_PAT@[72; 78)
69+
BOX_KW@[72; 75) "box"
70+
WHITESPACE@[75; 76) " "
71+
REF_PAT@[76; 78)
72+
AMP@[76; 77) "&"
73+
BIND_PAT@[77; 78)
74+
NAME@[77; 78)
75+
IDENT@[77; 78) "x"
76+
R_PAREN@[78; 79) ")"
77+
WHITESPACE@[79; 80) " "
78+
R_CURLY@[80; 81) "}"
79+
WHITESPACE@[81; 82) " "
80+
EQ@[82; 83) "="
81+
WHITESPACE@[83; 84) " "
82+
TUPLE_EXPR@[84; 86)
83+
L_PAREN@[84; 85) "("
84+
R_PAREN@[85; 86) ")"
85+
SEMI@[86; 87) ";"
86+
WHITESPACE@[87; 92) "\n "
87+
LET_STMT@[92; 115)
88+
LET_KW@[92; 95) "let"
89+
WHITESPACE@[95; 96) " "
90+
BOX_PAT@[96; 109)
91+
BOX_KW@[96; 99) "box"
92+
WHITESPACE@[99; 100) " "
93+
BIND_PAT@[100; 109)
94+
REF_KW@[100; 103) "ref"
95+
WHITESPACE@[103; 104) " "
96+
MUT_KW@[104; 107) "mut"
97+
WHITESPACE@[107; 108) " "
98+
NAME@[108; 109)
99+
IDENT@[108; 109) "i"
100+
WHITESPACE@[109; 110) " "
101+
EQ@[110; 111) "="
102+
WHITESPACE@[111; 112) " "
103+
TUPLE_EXPR@[112; 114)
104+
L_PAREN@[112; 113) "("
105+
R_PAREN@[113; 114) ")"
106+
SEMI@[114; 115) ";"
107+
WHITESPACE@[115; 116) "\n"
108+
R_CURLY@[116; 117) "}"
109+
WHITESPACE@[117; 118) "\n"

0 commit comments

Comments
 (0)