Skip to content

Commit 43d9b84

Browse files
GrayJackMax Brunsfeld
andauthored
Add const generics to type parameters (#66)
* Add const generics to type parameters * Add tests to const generics * Avoid conflict by making 'function_type' more specific * Rename const_generics -> const_parameter Each of these nodes represents one const parameter in a type_parameters list. * Fix generic call accepting literals as type_arguments Co-authored-by: Max Brunsfeld <maxbrunsfeld@github.com>
1 parent 1c37782 commit 43d9b84

File tree

6 files changed

+59731
-59536
lines changed

6 files changed

+59731
-59536
lines changed

corpus/declarations.txt

Lines changed: 59 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -410,22 +410,37 @@ Generic structs
410410
struct A<B> {}
411411
struct C<'a, 'b> {}
412412
struct C<'a,> {}
413+
struct D<const SIZE: usize> {}
413414

414415
---
415416

416417
(source_file
417418
(struct_item
418-
(type_identifier)
419-
(type_parameters (type_identifier))
420-
(field_declaration_list))
419+
name: (type_identifier)
420+
type_parameters: (type_parameters
421+
(type_identifier))
422+
body: (field_declaration_list))
421423
(struct_item
422-
(type_identifier)
423-
(type_parameters (lifetime (identifier)) (lifetime (identifier)))
424-
(field_declaration_list))
424+
name: (type_identifier)
425+
type_parameters: (type_parameters
426+
(lifetime
427+
(identifier))
428+
(lifetime
429+
(identifier)))
430+
body: (field_declaration_list))
425431
(struct_item
426-
(type_identifier)
427-
(type_parameters (lifetime (identifier)))
428-
(field_declaration_list)))
432+
name: (type_identifier)
433+
type_parameters: (type_parameters
434+
(lifetime
435+
(identifier)))
436+
body: (field_declaration_list))
437+
(struct_item
438+
name: (type_identifier)
439+
type_parameters: (type_parameters
440+
(const_parameter
441+
name: (identifier)
442+
type: (type_identifier)))
443+
body: (field_declaration_list)))
429444

430445
============================================
431446
Enums
@@ -505,23 +520,48 @@ Generic functions
505520

506521
pub fn splice<T: Into<Text>>(&mut self, old_range: Range<usize>, new_text: T) {
507522
}
523+
pub fn uninit_array<const LEN: usize>() -> [Self; LEN] {}
508524

509525
---
510526

511527
(source_file
512528
(function_item
513529
(visibility_modifier)
514-
(identifier)
515-
(type_parameters
530+
name: (identifier)
531+
type_parameters: (type_parameters
516532
(constrained_type_parameter
517-
(type_identifier)
518-
(trait_bounds
519-
(generic_type (type_identifier) (type_arguments (type_identifier))))))
520-
(parameters
521-
(self_parameter (mutable_specifier) (self))
522-
(parameter (identifier) (generic_type (type_identifier) (type_arguments (primitive_type))))
523-
(parameter (identifier) (type_identifier)))
524-
(block)))
533+
left: (type_identifier)
534+
bounds: (trait_bounds
535+
(generic_type
536+
type: (type_identifier)
537+
type_arguments: (type_arguments
538+
(type_identifier))))))
539+
parameters: (parameters
540+
(self_parameter
541+
(mutable_specifier)
542+
(self))
543+
(parameter
544+
pattern: (identifier)
545+
type: (generic_type
546+
type: (type_identifier)
547+
type_arguments: (type_arguments
548+
(primitive_type))))
549+
(parameter
550+
pattern: (identifier)
551+
type: (type_identifier)))
552+
body: (block))
553+
(function_item
554+
(visibility_modifier)
555+
name: (identifier)
556+
type_parameters: (type_parameters
557+
(const_parameter
558+
name: (identifier)
559+
type: (type_identifier)))
560+
parameters: (parameters)
561+
return_type: (array_type
562+
element: (type_identifier)
563+
length: (identifier))
564+
body: (block)))
525565

526566
============================================
527567
Functions with mutable parameters

corpus/expressions.txt

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -594,13 +594,25 @@ Generic functions
594594
============================================
595595

596596
std::sizeof::<u32>();
597+
foo::<8>();
597598

598599
---
599600

600601
(source_file
601602
(call_expression
602-
(generic_function (scoped_identifier (identifier) (identifier)) (type_arguments (primitive_type)))
603-
(arguments)))
603+
function: (generic_function
604+
function: (scoped_identifier
605+
path: (identifier)
606+
name: (identifier))
607+
type_arguments: (type_arguments
608+
(primitive_type)))
609+
arguments: (arguments))
610+
(call_expression
611+
function: (generic_function
612+
function: (identifier)
613+
type_arguments: (type_arguments
614+
(integer_literal)))
615+
arguments: (arguments)))
604616

605617
===========================================
606618
Closures

grammar.js

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -511,12 +511,20 @@ module.exports = grammar({
511511
$.metavariable,
512512
$._type_identifier,
513513
$.constrained_type_parameter,
514-
$.optional_type_parameter
514+
$.optional_type_parameter,
515+
$.const_parameter,
515516
)),
516517
optional(','),
517518
'>'
518519
)),
519520

