@@ -91,6 +91,11 @@ module.exports = grammar({
91
91
[ $ . class_parameters ] ,
92
92
// 'for' operator_identifier ':' _annotated_type • ':' …
93
93
[ $ . _type , $ . compound_type ] ,
94
+ // 'given' '(' operator_identifier ':' _type • ',' …
95
+ [ $ . name_and_type , $ . parameter ] ,
96
+ [ $ . _simple_expression , $ . binding , $ . tuple_pattern ] ,
97
+ [ $ . _simple_expression , $ . tuple_pattern ] ,
98
+ [ $ . _simple_expression , $ . _type_identifier ] ,
94
99
// 'if' parenthesized_expression • '{' …
95
100
[ $ . _if_condition , $ . _simple_expression ] ,
96
101
// _postfix_expression_choice ':' '(' wildcard • ':' …
@@ -785,6 +790,19 @@ module.exports = grammar({
785
790
) ,
786
791
) ,
787
792
793
+ /*
794
+ * NameAndType ::= id ':' Type
795
+ */
796
+ name_and_type : $ =>
797
+ prec . left (
798
+ PREC . control ,
799
+ seq (
800
+ field ( "name" , $ . _identifier ) ,
801
+ ":" ,
802
+ field ( "type" , $ . _param_type ) ,
803
+ ) ,
804
+ ) ,
805
+
788
806
_block : $ =>
789
807
prec . left (
790
808
seq (
@@ -837,6 +855,7 @@ module.exports = grammar({
837
855
$ . generic_type ,
838
856
$ . projected_type ,
839
857
$ . tuple_type ,
858
+ $ . named_tuple_type ,
840
859
$ . singleton_type ,
841
860
$ . stable_type_identifier ,
842
861
$ . _type_identifier ,
@@ -897,6 +916,12 @@ module.exports = grammar({
897
916
898
917
tuple_type : $ => seq ( "(" , trailingCommaSep1 ( $ . _type ) , ")" ) ,
899
918
919
+ named_tuple_type : $ => seq (
920
+ "(" ,
921
+ trailingCommaSep1 ( $ . name_and_type ) ,
922
+ ")" ,
923
+ ) ,
924
+
900
925
singleton_type : $ =>
901
926
prec . left (
902
927
PREC . stable_type_id ,
@@ -991,6 +1016,7 @@ module.exports = grammar({
991
1016
$ . interpolated_string_expression ,
992
1017
$ . capture_pattern ,
993
1018
$ . tuple_pattern ,
1019
+ $ . named_tuple_pattern ,
994
1020
$ . case_class_pattern ,
995
1021
$ . infix_pattern ,
996
1022
$ . alternative_pattern ,
@@ -1006,7 +1032,10 @@ module.exports = grammar({
1006
1032
seq (
1007
1033
field ( "type" , choice ( $ . _type_identifier , $ . stable_type_identifier ) ) ,
1008
1034
"(" ,
1009
- field ( "pattern" , trailingCommaSep ( $ . _pattern ) ) ,
1035
+ choice (
1036
+ field ( "pattern" , trailingCommaSep ( $ . _pattern ) ) ,
1037
+ field ( "pattern" , trailingCommaSep ( $ . named_pattern ) ) ,
1038
+ ) ,
1010
1039
")" ,
1011
1040
) ,
1012
1041
@@ -1034,15 +1063,28 @@ module.exports = grammar({
1034
1063
1035
1064
typed_pattern : $ =>
1036
1065
prec . right (
1066
+ - 1 ,
1037
1067
seq ( field ( "pattern" , $ . _pattern ) , ":" , field ( "type" , $ . _type ) ) ,
1038
1068
) ,
1039
1069
1040
1070
given_pattern : $ => seq ( "given" , field ( "type" , $ . _type ) ) ,
1041
1071
1042
1072
// TODO: Flatten this.
1043
- alternative_pattern : $ => prec . left ( - 1 , seq ( $ . _pattern , "|" , $ . _pattern ) ) ,
1073
+ alternative_pattern : $ => prec . left ( - 2 , seq ( $ . _pattern , "|" , $ . _pattern ) ) ,
1074
+
1075
+ tuple_pattern : $ => seq (
1076
+ "(" ,
1077
+ trailingCommaSep1 ( $ . _pattern ) ,
1078
+ ")" ,
1079
+ ) ,
1080
+
1081
+ named_pattern : $ => prec . left ( - 1 , seq ( $ . _identifier , "=" , $ . _pattern ) ) ,
1044
1082
1045
- tuple_pattern : $ => seq ( "(" , $ . _pattern , repeat ( seq ( "," , $ . _pattern ) ) , ")" ) ,
1083
+ named_tuple_pattern : $ => seq (
1084
+ "(" ,
1085
+ trailingCommaSep1 ( $ . named_pattern ) ,
1086
+ ")" ,
1087
+ ) ,
1046
1088
1047
1089
// ---------------------------------------------------------------
1048
1090
// Expressions
0 commit comments