Skip to content
This repository was archived by the owner on May 28, 2025. It is now read-only.

Commit 83a93f4

Browse files
committed
Parse inline const pattern in nested patterns
1 parent 89a1439 commit 83a93f4

File tree

3 files changed

+138
-1
lines changed

3 files changed

+138
-1
lines changed

crates/parser/src/grammar/patterns.rs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ pub(super) const PATTERN_FIRST: TokenSet =
55
T![box],
66
T![ref],
77
T![mut],
8+
T![const],
89
T!['('],
910
T!['['],
1011
T![&],
@@ -17,7 +18,7 @@ const PAT_TOP_FIRST: TokenSet = PATTERN_FIRST.union(TokenSet::new(&[T![|]]));
1718

1819
/// Set of possible tokens at the start of a range pattern's end bound.
1920
const RANGE_PAT_END_FIRST: TokenSet =
20-
expressions::LITERAL_FIRST.union(paths::PATH_FIRST).union(TokenSet::new(&[T![-]]));
21+
expressions::LITERAL_FIRST.union(paths::PATH_FIRST).union(TokenSet::new(&[T![-], T![const]]));
2122

2223
pub(crate) fn pattern(p: &mut Parser<'_>) {
2324
pattern_r(p, PAT_RECOVERY_SET);
@@ -499,6 +500,14 @@ fn box_pat(p: &mut Parser<'_>) -> CompletedMarker {
499500
// fn main() {
500501
// let const { 15 } = ();
501502
// let const { foo(); bar() } = ();
503+
//
504+
// match 42 {
505+
// const { 0 } .. const { 1 } => (),
506+
// .. const { 0 } => (),
507+
// const { 2 } .. => (),
508+
// }
509+
//
510+
// let (const { () },) = ();
502511
// }
503512
fn const_block_pat(p: &mut Parser<'_>) -> CompletedMarker {
504513
assert!(p.at(T![const]));

crates/parser/test_data/parser/inline/ok/0156_const_block_pat.rast

Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,126 @@ SOURCE_FILE
7474
L_PAREN "("
7575
R_PAREN ")"
7676
SEMICOLON ";"
77+
WHITESPACE "\n\n "
78+
EXPR_STMT
79+
MATCH_EXPR
80+
MATCH_KW "match"
81+
WHITESPACE " "
82+
LITERAL
83+
INT_NUMBER "42"
84+
WHITESPACE " "
85+
MATCH_ARM_LIST
86+
L_CURLY "{"
87+
WHITESPACE "\n "
88+
MATCH_ARM
89+
RANGE_PAT
90+
CONST_BLOCK_PAT
91+
CONST_KW "const"
92+
WHITESPACE " "
93+
BLOCK_EXPR
94+
STMT_LIST
95+
L_CURLY "{"
96+
WHITESPACE " "
97+
LITERAL
98+
INT_NUMBER "0"
99+
WHITESPACE " "
100+
R_CURLY "}"
101+
WHITESPACE " "
102+
DOT2 ".."
103+
WHITESPACE " "
104+
CONST_BLOCK_PAT
105+
CONST_KW "const"
106+
WHITESPACE " "
107+
BLOCK_EXPR
108+
STMT_LIST
109+
L_CURLY "{"
110+
WHITESPACE " "
111+
LITERAL
112+
INT_NUMBER "1"
113+
WHITESPACE " "
114+
R_CURLY "}"
115+
WHITESPACE " "
116+
FAT_ARROW "=>"
117+
WHITESPACE " "
118+
TUPLE_EXPR
119+
L_PAREN "("
120+
R_PAREN ")"
121+
COMMA ","
122+
WHITESPACE "\n "
123+
MATCH_ARM
124+
RANGE_PAT
125+
DOT2 ".."
126+
WHITESPACE " "
127+
CONST_BLOCK_PAT
128+
CONST_KW "const"
129+
WHITESPACE " "
130+
BLOCK_EXPR
131+
STMT_LIST
132+
L_CURLY "{"
133+
WHITESPACE " "
134+
LITERAL
135+
INT_NUMBER "0"
136+
WHITESPACE " "
137+
R_CURLY "}"
138+
WHITESPACE " "
139+
FAT_ARROW "=>"
140+
WHITESPACE " "
141+
TUPLE_EXPR
142+
L_PAREN "("
143+
R_PAREN ")"
144+
COMMA ","
145+
WHITESPACE "\n "
146+
MATCH_ARM
147+
RANGE_PAT
148+
CONST_BLOCK_PAT
149+
CONST_KW "const"
150+
WHITESPACE " "
151+
BLOCK_EXPR
152+
STMT_LIST
153+
L_CURLY "{"
154+
WHITESPACE " "
155+
LITERAL
156+
INT_NUMBER "2"
157+
WHITESPACE " "
158+
R_CURLY "}"
159+
WHITESPACE " "
160+
DOT2 ".."
161+
WHITESPACE " "
162+
FAT_ARROW "=>"
163+
WHITESPACE " "
164+
TUPLE_EXPR
165+
L_PAREN "("
166+
R_PAREN ")"
167+
COMMA ","
168+
WHITESPACE "\n "
169+
R_CURLY "}"
170+
WHITESPACE "\n\n "
171+
LET_STMT
172+
LET_KW "let"
173+
WHITESPACE " "
174+
TUPLE_PAT
175+
L_PAREN "("
176+
CONST_BLOCK_PAT
177+
CONST_KW "const"
178+
WHITESPACE " "
179+
BLOCK_EXPR
180+
STMT_LIST
181+
L_CURLY "{"
182+
WHITESPACE " "
183+
TUPLE_EXPR
184+
L_PAREN "("
185+
R_PAREN ")"
186+
WHITESPACE " "
187+
R_CURLY "}"
188+
COMMA ","
189+
R_PAREN ")"
190+
WHITESPACE " "
191+
EQ "="
192+
WHITESPACE " "
193+
TUPLE_EXPR
194+
L_PAREN "("
195+
R_PAREN ")"
196+
SEMICOLON ";"
77197
WHITESPACE "\n"
78198
R_CURLY "}"
79199
WHITESPACE "\n"
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,12 @@
11
fn main() {
22
let const { 15 } = ();
33
let const { foo(); bar() } = ();
4+
5+
match 42 {
6+
const { 0 } .. const { 1 } => (),
7+
.. const { 0 } => (),
8+
const { 2 } .. => (),
9+
}
10+
11+
let (const { () },) = ();
412
}

0 commit comments

Comments
 (0)