Skip to content

Commit 972f50d

Browse files
committed
fix: Stop wrapping ConstParam's default values in ConstArg
This was causing ConstParam::default_val to always return None for block expressions. CONST_ARG@24..29 BLOCK_EXPR@24..29 ...
1 parent 224a255 commit 972f50d

8 files changed

+82
-50
lines changed

crates/parser/src/grammar/generic_args.rs

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -72,28 +72,24 @@ fn lifetime_arg(p: &mut Parser) {
7272
m.complete(p, LIFETIME_ARG);
7373
}
7474

75-
// test const_arg
76-
// type T = S<92>;
77-
pub(super) fn const_arg(p: &mut Parser) {
78-
let m = p.start();
75+
pub(super) fn const_arg_content(p: &mut Parser) {
76+
// The tests in here are really for `const_arg`, which wraps the content
77+
// CONST_ARG.
7978
match p.current() {
8079
// test const_arg_block
8180
// type T = S<{90 + 2}>;
8281
T!['{'] => {
8382
expressions::block_expr(p);
84-
m.complete(p, CONST_ARG);
8583
}
8684
// test const_arg_literal
8785
// type T = S<"hello", 0xdeadbeef>;
8886
k if k.is_literal() => {
8987
expressions::literal(p);
90-
m.complete(p, CONST_ARG);
9188
}
9289
// test const_arg_bool_literal
9390
// type T = S<true>;
9491
T![true] | T![false] => {
9592
expressions::literal(p);
96-
m.complete(p, CONST_ARG);
9793
}
9894
// test const_arg_negative_number
9995
// type T = S<-92>;
@@ -102,19 +98,25 @@ pub(super) fn const_arg(p: &mut Parser) {
10298
p.bump(T![-]);
10399
expressions::literal(p);
104100
lm.complete(p, PREFIX_EXPR);
105-
m.complete(p, CONST_ARG);
106101
}
107102
// test const_arg_path
108-
// struct S<const N: u32 = u32::MAX>;
103+
// type T = S<u32::MAX>;
109104
_ => {
110105
let lm = p.start();
111106
paths::use_path(p);
112107
lm.complete(p, PATH_EXPR);
113-
m.complete(p, CONST_ARG);
114108
}
115109
}
116110
}
117111

112+
// test const_arg
113+
// type T = S<92>;
114+
pub(super) fn const_arg(p: &mut Parser) {
115+
let m = p.start();
116+
const_arg_content(p);
117+
m.complete(p, CONST_ARG);
118+
}
119+
118120
fn type_arg(p: &mut Parser) {
119121
let m = p.start();
120122
types::type_(p);

crates/parser/src/grammar/generic_params.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -79,10 +79,13 @@ fn const_param(p: &mut Parser, m: Marker) {
7979
}
8080

8181
if p.at(T![=]) {
82-
// test const_param_defaults
82+
// test const_param_default_literal
8383
// struct A<const N: i32 = -1>;
8484
p.bump(T![=]);
85-
generic_args::const_arg(p);
85+
86+
// test const_param_default_expression
87+
// struct A<const N: i32 = { 1 }>;
88+
generic_args::const_arg_content(p);
8689
}
8790

8891
m.complete(p, CONST_PARAM);
Lines changed: 25 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,30 @@
11
SOURCE_FILE
2-
STRUCT
3-
STRUCT_KW "struct"
2+
TYPE_ALIAS
3+
TYPE_KW "type"
44
WHITESPACE " "
55
NAME
6-
IDENT "S"
7-
GENERIC_PARAM_LIST
8-
L_ANGLE "<"
9-
CONST_PARAM
10-
CONST_KW "const"
11-
WHITESPACE " "
12-
NAME
13-
IDENT "N"
14-
COLON ":"
15-
WHITESPACE " "
16-
PATH_TYPE
17-
PATH
18-
PATH_SEGMENT
19-
NAME_REF
20-
IDENT "u32"
21-
WHITESPACE " "
22-
EQ "="
23-
WHITESPACE " "
24-
CONST_ARG
25-
PATH_EXPR
26-
PATH
27-
PATH
28-
PATH_SEGMENT
29-
NAME_REF
30-
IDENT "u32"
31-
COLON2 "::"
32-
PATH_SEGMENT
33-
NAME_REF
34-
IDENT "MAX"
35-
R_ANGLE ">"
6+
IDENT "T"
7+
WHITESPACE " "
8+
EQ "="
9+
WHITESPACE " "
10+
PATH_TYPE
11+
PATH
12+
PATH_SEGMENT
13+
NAME_REF
14+
IDENT "S"
15+
GENERIC_ARG_LIST
16+
L_ANGLE "<"
17+
TYPE_ARG
18+
PATH_TYPE
19+
PATH
20+
PATH
21+
PATH_SEGMENT
22+
NAME_REF
23+
IDENT "u32"
24+
COLON2 "::"
25+
PATH_SEGMENT
26+
NAME_REF
27+
IDENT "MAX"
28+
R_ANGLE ">"
3629
SEMICOLON ";"
3730
WHITESPACE "\n"
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
struct S<const N: u32 = u32::MAX>;
1+
type T = S<u32::MAX>;
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
SOURCE_FILE
2+
STRUCT
3+
STRUCT_KW "struct"
4+
WHITESPACE " "
5+
NAME
6+
IDENT "A"
7+
GENERIC_PARAM_LIST
8+
L_ANGLE "<"
9+
CONST_PARAM
10+
CONST_KW "const"
11+
WHITESPACE " "
12+
NAME
13+
IDENT "N"
14+
COLON ":"
15+
WHITESPACE " "
16+
PATH_TYPE
17+
PATH
18+
PATH_SEGMENT
19+
NAME_REF
20+
IDENT "i32"
21+
WHITESPACE " "
22+
EQ "="
23+
WHITESPACE " "
24+
BLOCK_EXPR
25+
STMT_LIST
26+
L_CURLY "{"
27+
WHITESPACE " "
28+
LITERAL
29+
INT_NUMBER "1"
30+
WHITESPACE " "
31+
R_CURLY "}"
32+
R_ANGLE ">"
33+
SEMICOLON ";"
34+
WHITESPACE "\n"
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
struct A<const N: i32 = { 1 }>;

crates/parser/test_data/parser/inline/ok/0165_const_param_defaults.rast renamed to crates/parser/test_data/parser/inline/ok/0200_const_param_default_literal.rast

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,10 @@ SOURCE_FILE
2121
WHITESPACE " "
2222
EQ "="
2323
WHITESPACE " "
24-
CONST_ARG
25-
PREFIX_EXPR
26-
MINUS "-"
27-
LITERAL
28-
INT_NUMBER "1"
24+
PREFIX_EXPR
25+
MINUS "-"
26+
LITERAL
27+
INT_NUMBER "1"
2928
R_ANGLE ">"
3029
SEMICOLON ";"
3130
WHITESPACE "\n"

0 commit comments

Comments
 (0)