Skip to content

Commit e8d5057

Browse files
committed
Correctly parse <_> paths in patterns
closes #3659
1 parent 16943e5 commit e8d5057

File tree

4 files changed

+80
-39
lines changed

4 files changed

+80
-39
lines changed

crates/ra_parser/src/grammar/patterns.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,9 @@ fn atom_pat(p: &mut Parser, recovery_set: TokenSet) -> Option<CompletedMarker> {
8888
_ => bind_pat(p, true),
8989
},
9090

91-
_ if paths::is_use_path_start(p) => path_or_macro_pat(p),
91+
// test type_path_in_pattern
92+
// fn main() { let <_>::Foo = (); }
93+
_ if paths::is_path_start(p) => path_or_macro_pat(p),
9294
_ if is_literal_pat_start(p) => literal_pat(p),
9395

9496
T![.] if p.at(T![..]) => dot_dot_pat(p),
@@ -138,7 +140,7 @@ fn literal_pat(p: &mut Parser) -> CompletedMarker {
138140
// let Bar(..) = ();
139141
// }
140142
fn path_or_macro_pat(p: &mut Parser) -> CompletedMarker {
141-
assert!(paths::is_use_path_start(p));
143+
assert!(paths::is_path_start(p));
142144
let m = p.start();
143145
paths::expr_path(p);
144146
let kind = match p.current() {

crates/ra_syntax/test_data/parser/err/0024_many_type_parens.rast

Lines changed: 37 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -180,44 +180,45 @@ SOURCE_FILE@0..240
180180
EXPR_STMT@150..180
181181
TUPLE_EXPR@150..180
182182
L_PAREN@150..151 "("
183-
BIN_EXPR@151..180
184-
BIN_EXPR@151..178
185-
BIN_EXPR@151..169
186-
BIN_EXPR@151..167
187-
BIN_EXPR@151..164
188-
FOR_EXPR@151..157
189-
FOR_KW@151..154 "for"
190-
ERROR@154..155
191-
L_ANGLE@154..155 "<"
192-
ERROR@155..157
193-
LIFETIME@155..157 "\'a"
194-
R_ANGLE@157..158 ">"
195-
WHITESPACE@158..159 " "
183+
FOR_EXPR@151..180
184+
FOR_KW@151..154 "for"
185+
PATH_PAT@154..158
186+
PATH@154..158
187+
PATH_SEGMENT@154..158
188+
L_ANGLE@154..155 "<"
189+
ERROR@155..157
190+
LIFETIME@155..157 "\'a"
191+
R_ANGLE@157..158 ">"
192+
WHITESPACE@158..159 " "
193+
BIN_EXPR@159..180
194+
BIN_EXPR@159..178
195+
BIN_EXPR@159..169
196+
BIN_EXPR@159..167
196197
PATH_EXPR@159..164
197198
PATH@159..164
198199
PATH_SEGMENT@159..164
199200
NAME_REF@159..164
200201
IDENT@159..164 "Trait"
201-
L_ANGLE@164..165 "<"
202-
ERROR@165..167
203-
LIFETIME@165..167 "\'a"
204-
R_ANGLE@167..168 ">"
205-
ERROR@168..169
206-
R_PAREN@168..169 ")"
207-
WHITESPACE@169..170 " "
208-
PLUS@170..171 "+"
209-
WHITESPACE@171..172 " "
210-
PAREN_EXPR@172..178
211-
L_PAREN@172..173 "("
212-
PATH_EXPR@173..177
213-
PATH@173..177
214-
PATH_SEGMENT@173..177
215-
NAME_REF@173..177
216-
IDENT@173..177 "Copy"
217-
R_PAREN@177..178 ")"
218-
R_ANGLE@178..179 ">"
219-
ERROR@179..180
220-
SEMICOLON@179..180 ";"
202+
L_ANGLE@164..165 "<"
203+
ERROR@165..167
204+
LIFETIME@165..167 "\'a"
205+
R_ANGLE@167..168 ">"
206+
ERROR@168..169
207+
R_PAREN@168..169 ")"
208+
WHITESPACE@169..170 " "
209+
PLUS@170..171 "+"
210+
WHITESPACE@171..172 " "
211+
PAREN_EXPR@172..178
212+
L_PAREN@172..173 "("
213+
PATH_EXPR@173..177
214+
PATH@173..177
215+
PATH_SEGMENT@173..177
216+
NAME_REF@173..177
217+
IDENT@173..177 "Copy"
218+
R_PAREN@177..178 ")"
219+
R_ANGLE@178..179 ">"
220+
ERROR@179..180
221+
SEMICOLON@179..180 ";"
221222
WHITESPACE@180..185 "\n "
222223
LET_STMT@185..235
223224
LET_KW@185..188 "let"
@@ -302,13 +303,12 @@ error 146..146: expected expression
302303
error 147..147: expected SEMICOLON
303304
error 148..148: expected expression
304305
error 149..149: expected SEMICOLON
305-
error 154..154: expected pattern
306-
error 155..155: expected IN_KW
307-
error 155..155: expected expression
308-
error 157..157: expected a block
306+
error 155..155: expected type
307+
error 158..158: expected IN_KW
309308
error 165..165: expected expression
310309
error 168..168: expected expression
311310
error 179..179: expected expression
311+
error 180..180: expected a block
312312
error 180..180: expected COMMA
313313
error 180..180: expected expression
314314
error 180..180: expected R_PAREN
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
SOURCE_FILE@0..33
2+
FN_DEF@0..32
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_EXPR@10..32
12+
L_CURLY@10..11 "{"
13+
WHITESPACE@11..12 " "
14+
LET_STMT@12..30
15+
LET_KW@12..15 "let"
16+
WHITESPACE@15..16 " "
17+
PATH_PAT@16..24
18+
PATH@16..24
19+
PATH@16..19
20+
PATH_SEGMENT@16..19
21+
L_ANGLE@16..17 "<"
22+
PLACEHOLDER_TYPE@17..18
23+
UNDERSCORE@17..18 "_"
24+
R_ANGLE@18..19 ">"
25+
COLON2@19..21 "::"
26+
PATH_SEGMENT@21..24
27+
NAME_REF@21..24
28+
IDENT@21..24 "Foo"
29+
WHITESPACE@24..25 " "
30+
EQ@25..26 "="
31+
WHITESPACE@26..27 " "
32+
TUPLE_EXPR@27..29
33+
L_PAREN@27..28 "("
34+
R_PAREN@28..29 ")"
35+
SEMICOLON@29..30 ";"
36+
WHITESPACE@30..31 " "
37+
R_CURLY@31..32 "}"
38+
WHITESPACE@32..33 "\n"
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
fn main() { let <_>::Foo = (); }

0 commit comments

Comments
 (0)