Skip to content

Commit 363f2f3

Browse files
bors[bot]csmoe
andcommitted
Merge #1414
1414: fix: box_syntax/pattern r=matklad a=csmoe Closes #1412 r? @matklad Co-authored-by: csmoe <[email protected]>
2 parents 09864b3 + d653399 commit 363f2f3

File tree

8 files changed

+97
-6
lines changed

8 files changed

+97
-6
lines changed

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

+15
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ pub(super) fn atom_expr(p: &mut Parser, r: Restrictions) -> Option<(CompletedMar
7474
T![if] => if_expr(p),
7575

7676
T![loop] => loop_expr(p, None),
77+
T![box] => box_expr(p, None),
7778
T![for] => for_expr(p, None),
7879
T![while] => while_expr(p, None),
7980
T![try] => try_block_expr(p, None),
@@ -507,3 +508,17 @@ fn try_block_expr(p: &mut Parser, m: Option<Marker>) -> CompletedMarker {
507508
block(p);
508509
m.complete(p, TRY_EXPR)
509510
}
511+
512+
// test box_expr
513+
// fn foo() {
514+
// let x = box 1i32;
515+
// }
516+
fn box_expr(p: &mut Parser, m: Option<Marker>) -> CompletedMarker {
517+
assert!(p.at(T![box]));
518+
let m = m.unwrap_or_else(|| p.start());
519+
p.bump();
520+
if p.at_ts(EXPR_FIRST) {
521+
expr(p);
522+
}
523+
m.complete(p, BOX_EXPR)
524+
}

crates/ra_parser/src/grammar/patterns.rs

+3
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ fn atom_pat(p: &mut Parser, recovery_set: TokenSet) -> Option<CompletedMarker> {
6060
let la1 = p.nth(1);
6161
if la0 == T![ref]
6262
|| la0 == T![mut]
63+
|| la0 == T![box]
6364
|| (la0 == IDENT && !(la1 == T![::] || la1 == T!['('] || la1 == T!['{'] || la1 == T![!]))
6465
{
6566
return Some(bind_pat(p, true));
@@ -260,9 +261,11 @@ fn pat_list(p: &mut Parser, ket: SyntaxKind) {
260261
// let ref mut d = ();
261262
// let e @ _ = ();
262263
// let ref mut f @ g @ _ = ();
264+
// let box i = Box::new(1i32);
263265
// }
264266
fn bind_pat(p: &mut Parser, with_at: bool) -> CompletedMarker {
265267
let m = p.start();
268+
p.eat(T![box]);
266269
p.eat(T![ref]);
267270
p.eat(T![mut]);
268271
name(p);

crates/ra_parser/src/syntax_kind/generated.rs

+7
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@ pub enum SyntaxKind {
104104
MOVE_KW,
105105
RETURN_KW,
106106
TRY_KW,
107+
BOX_KW,
107108
AUTO_KW,
108109
DEFAULT_KW,
109110
EXISTENTIAL_KW,
@@ -187,6 +188,7 @@ pub enum SyntaxKind {
187188
NAMED_FIELD_LIST,
188189
NAMED_FIELD,
189190
TRY_BLOCK_EXPR,
191+
BOX_EXPR,
190192
CALL_EXPR,
191193
INDEX_EXPR,
192194
METHOD_CALL_EXPR,
@@ -335,6 +337,7 @@ macro_rules! T {
335337
(move) => { $crate::SyntaxKind::MOVE_KW };
336338
(return) => { $crate::SyntaxKind::RETURN_KW };
337339
(try) => { $crate::SyntaxKind::TRY_KW };
340+
(box) => { $crate::SyntaxKind::BOX_KW };
338341
(auto) => { $crate::SyntaxKind::AUTO_KW };
339342
(default) => { $crate::SyntaxKind::DEFAULT_KW };
340343
(existential) => { $crate::SyntaxKind::EXISTENTIAL_KW };
@@ -394,6 +397,7 @@ impl SyntaxKind {
394397
| MOVE_KW
395398
| RETURN_KW
396399
| TRY_KW
400+
| BOX_KW
397401
| AUTO_KW
398402
| DEFAULT_KW
399403
| EXISTENTIAL_KW
@@ -567,6 +571,7 @@ impl SyntaxKind {
567571
MOVE_KW => &SyntaxInfo { name: "MOVE_KW" },
568572
RETURN_KW => &SyntaxInfo { name: "RETURN_KW" },
569573
TRY_KW => &SyntaxInfo { name: "TRY_KW" },
574+
BOX_KW => &SyntaxInfo { name: "BOX_KW" },
570575
AUTO_KW => &SyntaxInfo { name: "AUTO_KW" },
571576
DEFAULT_KW => &SyntaxInfo { name: "DEFAULT_KW" },
572577
EXISTENTIAL_KW => &SyntaxInfo { name: "EXISTENTIAL_KW" },
@@ -650,6 +655,7 @@ impl SyntaxKind {
650655
NAMED_FIELD_LIST => &SyntaxInfo { name: "NAMED_FIELD_LIST" },
651656
NAMED_FIELD => &SyntaxInfo { name: "NAMED_FIELD" },
652657
TRY_BLOCK_EXPR => &SyntaxInfo { name: "TRY_BLOCK_EXPR" },
658+
BOX_EXPR => &SyntaxInfo { name: "BOX_EXPR" },
653659
CALL_EXPR => &SyntaxInfo { name: "CALL_EXPR" },
654660
INDEX_EXPR => &SyntaxInfo { name: "INDEX_EXPR" },
655661
METHOD_CALL_EXPR => &SyntaxInfo { name: "METHOD_CALL_EXPR" },
@@ -745,6 +751,7 @@ impl SyntaxKind {
745751
"move" => MOVE_KW,
746752
"return" => RETURN_KW,
747753
"try" => TRY_KW,
754+
"box" => BOX_KW,
748755
_ => return None,
749756
};
750757
Some(kw)

crates/ra_syntax/src/grammar.ron

+2
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ Grammar(
9696
"move",
9797
"return",
9898
"try",
99+
"box",
99100
],
100101
contextual_keywords: [
101102
"auto",
@@ -192,6 +193,7 @@ Grammar(
192193
"NAMED_FIELD_LIST",
193194
"NAMED_FIELD",
194195
"TRY_BLOCK_EXPR",
196+
"BOX_EXPR",
195197

196198
// postfix
197199
"CALL_EXPR",

crates/ra_syntax/tests/data/parser/inline/ok/0112_bind_pat.rs

+1
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,5 @@ fn main() {
55
let ref mut d = ();
66
let e @ _ = ();
77
let ref mut f @ g @ _ = ();
8+
let box i = Box::new(1i32);
89
}

crates/ra_syntax/tests/data/parser/inline/ok/0112_bind_pat.txt

+35-6
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
SOURCE_FILE@[0; 146)
2-
FN_DEF@[0; 145)
1+
SOURCE_FILE@[0; 178)
2+
FN_DEF@[0; 177)
33
FN_KW@[0; 2) "fn"
44
WHITESPACE@[2; 3) " "
55
NAME@[3; 7)
@@ -8,7 +8,7 @@ SOURCE_FILE@[0; 146)
88
L_PAREN@[7; 8) "("
99
R_PAREN@[8; 9) ")"
1010
WHITESPACE@[9; 10) " "
11-
BLOCK@[10; 145)
11+
BLOCK@[10; 177)
1212
L_CURLY@[10; 11) "{"
1313
WHITESPACE@[11; 16) "\n "
1414
LET_STMT@[16; 27)
@@ -122,6 +122,35 @@ SOURCE_FILE@[0; 146)
122122
L_PAREN@[140; 141) "("
123123
R_PAREN@[141; 142) ")"
124124
SEMI@[142; 143) ";"
125-
WHITESPACE@[143; 144) "\n"
126-
R_CURLY@[144; 145) "}"
127-
WHITESPACE@[145; 146) "\n"
125+
WHITESPACE@[143; 148) "\n "
126+
LET_STMT@[148; 175)
127+
LET_KW@[148; 151) "let"
128+
WHITESPACE@[151; 152) " "
129+
BIND_PAT@[152; 157)
130+
BOX_KW@[152; 155) "box"
131+
WHITESPACE@[155; 156) " "
132+
NAME@[156; 157)
133+
IDENT@[156; 157) "i"
134+
WHITESPACE@[157; 158) " "
135+
EQ@[158; 159) "="
136+
WHITESPACE@[159; 160) " "
137+
CALL_EXPR@[160; 174)
138+
PATH_EXPR@[160; 168)
139+
PATH@[160; 168)
140+
PATH@[160; 163)
141+
PATH_SEGMENT@[160; 163)
142+
NAME_REF@[160; 163)
143+
IDENT@[160; 163) "Box"
144+
COLONCOLON@[163; 165) "::"
145+
PATH_SEGMENT@[165; 168)
146+
NAME_REF@[165; 168)
147+
IDENT@[165; 168) "new"
148+
ARG_LIST@[168; 174)
149+
L_PAREN@[168; 169) "("
150+
LITERAL@[169; 173)
151+
INT_NUMBER@[169; 173) "1i32"
152+
R_PAREN@[173; 174) ")"
153+
SEMI@[174; 175) ";"
154+
WHITESPACE@[175; 176) "\n"
155+
R_CURLY@[176; 177) "}"
156+
WHITESPACE@[177; 178) "\n"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
fn foo() {
2+
let x = box 1i32;
3+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
SOURCE_FILE@[0; 35)
2+
FN_DEF@[0; 34)
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@[9; 34)
12+
L_CURLY@[9; 10) "{"
13+
WHITESPACE@[10; 15) "\n "
14+
LET_STMT@[15; 32)
15+
LET_KW@[15; 18) "let"
16+
WHITESPACE@[18; 19) " "
17+
BIND_PAT@[19; 20)
18+
NAME@[19; 20)
19+
IDENT@[19; 20) "x"
20+
WHITESPACE@[20; 21) " "
21+
EQ@[21; 22) "="
22+
WHITESPACE@[22; 23) " "
23+
BOX_EXPR@[23; 31)
24+
BOX_KW@[23; 26) "box"
25+
WHITESPACE@[26; 27) " "
26+
LITERAL@[27; 31)
27+
INT_NUMBER@[27; 31) "1i32"
28+
SEMI@[31; 32) ";"
29+
WHITESPACE@[32; 33) "\n"
30+
R_CURLY@[33; 34) "}"
31+
WHITESPACE@[34; 35) "\n"

0 commit comments

Comments
 (0)