diff options
Diffstat (limited to 'crates/parser/src/grammar')
-rw-r--r-- | crates/parser/src/grammar/type_args.rs | 32 | ||||
-rw-r--r-- | crates/parser/src/grammar/type_params.rs | 10 |
2 files changed, 42 insertions, 0 deletions
diff --git a/crates/parser/src/grammar/type_args.rs b/crates/parser/src/grammar/type_args.rs index 56266b8d4..be36cad17 100644 --- a/crates/parser/src/grammar/type_args.rs +++ b/crates/parser/src/grammar/type_args.rs | |||
@@ -25,6 +25,38 @@ pub(super) fn opt_generic_arg_list(p: &mut Parser, colon_colon_required: bool) { | |||
25 | m.complete(p, GENERIC_ARG_LIST); | 25 | m.complete(p, GENERIC_ARG_LIST); |
26 | } | 26 | } |
27 | 27 | ||
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 | |||
28 | // test type_arg | 60 | // test type_arg |
29 | // type A = B<'static, i32, 1, { 2 }, Item=u64, true, false>; | 61 | // type A = B<'static, i32, 1, { 2 }, Item=u64, true, false>; |
30 | fn generic_arg(p: &mut Parser) { | 62 | fn generic_arg(p: &mut Parser) { |
diff --git a/crates/parser/src/grammar/type_params.rs b/crates/parser/src/grammar/type_params.rs index 3de5248da..b1f979281 100644 --- a/crates/parser/src/grammar/type_params.rs +++ b/crates/parser/src/grammar/type_params.rs | |||
@@ -70,6 +70,16 @@ fn const_param(p: &mut Parser, m: Marker) { | |||
70 | p.bump(T![const]); | 70 | p.bump(T![const]); |
71 | name(p); | 71 | name(p); |
72 | types::ascription(p); | 72 | 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 | |||
73 | m.complete(p, CONST_PARAM); | 83 | m.complete(p, CONST_PARAM); |
74 | } | 84 | } |
75 | 85 | ||