Skip to content

Commit dce0d71

Browse files
Merge #8685
8685: feat: parse const param defaults r=jonas-schievink a=jonas-schievink These will probably be stabilized in a few releases, let's make sure we can at least parse them bors r+ Co-authored-by: Jonas Schievink <jonasschievink@gmail.com>
2 parents 9d19948 + cb8632d commit dce0d71

File tree

4 files changed

+141
-0
lines changed

4 files changed

+141
-0
lines changed

crates/parser/src/grammar/type_args.rs

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,38 @@ pub(super) fn opt_generic_arg_list(p: &mut Parser, colon_colon_required: bool) {
2525
m.complete(p, GENERIC_ARG_LIST);
2626
}
2727

28+
pub(super) fn const_arg(p: &mut Parser) {
29+
let m = p.start();
30+
// FIXME: duplicates the code below
31+
match p.current() {
32+
T!['{'] => {
33+
expressions::block_expr(p);
34+
m.complete(p, CONST_ARG);
35+
}
36+
k if k.is_literal() => {
37+
expressions::literal(p);
38+
m.complete(p, CONST_ARG);
39+
}
40+
T![true] | T![false] => {
41+
expressions::literal(p);
42+
m.complete(p, CONST_ARG);
43+
}
44+
T![-] => {
45+
let lm = p.start();
46+
p.bump(T![-]);
47+
expressions::literal(p);
48+
lm.complete(p, PREFIX_EXPR);
49+
m.complete(p, CONST_ARG);
50+
}
51+
_ => {
52+
let lm = p.start();
53+
paths::use_path(p);
54+
lm.complete(p, PATH_EXPR);
55+
m.complete(p, CONST_ARG);
56+
}
57+
}
58+
}
59+
2860
// test type_arg
2961
// type A = B<'static, i32, 1, { 2 }, Item=u64, true, false>;
3062
fn generic_arg(p: &mut Parser) {

crates/parser/src/grammar/type_params.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,16 @@ fn const_param(p: &mut Parser, m: Marker) {
7070
p.bump(T![const]);
7171
name(p);
7272
types::ascription(p);
73+
74+
// test const_param_defaults
75+
// struct A<const N: i32 = -1>;
76+
// struct B<const N: i32 = {}>;
77+
// struct C<const N: i32 = some::CONST>;
78+
if p.at(T![=]) {
79+
p.bump(T![=]);
80+
type_args::const_arg(p);
81+
}
82+
7383
m.complete(p, CONST_PARAM);
7484
}
7585

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
SOURCE_FILE@0..96
2+
STRUCT@0..28
3+
STRUCT_KW@0..6 "struct"
4+
WHITESPACE@6..7 " "
5+
NAME@7..8
6+
IDENT@7..8 "A"
7+
GENERIC_PARAM_LIST@8..27
8+
L_ANGLE@8..9 "<"
9+
CONST_PARAM@9..26
10+
CONST_KW@9..14 "const"
11+
WHITESPACE@14..15 " "
12+
NAME@15..16
13+
IDENT@15..16 "N"
14+
COLON@16..17 ":"
15+
WHITESPACE@17..18 " "
16+
PATH_TYPE@18..21
17+
PATH@18..21
18+
PATH_SEGMENT@18..21
19+
NAME_REF@18..21
20+
IDENT@18..21 "i32"
21+
WHITESPACE@21..22 " "
22+
EQ@22..23 "="
23+
WHITESPACE@23..24 " "
24+
CONST_ARG@24..26
25+
PREFIX_EXPR@24..26
26+
MINUS@24..25 "-"
27+
LITERAL@25..26
28+
INT_NUMBER@25..26 "1"
29+
R_ANGLE@26..27 ">"
30+
SEMICOLON@27..28 ";"
31+
WHITESPACE@28..29 "\n"
32+
STRUCT@29..57
33+
STRUCT_KW@29..35 "struct"
34+
WHITESPACE@35..36 " "
35+
NAME@36..37
36+
IDENT@36..37 "B"
37+
GENERIC_PARAM_LIST@37..56
38+
L_ANGLE@37..38 "<"
39+
CONST_PARAM@38..55
40+
CONST_KW@38..43 "const"
41+
WHITESPACE@43..44 " "
42+
NAME@44..45
43+
IDENT@44..45 "N"
44+
COLON@45..46 ":"
45+
WHITESPACE@46..47 " "
46+
PATH_TYPE@47..50
47+
PATH@47..50
48+
PATH_SEGMENT@47..50
49+
NAME_REF@47..50
50+
IDENT@47..50 "i32"
51+
WHITESPACE@50..51 " "
52+
EQ@51..52 "="
53+
WHITESPACE@52..53 " "
54+
CONST_ARG@53..55
55+
BLOCK_EXPR@53..55
56+
L_CURLY@53..54 "{"
57+
R_CURLY@54..55 "}"
58+
R_ANGLE@55..56 ">"
59+
SEMICOLON@56..57 ";"
60+
WHITESPACE@57..58 "\n"
61+
STRUCT@58..95
62+
STRUCT_KW@58..64 "struct"
63+
WHITESPACE@64..65 " "
64+
NAME@65..66
65+
IDENT@65..66 "C"
66+
GENERIC_PARAM_LIST@66..94
67+
L_ANGLE@66..67 "<"
68+
CONST_PARAM@67..93
69+
CONST_KW@67..72 "const"
70+
WHITESPACE@72..73 " "
71+
NAME@73..74
72+
IDENT@73..74 "N"
73+
COLON@74..75 ":"
74+
WHITESPACE@75..76 " "
75+
PATH_TYPE@76..79
76+
PATH@76..79
77+
PATH_SEGMENT@76..79
78+
NAME_REF@76..79
79+
IDENT@76..79 "i32"
80+
WHITESPACE@79..80 " "
81+
EQ@80..81 "="
82+
WHITESPACE@81..82 " "
83+
CONST_ARG@82..93
84+
PATH_EXPR@82..93
85+
PATH@82..93
86+
PATH@82..86
87+
PATH_SEGMENT@82..86
88+
NAME_REF@82..86
89+
IDENT@82..86 "some"
90+
COLON2@86..88 "::"
91+
PATH_SEGMENT@88..93
92+
NAME_REF@88..93
93+
IDENT@88..93 "CONST"
94+
R_ANGLE@93..94 ">"
95+
SEMICOLON@94..95 ";"
96+
WHITESPACE@95..96 "\n"
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
struct A<const N: i32 = -1>;
2+
struct B<const N: i32 = {}>;
3+
struct C<const N: i32 = some::CONST>;

0 commit comments

Comments
 (0)