Skip to content

Commit 6580d75

Browse files
committed
update parser to support associated const equality
1 parent bdecd93 commit 6580d75

File tree

3 files changed

+119
-3
lines changed

3 files changed

+119
-3
lines changed

crates/parser/src/grammar/generic_args.rs

+11-3
Original file line numberDiff line numberDiff line change
@@ -40,11 +40,19 @@ fn generic_arg(p: &mut Parser) {
4040
name_ref(p);
4141
opt_generic_arg_list(p, false);
4242
match p.current() {
43-
// test assoc_type_eq
44-
// type T = StreamingIterator<Item<'a> = &'a T>;
4543
T![=] => {
4644
p.bump_any();
47-
types::type_(p);
45+
if types::TYPE_FIRST.contains(p.current()) {
46+
// test assoc_type_eq
47+
// type T = StreamingIterator<Item<'a> = &'a T>;
48+
types::type_(p);
49+
} else {
50+
// test assoc_const_eq
51+
// fn foo<F: Foo<N=3>>() {}
52+
// const TEST: usize = 3;
53+
// fn bar<F: Foo<N={TEST}>>() {}
54+
const_arg(p);
55+
}
4856
m.complete(p, ASSOC_TYPE_ARG);
4957
}
5058
// test assoc_type_bound
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
SOURCE_FILE
2+
FN
3+
FN_KW "fn"
4+
WHITESPACE " "
5+
NAME
6+
IDENT "foo"
7+
GENERIC_PARAM_LIST
8+
L_ANGLE "<"
9+
TYPE_PARAM
10+
NAME
11+
IDENT "F"
12+
COLON ":"
13+
WHITESPACE " "
14+
TYPE_BOUND_LIST
15+
TYPE_BOUND
16+
PATH_TYPE
17+
PATH
18+
PATH_SEGMENT
19+
NAME_REF
20+
IDENT "Foo"
21+
GENERIC_ARG_LIST
22+
L_ANGLE "<"
23+
ASSOC_TYPE_ARG
24+
NAME_REF
25+
IDENT "N"
26+
EQ "="
27+
CONST_ARG
28+
LITERAL
29+
INT_NUMBER "3"
30+
R_ANGLE ">"
31+
R_ANGLE ">"
32+
PARAM_LIST
33+
L_PAREN "("
34+
R_PAREN ")"
35+
WHITESPACE " "
36+
BLOCK_EXPR
37+
STMT_LIST
38+
L_CURLY "{"
39+
R_CURLY "}"
40+
WHITESPACE "\n"
41+
CONST
42+
CONST_KW "const"
43+
WHITESPACE " "
44+
NAME
45+
IDENT "TEST"
46+
COLON ":"
47+
WHITESPACE " "
48+
PATH_TYPE
49+
PATH
50+
PATH_SEGMENT
51+
NAME_REF
52+
IDENT "usize"
53+
WHITESPACE " "
54+
EQ "="
55+
WHITESPACE " "
56+
LITERAL
57+
INT_NUMBER "3"
58+
SEMICOLON ";"
59+
WHITESPACE "\n"
60+
FN
61+
FN_KW "fn"
62+
WHITESPACE " "
63+
NAME
64+
IDENT "bar"
65+
GENERIC_PARAM_LIST
66+
L_ANGLE "<"
67+
TYPE_PARAM
68+
NAME
69+
IDENT "F"
70+
COLON ":"
71+
WHITESPACE " "
72+
TYPE_BOUND_LIST
73+
TYPE_BOUND
74+
PATH_TYPE
75+
PATH
76+
PATH_SEGMENT
77+
NAME_REF
78+
IDENT "Foo"
79+
GENERIC_ARG_LIST
80+
L_ANGLE "<"
81+
ASSOC_TYPE_ARG
82+
NAME_REF
83+
IDENT "N"
84+
EQ "="
85+
CONST_ARG
86+
BLOCK_EXPR
87+
STMT_LIST
88+
L_CURLY "{"
89+
PATH_EXPR
90+
PATH
91+
PATH_SEGMENT
92+
NAME_REF
93+
IDENT "TEST"
94+
R_CURLY "}"
95+
R_ANGLE ">"
96+
R_ANGLE ">"
97+
PARAM_LIST
98+
L_PAREN "("
99+
R_PAREN ")"
100+
WHITESPACE " "
101+
BLOCK_EXPR
102+
STMT_LIST
103+
L_CURLY "{"
104+
R_CURLY "}"
105+
WHITESPACE "\n"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
fn foo<F: Foo<N=3>>() {}
2+
const TEST: usize = 3;
3+
fn bar<F: Foo<N={TEST}>>() {}

0 commit comments

Comments
 (0)