Skip to content

Commit efe92b4

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

File tree

3 files changed

+145
-1
lines changed

3 files changed

+145
-1
lines changed

crates/parser/src/grammar/generic_args.rs

+5-1
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,11 @@ fn generic_arg(p: &mut Parser) {
4444
// type T = StreamingIterator<Item<'a> = &'a T>;
4545
T![=] => {
4646
p.bump_any();
47-
types::type_(p);
47+
if types::TYPE_FIRST.contains(p.current()) {
48+
types::type_(p);
49+
} else {
50+
const_arg(p);
51+
}
4852
m.complete(p, ASSOC_TYPE_ARG);
4953
}
5054
// test assoc_type_bound
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,137 @@
1+
SOURCE_FILE
2+
IMPL
3+
IMPL_KW "impl"
4+
GENERIC_PARAM_LIST
5+
L_ANGLE "<"
6+
TYPE_PARAM
7+
NAME
8+
IDENT "T"
9+
COMMA ","
10+
WHITESPACE " "
11+
CONST_PARAM
12+
CONST_KW "const"
13+
WHITESPACE " "
14+
NAME
15+
IDENT "N"
16+
COLON ":"
17+
WHITESPACE " "
18+
PATH_TYPE
19+
PATH
20+
PATH_SEGMENT
21+
NAME_REF
22+
IDENT "usize"
23+
R_ANGLE ">"
24+
WHITESPACE " "
25+
PATH_TYPE
26+
PATH
27+
PATH_SEGMENT
28+
NAME_REF
29+
IDENT "Foo"
30+
WHITESPACE " "
31+
FOR_KW "for"
32+
WHITESPACE " "
33+
PATH_TYPE
34+
PATH
35+
PATH_SEGMENT
36+
NAME_REF
37+
IDENT "T"
38+
WHITESPACE " "
39+
WHERE_CLAUSE
40+
WHERE_KW "where"
41+
WHITESPACE " "
42+
WHERE_PRED
43+
PATH_TYPE
44+
PATH
45+
PATH_SEGMENT
46+
NAME_REF
47+
IDENT "T"
48+
COLON ":"
49+
WHITESPACE " "
50+
TYPE_BOUND_LIST
51+
TYPE_BOUND
52+
PATH_TYPE
53+
PATH
54+
PATH_SEGMENT
55+
NAME_REF
56+
IDENT "HasCount"
57+
GENERIC_ARG_LIST
58+
L_ANGLE "<"
59+
ASSOC_TYPE_ARG
60+
NAME_REF
61+
IDENT "COUNT"
62+
WHITESPACE " "
63+
EQ "="
64+
WHITESPACE " "
65+
CONST_ARG
66+
BLOCK_EXPR
67+
STMT_LIST
68+
L_CURLY "{"
69+
PATH_EXPR
70+
PATH
71+
PATH_SEGMENT
72+
NAME_REF
73+
IDENT "N"
74+
R_CURLY "}"
75+
R_ANGLE ">"
76+
WHITESPACE " "
77+
ASSOC_ITEM_LIST
78+
L_CURLY "{"
79+
R_CURLY "}"
80+
WHITESPACE "\n\n"
81+
IMPL
82+
IMPL_KW "impl"
83+
GENERIC_PARAM_LIST
84+
L_ANGLE "<"
85+
TYPE_PARAM
86+
NAME
87+
IDENT "T"
88+
R_ANGLE ">"
89+
WHITESPACE " "
90+
PATH_TYPE
91+
PATH
92+
PATH_SEGMENT
93+
NAME_REF
94+
IDENT "Foo"
95+
WHITESPACE " "
96+
FOR_KW "for"
97+
WHITESPACE " "
98+
PATH_TYPE
99+
PATH
100+
PATH_SEGMENT
101+
NAME_REF
102+
IDENT "T"
103+
WHITESPACE " "
104+
WHERE_CLAUSE
105+
WHERE_KW "where"
106+
WHITESPACE " "
107+
WHERE_PRED
108+
PATH_TYPE
109+
PATH
110+
PATH_SEGMENT
111+
NAME_REF
112+
IDENT "T"
113+
COLON ":"
114+
WHITESPACE " "
115+
TYPE_BOUND_LIST
116+
TYPE_BOUND
117+
PATH_TYPE
118+
PATH
119+
PATH_SEGMENT
120+
NAME_REF
121+
IDENT "HasCount"
122+
GENERIC_ARG_LIST
123+
L_ANGLE "<"
124+
ASSOC_TYPE_ARG
125+
NAME_REF
126+
IDENT "COUNT"
127+
WHITESPACE " "
128+
EQ "="
129+
WHITESPACE " "
130+
CONST_ARG
131+
LITERAL
132+
INT_NUMBER "0"
133+
R_ANGLE ">"
134+
WHITESPACE " "
135+
ASSOC_ITEM_LIST
136+
L_CURLY "{"
137+
R_CURLY "}"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
impl<T, const N: usize> Foo for T where T: HasCount<COUNT = {N}> {}
2+
3+
impl<T> Foo for T where T: HasCount<COUNT = 0> {}

0 commit comments

Comments
 (0)