aboutsummaryrefslogtreecommitdiff
path: root/crates/parser
diff options
context:
space:
mode:
Diffstat (limited to 'crates/parser')
-rw-r--r--crates/parser/src/grammar/type_args.rs41
-rw-r--r--crates/parser/src/grammar/type_params.rs10
2 files changed, 51 insertions, 0 deletions
diff --git a/crates/parser/src/grammar/type_args.rs b/crates/parser/src/grammar/type_args.rs
index 42cd426bd..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
28pub(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>;
30fn generic_arg(p: &mut Parser) { 62fn generic_arg(p: &mut Parser) {
@@ -59,6 +91,15 @@ fn generic_arg(p: &mut Parser) {
59 expressions::literal(p); 91 expressions::literal(p);
60 m.complete(p, CONST_ARG); 92 m.complete(p, CONST_ARG);
61 } 93 }
94 // test const_generic_negated_literal
95 // fn f() { S::<-1> }
96 T![-] => {
97 let lm = p.start();
98 p.bump(T![-]);
99 expressions::literal(p);
100 lm.complete(p, PREFIX_EXPR);
101 m.complete(p, CONST_ARG);
102 }
62 _ => { 103 _ => {
63 types::type_(p); 104 types::type_(p);
64 m.complete(p, TYPE_ARG); 105 m.complete(p, TYPE_ARG);
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