@@ -327,13 +327,11 @@ class Parser {
327
327
* VariableDefinitions : ( VariableDefinition+ )
328
328
*/
329
329
parseVariableDefinitions ( ) : Array < VariableDefinitionNode > {
330
- return this . peek ( TokenKind . PAREN_L )
331
- ? this . many (
332
- TokenKind . PAREN_L ,
333
- this . parseVariableDefinition ,
334
- TokenKind . PAREN_R ,
335
- )
336
- : [ ] ;
330
+ return this . optionalMany (
331
+ TokenKind . PAREN_L ,
332
+ this . parseVariableDefinition ,
333
+ TokenKind . PAREN_R ,
334
+ ) ;
337
335
}
338
336
339
337
/**
@@ -430,9 +428,7 @@ class Parser {
430
428
*/
431
429
parseArguments ( isConst : boolean ) : Array < ArgumentNode > {
432
430
const item = isConst ? this . parseConstArgument : this . parseArgument ;
433
- return this . peek ( TokenKind . PAREN_L )
434
- ? this . many ( TokenKind . PAREN_L , item , TokenKind . PAREN_R )
435
- : [ ] ;
431
+ return this . optionalMany ( TokenKind . PAREN_L , item , TokenKind . PAREN_R ) ;
436
432
}
437
433
438
434
/**
@@ -919,13 +915,11 @@ class Parser {
919
915
this . _lexer . advance ( ) ;
920
916
return [ ] ;
921
917
}
922
- return this . peek ( TokenKind . BRACE_L )
923
- ? this . many (
924
- TokenKind . BRACE_L ,
925
- this . parseFieldDefinition ,
926
- TokenKind . BRACE_R ,
927
- )
928
- : [ ] ;
918
+ return this . optionalMany (
919
+ TokenKind . BRACE_L ,
920
+ this . parseFieldDefinition ,
921
+ TokenKind . BRACE_R ,
922
+ ) ;
929
923
}
930
924
931
925
/**
@@ -955,10 +949,7 @@ class Parser {
955
949
* ArgumentsDefinition : ( InputValueDefinition+ )
956
950
*/
957
951
parseArgumentDefs ( ) : Array < InputValueDefinitionNode > {
958
- if ( ! this . peek ( TokenKind . PAREN_L ) ) {
959
- return [ ] ;
960
- }
961
- return this . many (
952
+ return this . optionalMany (
962
953
TokenKind . PAREN_L ,
963
954
this . parseInputValueDef ,
964
955
TokenKind . PAREN_R ,
@@ -1075,13 +1066,11 @@ class Parser {
1075
1066
* EnumValuesDefinition : { EnumValueDefinition+ }
1076
1067
*/
1077
1068
parseEnumValuesDefinition ( ) : Array < EnumValueDefinitionNode > {
1078
- return this . peek ( TokenKind . BRACE_L )
1079
- ? this . many (
1080
- TokenKind . BRACE_L ,
1081
- this . parseEnumValueDefinition ,
1082
- TokenKind . BRACE_R ,
1083
- )
1084
- : [ ] ;
1069
+ return this . optionalMany (
1070
+ TokenKind . BRACE_L ,
1071
+ this . parseEnumValueDefinition ,
1072
+ TokenKind . BRACE_R ,
1073
+ ) ;
1085
1074
}
1086
1075
1087
1076
/**
@@ -1128,9 +1117,11 @@ class Parser {
1128
1117
* InputFieldsDefinition : { InputValueDefinition+ }
1129
1118
*/
1130
1119
parseInputFieldsDefinition ( ) : Array < InputValueDefinitionNode > {
1131
- return this . peek ( TokenKind . BRACE_L )
1132
- ? this . many ( TokenKind . BRACE_L , this . parseInputValueDef , TokenKind . BRACE_R )
1133
- : [ ] ;
1120
+ return this . optionalMany (
1121
+ TokenKind . BRACE_L ,
1122
+ this . parseInputValueDef ,
1123
+ TokenKind . BRACE_R ,
1124
+ ) ;
1134
1125
}
1135
1126
1136
1127
/**
@@ -1181,13 +1172,11 @@ class Parser {
1181
1172
this . expectKeyword ( 'extend' ) ;
1182
1173
this . expectKeyword ( 'schema' ) ;
1183
1174
const directives = this . parseDirectives ( true ) ;
1184
- const operationTypes = this . peek ( TokenKind . BRACE_L )
1185
- ? this . many (
1186
- TokenKind . BRACE_L ,
1187
- this . parseOperationTypeDefinition ,
1188
- TokenKind . BRACE_R ,
1189
- )
1190
- : [ ] ;
1175
+ const operationTypes = this . optionalMany (
1176
+ TokenKind . BRACE_L ,
1177
+ this . parseOperationTypeDefinition ,
1178
+ TokenKind . BRACE_R ,
1179
+ ) ;
1191
1180
if ( directives . length === 0 && operationTypes . length === 0 ) {
1192
1181
throw this . unexpected ( ) ;
1193
1182
}
@@ -1535,6 +1524,28 @@ class Parser {
1535
1524
return nodes;
1536
1525
}
1537
1526
1527
+ /**
1528
+ * Returns a list of parse nodes, determined by the parseFn.
1529
+ * It can be empty only if open token is missing otherwise it will always
1530
+ * return non-empty list that begins with a lex token of openKind and ends
1531
+ * with a lex token of closeKind. Advances the parser to the next lex token
1532
+ * after the closing token.
1533
+ */
1534
+ optionalMany < T > (
1535
+ openKind : TokenKindEnum ,
1536
+ parseFn : ( ) => T ,
1537
+ closeKind : TokenKindEnum ,
1538
+ ) : Array < T > {
1539
+ if ( this . expectOptionalToken ( openKind ) ) {
1540
+ const nodes = [ ] ;
1541
+ do {
1542
+ nodes . push ( parseFn . call ( this ) ) ;
1543
+ } while ( ! this . expectOptionalToken ( closeKind ) ) ;
1544
+ return nodes ;
1545
+ }
1546
+ return [ ] ;
1547
+ }
1548
+
1538
1549
/**
1539
1550
* Returns a non-empty list of parse nodes, determined by
1540
1551
* the parseFn. This list begins with a lex token of openKind
0 commit comments