@@ -92,6 +92,11 @@ module.exports = grammar({
92
92
[ $ . class_parameters ] ,
93
93
// 'for' operator_identifier ':' _annotated_type • ':' …
94
94
[ $ . _type , $ . compound_type ] ,
95
+ // 'given' '(' operator_identifier ':' _type • ',' …
96
+ [ $ . name_and_type , $ . parameter ] ,
97
+ [ $ . _simple_expression , $ . binding , $ . tuple_pattern ] ,
98
+ [ $ . _simple_expression , $ . tuple_pattern ] ,
99
+ [ $ . _simple_expression , $ . _type_identifier ] ,
95
100
// 'if' parenthesized_expression • '{' …
96
101
[ $ . _if_condition , $ . _simple_expression ] ,
97
102
[ $ . block , $ . _braced_template_body1 ] ,
@@ -575,10 +580,14 @@ module.exports = grammar({
575
580
prec . right (
576
581
seq (
577
582
field ( "name" , $ . _identifier ) ,
578
- field ( "type_parameters" , optional ( $ . type_parameters ) ) ,
579
583
field (
580
584
"parameters" ,
581
- repeat ( seq ( optional ( $ . _automatic_semicolon ) , $ . parameters ) ) ,
585
+ repeat (
586
+ seq (
587
+ optional ( $ . _automatic_semicolon ) ,
588
+ choice ( $ . parameters , $ . type_parameters ) ,
589
+ ) ,
590
+ ) ,
582
591
) ,
583
592
optional ( $ . _automatic_semicolon ) ,
584
593
) ,
@@ -818,6 +827,19 @@ module.exports = grammar({
818
827
) ,
819
828
) ,
820
829
830
+ /*
831
+ * NameAndType ::= id ':' Type
832
+ */
833
+ name_and_type : $ =>
834
+ prec . left (
835
+ PREC . control ,
836
+ seq (
837
+ field ( "name" , $ . _identifier ) ,
838
+ ":" ,
839
+ field ( "type" , $ . _param_type ) ,
840
+ ) ,
841
+ ) ,
842
+
821
843
_block : $ =>
822
844
prec . left (
823
845
seq (
@@ -872,6 +894,7 @@ module.exports = grammar({
872
894
$ . generic_type ,
873
895
$ . projected_type ,
874
896
$ . tuple_type ,
897
+ $ . named_tuple_type ,
875
898
$ . singleton_type ,
876
899
$ . stable_type_identifier ,
877
900
$ . _type_identifier ,
@@ -933,6 +956,12 @@ module.exports = grammar({
933
956
934
957
tuple_type : $ => seq ( "(" , trailingCommaSep1 ( $ . _type ) , ")" ) ,
935
958
959
+ named_tuple_type : $ => seq (
960
+ "(" ,
961
+ trailingCommaSep1 ( $ . name_and_type ) ,
962
+ ")" ,
963
+ ) ,
964
+
936
965
singleton_type : $ =>
937
966
prec . left (
938
967
PREC . stable_type_id ,
@@ -1027,6 +1056,7 @@ module.exports = grammar({
1027
1056
$ . interpolated_string_expression ,
1028
1057
$ . capture_pattern ,
1029
1058
$ . tuple_pattern ,
1059
+ $ . named_tuple_pattern ,
1030
1060
$ . case_class_pattern ,
1031
1061
$ . infix_pattern ,
1032
1062
$ . alternative_pattern ,
@@ -1042,7 +1072,10 @@ module.exports = grammar({
1042
1072
seq (
1043
1073
field ( "type" , choice ( $ . _type_identifier , $ . stable_type_identifier ) ) ,
1044
1074
"(" ,
1045
- field ( "pattern" , trailingCommaSep ( $ . _pattern ) ) ,
1075
+ choice (
1076
+ field ( "pattern" , trailingCommaSep ( $ . _pattern ) ) ,
1077
+ field ( "pattern" , trailingCommaSep ( $ . named_pattern ) ) ,
1078
+ ) ,
1046
1079
")" ,
1047
1080
) ,
1048
1081
@@ -1070,15 +1103,28 @@ module.exports = grammar({
1070
1103
1071
1104
typed_pattern : $ =>
1072
1105
prec . right (
1106
+ - 1 ,
1073
1107
seq ( field ( "pattern" , $ . _pattern ) , ":" , field ( "type" , $ . _type ) ) ,
1074
1108
) ,
1075
1109
1076
1110
given_pattern : $ => seq ( "given" , field ( "type" , $ . _type ) ) ,
1077
1111
1078
1112
// TODO: Flatten this.
1079
- alternative_pattern : $ => prec . left ( - 1 , seq ( $ . _pattern , "|" , $ . _pattern ) ) ,
1113
+ alternative_pattern : $ => prec . left ( - 2 , seq ( $ . _pattern , "|" , $ . _pattern ) ) ,
1114
+
1115
+ tuple_pattern : $ => seq (
1116
+ "(" ,
1117
+ trailingCommaSep1 ( $ . _pattern ) ,
1118
+ ")" ,
1119
+ ) ,
1120
+
1121
+ named_pattern : $ => prec . left ( - 1 , seq ( $ . _identifier , "=" , $ . _pattern ) ) ,
1080
1122
1081
- tuple_pattern : $ => seq ( "(" , $ . _pattern , repeat ( seq ( "," , $ . _pattern ) ) , ")" ) ,
1123
+ named_tuple_pattern : $ => seq (
1124
+ "(" ,
1125
+ trailingCommaSep1 ( $ . named_pattern ) ,
1126
+ ")" ,
1127
+ ) ,
1082
1128
1083
1129
// ---------------------------------------------------------------
1084
1130
// Expressions
0 commit comments