521+
const_parameter: $ => seq(
522+
'const',
523+
field('name', $.identifier),
524+
':',
525+
field('type', $._type_identifier),
526+
),
527+
520528
constrained_type_parameter: $ => seq(
521529
field('left', choice($.lifetime, $._type_identifier)),
522530
field('bounds', $.trait_bounds)
@@ -700,13 +708,17 @@ module.exports = grammar({
700708

701709
function_type: $ => seq(
702710
optional($.for_lifetimes),
703-
optional($.function_modifiers),
704711
prec(PREC.call, seq(
705-
field('trait', choice(
706-
$._type_identifier,
707-
$.scoped_type_identifier,
708-
'fn'
709-
)),
712+
choice(
713+
field('trait', choice(
714+
$._type_identifier,
715+
$.scoped_type_identifier
716+
)),
717+
seq(
718+
optional($.function_modifiers),
719+
'fn'
720+
)
721+
),
710722
field('parameters', $.parameters)
711723
)),
712724
optional(seq('->', field('return_type', $._type)))
@@ -759,7 +771,8 @@ module.exports = grammar({
759771
sepBy1(',', choice(
760772
$._type,
761773
$.type_binding,
762-
$.lifetime
774+
$.lifetime,
775+
$._literal,
763776
)),
764777
optional(','),
765778
'>'

src/grammar.json

Lines changed: 86 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -743,7 +743,7 @@
743743
},
744744
{
745745
"type": "PATTERN",
746-
"value": "[\\/_\\-=->,;:::!=?.@*=\\/='&=#%=^=+<>|~]+"
746+
"value": "[/_\\-=->,;:::!=?.@*=/='&=#%=^=+<>|~]+"
747747
},
748748
{
749749
"type": "STRING",
@@ -2866,6 +2866,10 @@
28662866
{
28672867
"type": "SYMBOL",
28682868
"name": "optional_type_parameter"
2869+
},
2870+
{
2871+
"type": "SYMBOL",
2872+
"name": "const_parameter"
28692873
}
28702874
]
28712875
},
@@ -2900,6 +2904,10 @@
29002904
{
29012905
"type": "SYMBOL",
29022906
"name": "optional_type_parameter"
2907+
},
2908+
{
2909+
"type": "SYMBOL",
2910+
"name": "const_parameter"
29032911
}
29042912
]
29052913
}
@@ -2927,6 +2935,35 @@
29272935
]
29282936
}
29292937
},
2938+
"const_parameter": {
2939+
"type": "SEQ",
2940+
"members": [
2941+
{
2942+
"type": "STRING",
2943+
"value": "const"
2944+
},
2945+
{
2946+
"type": "FIELD",
2947+
"name": "name",
2948+
"content": {
2949+
"type": "SYMBOL",
2950+
"name": "identifier"
2951+
}
2952+
},
2953+
{
2954+
"type": "STRING",
2955+
"value": ":"
2956+
},
2957+
{
2958+
"type": "FIELD",
2959+
"name": "type",
2960+
"content": {
2961+
"type": "SYMBOL",
2962+
"name": "_type_identifier"
2963+
}
2964+
}
2965+
]
2966+
},
29302967
"constrained_type_parameter": {
29312968
"type": "SEQ",
29322969
"members": [
@@ -3924,44 +3961,54 @@
39243961
}
39253962
]
39263963
},
3927-
{
3928-
"type": "CHOICE",
3929-
"members": [
3930-
{
3931-
"type": "SYMBOL",
3932-
"name": "function_modifiers"
3933-
},
3934-
{
3935-
"type": "BLANK"
3936-
}
3937-
]
3938-
},
39393964
{
39403965
"type": "PREC",
39413966
"value": 14,
39423967
"content": {
39433968
"type": "SEQ",
39443969
"members": [
39453970
{
3946-
"type": "FIELD",
3947-
"name": "trait",
3948-
"content": {
3949-
"type": "CHOICE",
3950-
"members": [
3951-
{
3952-
"type": "SYMBOL",
3953-
"name": "_type_identifier"
3954-
},
3955-
{
3956-
"type": "SYMBOL",
3957-
"name": "scoped_type_identifier"
3958-
},
3959-
{
3960-
"type": "STRING",
3961-
"value": "fn"
3971+
"type": "CHOICE",
3972+
"members": [
3973+
{
3974+
"type": "FIELD",
3975+
"name": "trait",
3976+
"content": {
3977+
"type": "CHOICE",
3978+
"members": [
3979+
{
3980+
"type": "SYMBOL",
3981+
"name": "_type_identifier"
3982+
},
3983+
{
3984+
"type": "SYMBOL",
3985+
"name": "scoped_type_identifier"
3986+
}
3987+
]
39623988
}
3963-
]
3964-
}
3989+
},
3990+
{
3991+
"type": "SEQ",
3992+
"members": [
3993+
{
3994+
"type": "CHOICE",
3995+
"members": [
3996+
{
3997+
"type": "SYMBOL",
3998+
"name": "function_modifiers"
3999+
},
4000+
{
4001+
"type": "BLANK"
4002+
}
4003+
]
4004+
},
4005+
{
4006+
"type": "STRING",
4007+
"value": "fn"
4008+
}
4009+
]
4010+
}
4011+
]
39654012
},
39664013
{
39674014
"type": "FIELD",
@@ -4258,6 +4305,10 @@
42584305
{
42594306
"type": "SYMBOL",
42604307
"name": "lifetime"
4308+
},
4309+
{
4310+
"type": "SYMBOL",
4311+
"name": "_literal"
42614312
}
42624313
]
42634314
},
@@ -4284,6 +4335,10 @@
42844335
{
42854336
"type": "SYMBOL",
42864337
"name": "lifetime"
4338+
},
4339+
{
4340+
"type": "SYMBOL",
4341+
"name": "_literal"
42874342
}
42884343
]
42894344
}

0 commit comments

Comments
 (0)