@@ -150,9 +150,9 @@ export function parseValue(
150
150
) : ValueNode {
151
151
const sourceObj = typeof source === 'string' ? new Source ( source ) : source ;
152
152
const lexer = createLexer ( sourceObj , options || { } ) ;
153
- expect ( lexer , TokenKind . SOF ) ;
153
+ expectToken ( lexer , TokenKind . SOF ) ;
154
154
const value = parseValueLiteral ( lexer , false ) ;
155
- expect ( lexer , TokenKind . EOF ) ;
155
+ expectToken ( lexer , TokenKind . EOF ) ;
156
156
return value ;
157
157
}
158
158
@@ -172,17 +172,17 @@ export function parseType(
172
172
) : TypeNode {
173
173
const sourceObj = typeof source === 'string' ? new Source ( source ) : source ;
174
174
const lexer = createLexer ( sourceObj , options || { } ) ;
175
- expect ( lexer , TokenKind . SOF ) ;
175
+ expectToken ( lexer , TokenKind . SOF ) ;
176
176
const type = parseTypeReference ( lexer ) ;
177
- expect ( lexer , TokenKind . EOF ) ;
177
+ expectToken ( lexer , TokenKind . EOF ) ;
178
178
return type ;
179
179
}
180
180
181
181
/**
182
182
* Converts a name lex token into a name parse node.
183
183
*/
184
184
function parseName ( lexer : Lexer < * > ) : NameNode {
185
- const token = expect ( lexer , TokenKind . NAME ) ;
185
+ const token = expectToken ( lexer , TokenKind . NAME ) ;
186
186
return {
187
187
kind : Kind . NAME ,
188
188
value : ( ( token . value : any ) : string ) ,
@@ -302,7 +302,7 @@ function parseOperationDefinition(lexer: Lexer<*>): OperationDefinitionNode {
302
302
* OperationType : one of query mutation subscription
303
303
*/
304
304
function parseOperationType ( lexer : Lexer < * > ) : OperationTypeNode {
305
- const operationToken = expect ( lexer , TokenKind . NAME ) ;
305
+ const operationToken = expectToken ( lexer , TokenKind . NAME ) ;
306
306
switch ( operationToken . value ) {
307
307
case 'query' :
308
308
return 'query' ;
@@ -334,8 +334,8 @@ function parseVariableDefinition(lexer: Lexer<*>): VariableDefinitionNode {
334
334
return {
335
335
kind : Kind . VARIABLE_DEFINITION ,
336
336
variable : parseVariable ( lexer ) ,
337
- type : ( expect ( lexer , TokenKind . COLON ) , parseTypeReference ( lexer ) ) ,
338
- defaultValue : skip ( lexer , TokenKind . EQUALS )
337
+ type : ( expectToken ( lexer , TokenKind . COLON ) , parseTypeReference ( lexer ) ) ,
338
+ defaultValue : expectOptionalToken ( lexer , TokenKind . EQUALS )
339
339
? parseValueLiteral ( lexer , true )
340
340
: undefined ,
341
341
directives : parseDirectives ( lexer , true ) ,
@@ -348,7 +348,7 @@ function parseVariableDefinition(lexer: Lexer<*>): VariableDefinitionNode {
348
348
*/
349
349
function parseVariable ( lexer : Lexer < * > ) : VariableNode {
350
350
const start = lexer . token ;
351
- expect ( lexer , TokenKind . DOLLAR ) ;
351
+ expectToken ( lexer , TokenKind . DOLLAR ) ;
352
352
return {
353
353
kind : Kind . VARIABLE ,
354
354
name : parseName ( lexer ) ,
@@ -396,7 +396,7 @@ function parseField(lexer: Lexer<*>): FieldNode {
396
396
const nameOrAlias = parseName ( lexer ) ;
397
397
let alias ;
398
398
let name ;
399
- if ( skip ( lexer , TokenKind . COLON ) ) {
399
+ if ( expectOptionalToken ( lexer , TokenKind . COLON ) ) {
400
400
alias = nameOrAlias ;
401
401
name = parseName ( lexer ) ;
402
402
} else {
@@ -434,10 +434,13 @@ function parseArguments(
434
434
*/
435
435
function parseArgument ( lexer : Lexer < * > ) : ArgumentNode {
436
436
const start = lexer . token ;
437
+ const name = parseName ( lexer ) ;
438
+
439
+ expectToken ( lexer , TokenKind . COLON ) ;
437
440
return {
438
441
kind : Kind . ARGUMENT ,
439
- name : parseName ( lexer ) ,
440
- value : ( expect ( lexer , TokenKind . COLON ) , parseValueLiteral ( lexer , false ) ) ,
442
+ name,
443
+ value : parseValueLiteral ( lexer , false ) ,
441
444
loc : loc ( lexer , start ) ,
442
445
} ;
443
446
}
@@ -447,7 +450,7 @@ function parseConstArgument(lexer: Lexer<*>): ArgumentNode {
447
450
return {
448
451
kind : Kind . ARGUMENT ,
449
452
name : parseName ( lexer ) ,
450
- value : ( expect ( lexer , TokenKind . COLON ) , parseConstValue ( lexer ) ) ,
453
+ value : ( expectToken ( lexer , TokenKind . COLON ) , parseConstValue ( lexer ) ) ,
451
454
loc : loc ( lexer , start ) ,
452
455
} ;
453
456
}
@@ -465,9 +468,9 @@ function parseFragment(
465
468
lexer : Lexer < * > ,
466
469
) : FragmentSpreadNode | InlineFragmentNode {
467
470
const start = lexer . token ;
468
- expect ( lexer , TokenKind . SPREAD ) ;
471
+ expectToken ( lexer , TokenKind . SPREAD ) ;
469
472
470
- const hasTypeCondition = skipKeyword ( lexer , 'on' ) ;
473
+ const hasTypeCondition = expectOptionalKeyword ( lexer , 'on' ) ;
471
474
if ( ! hasTypeCondition && peek ( lexer , TokenKind . NAME ) ) {
472
475
return {
473
476
kind : Kind . FRAGMENT_SPREAD ,
@@ -643,9 +646,9 @@ function parseList(lexer: Lexer<*>, isConst: boolean): ListValueNode {
643
646
*/
644
647
function parseObject ( lexer : Lexer < * > , isConst : boolean ) : ObjectValueNode {
645
648
const start = lexer . token ;
646
- expect ( lexer , TokenKind . BRACE_L ) ;
649
+ expectToken ( lexer , TokenKind . BRACE_L ) ;
647
650
const fields = [ ] ;
648
- while ( ! skip ( lexer , TokenKind . BRACE_R ) ) {
651
+ while ( ! expectOptionalToken ( lexer , TokenKind . BRACE_R ) ) {
649
652
fields . push ( parseObjectField ( lexer , isConst ) ) ;
650
653
}
651
654
return {
@@ -660,10 +663,13 @@ function parseObject(lexer: Lexer<*>, isConst: boolean): ObjectValueNode {
660
663
*/
661
664
function parseObjectField ( lexer : Lexer < * > , isConst : boolean ) : ObjectFieldNode {
662
665
const start = lexer . token ;
666
+ const name = parseName ( lexer ) ;
667
+ expectToken ( lexer , TokenKind . COLON ) ;
668
+
663
669
return {
664
670
kind : Kind . OBJECT_FIELD ,
665
- name : parseName ( lexer ) ,
666
- value : ( expect ( lexer , TokenKind . COLON ) , parseValueLiteral ( lexer , isConst ) ) ,
671
+ name,
672
+ value : parseValueLiteral ( lexer , isConst ) ,
667
673
loc : loc ( lexer , start ) ,
668
674
} ;
669
675
}
@@ -689,7 +695,7 @@ function parseDirectives(
689
695
*/
690
696
function parseDirective ( lexer : Lexer < * > , isConst : boolean ) : DirectiveNode {
691
697
const start = lexer . token ;
692
- expect ( lexer , TokenKind . AT ) ;
698
+ expectToken ( lexer , TokenKind . AT ) ;
693
699
return {
694
700
kind : Kind . DIRECTIVE ,
695
701
name : parseName ( lexer ) ,
@@ -709,9 +715,9 @@ function parseDirective(lexer: Lexer<*>, isConst: boolean): DirectiveNode {
709
715
export function parseTypeReference ( lexer : Lexer < * > ) : TypeNode {
710
716
const start = lexer . token ;
711
717
let type ;
712
- if ( skip ( lexer , TokenKind . BRACKET_L ) ) {
718
+ if ( expectOptionalToken ( lexer , TokenKind . BRACKET_L ) ) {
713
719
type = parseTypeReference ( lexer ) ;
714
- expect ( lexer , TokenKind . BRACKET_R ) ;
720
+ expectToken ( lexer , TokenKind . BRACKET_R ) ;
715
721
type = ( {
716
722
kind : Kind . LIST_TYPE ,
717
723
type,
@@ -720,7 +726,7 @@ export function parseTypeReference(lexer: Lexer<*>): TypeNode {
720
726
} else {
721
727
type = parseNamedType ( lexer ) ;
722
728
}
723
- if ( skip ( lexer , TokenKind . BANG ) ) {
729
+ if ( expectOptionalToken ( lexer , TokenKind . BANG ) ) {
724
730
return ( {
725
731
kind : Kind . NON_NULL_TYPE ,
726
732
type,
@@ -828,7 +834,7 @@ function parseOperationTypeDefinition(
828
834
) : OperationTypeDefinitionNode {
829
835
const start = lexer . token ;
830
836
const operation = parseOperationType ( lexer ) ;
831
- expect ( lexer , TokenKind . COLON ) ;
837
+ expectToken ( lexer , TokenKind . COLON ) ;
832
838
const type = parseNamedType ( lexer ) ;
833
839
return {
834
840
kind : Kind . OPERATION_TYPE_DEFINITION ,
@@ -887,13 +893,13 @@ function parseObjectTypeDefinition(lexer: Lexer<*>): ObjectTypeDefinitionNode {
887
893
*/
888
894
function parseImplementsInterfaces ( lexer : Lexer < * > ) : Array < NamedTypeNode > {
889
895
const types = [ ] ;
890
- if ( skipKeyword ( lexer , 'implements' ) ) {
896
+ if ( expectOptionalKeyword ( lexer , 'implements' ) ) {
891
897
// Optional leading ampersand
892
- skip ( lexer , TokenKind . AMP ) ;
898
+ expectOptionalToken ( lexer , TokenKind . AMP ) ;
893
899
do {
894
900
types . push ( parseNamedType ( lexer ) ) ;
895
901
} while (
896
- skip ( lexer , TokenKind . AMP ) ||
902
+ expectOptionalToken ( lexer , TokenKind . AMP ) ||
897
903
// Legacy support for the SDL?
898
904
( lexer . options . allowLegacySDLImplementsInterfaces &&
899
905
peek ( lexer , TokenKind . NAME ) )
@@ -930,7 +936,7 @@ function parseFieldDefinition(lexer: Lexer<*>): FieldDefinitionNode {
930
936
const description = parseDescription ( lexer ) ;
931
937
const name = parseName ( lexer ) ;
932
938
const args = parseArgumentDefs ( lexer ) ;
933
- expect ( lexer , TokenKind . COLON ) ;
939
+ expectToken ( lexer , TokenKind . COLON ) ;
934
940
const type = parseTypeReference ( lexer ) ;
935
941
const directives = parseDirectives ( lexer , true ) ;
936
942
return {
@@ -962,10 +968,10 @@ function parseInputValueDef(lexer: Lexer<*>): InputValueDefinitionNode {
962
968
const start = lexer . token ;
963
969
const description = parseDescription ( lexer ) ;
964
970
const name = parseName ( lexer ) ;
965
- expect ( lexer , TokenKind . COLON ) ;
971
+ expectToken ( lexer , TokenKind . COLON ) ;
966
972
const type = parseTypeReference ( lexer ) ;
967
973
let defaultValue ;
968
- if ( skip ( lexer , TokenKind . EQUALS ) ) {
974
+ if ( expectOptionalToken ( lexer , TokenKind . EQUALS ) ) {
969
975
defaultValue = parseConstValue ( lexer ) ;
970
976
}
971
977
const directives = parseDirectives ( lexer , true ) ;
@@ -1031,12 +1037,12 @@ function parseUnionTypeDefinition(lexer: Lexer<*>): UnionTypeDefinitionNode {
1031
1037
*/
1032
1038
function parseUnionMemberTypes ( lexer : Lexer < * > ) : Array < NamedTypeNode > {
1033
1039
const types = [ ] ;
1034
- if ( skip ( lexer , TokenKind . EQUALS ) ) {
1040
+ if ( expectOptionalToken ( lexer , TokenKind . EQUALS ) ) {
1035
1041
// Optional leading pipe
1036
- skip ( lexer , TokenKind . PIPE ) ;
1042
+ expectOptionalToken ( lexer , TokenKind . PIPE ) ;
1037
1043
do {
1038
1044
types . push ( parseNamedType ( lexer ) ) ;
1039
- } while ( skip ( lexer , TokenKind . PIPE ) ) ;
1045
+ } while ( expectOptionalToken ( lexer , TokenKind . PIPE ) ) ;
1040
1046
}
1041
1047
return types ;
1042
1048
}
@@ -1358,7 +1364,7 @@ function parseDirectiveDefinition(lexer: Lexer<*>): DirectiveDefinitionNode {
1358
1364
const start = lexer . token ;
1359
1365
const description = parseDescription ( lexer ) ;
1360
1366
expectKeyword ( lexer , 'directive' ) ;
1361
- expect ( lexer , TokenKind . AT ) ;
1367
+ expectToken ( lexer , TokenKind . AT ) ;
1362
1368
const name = parseName ( lexer ) ;
1363
1369
const args = parseArgumentDefs ( lexer ) ;
1364
1370
expectKeyword ( lexer , 'on' ) ;
@@ -1380,11 +1386,11 @@ function parseDirectiveDefinition(lexer: Lexer<*>): DirectiveDefinitionNode {
1380
1386
*/
1381
1387
function parseDirectiveLocations ( lexer : Lexer < * > ) : Array < NameNode > {
1382
1388
// Optional leading pipe
1383
- skip ( lexer , TokenKind . PIPE ) ;
1389
+ expectOptionalToken ( lexer , TokenKind . PIPE ) ;
1384
1390
const locations = [ ] ;
1385
1391
do {
1386
1392
locations . push ( parseDirectiveLocation ( lexer ) ) ;
1387
- } while ( skip ( lexer , TokenKind . PIPE ) ) ;
1393
+ } while ( expectOptionalToken ( lexer , TokenKind . PIPE ) ) ;
1388
1394
return locations ;
1389
1395
}
1390
1396
@@ -1456,28 +1462,17 @@ function peek(lexer: Lexer<*>, kind: TokenKindEnum): boolean {
1456
1462
return lexer . token . kind === kind ;
1457
1463
}
1458
1464
1459
- /**
1460
- * If the next token is of the given kind, return true after advancing
1461
- * the lexer. Otherwise, do not change the parser state and return false.
1462
- */
1463
- function skip ( lexer : Lexer < * > , kind : TokenKindEnum ) : boolean {
1464
- if ( lexer . token . kind === kind ) {
1465
- lexer . advance ( ) ;
1466
- return true ;
1467
- }
1468
- return false ;
1469
- }
1470
-
1471
1465
/**
1472
1466
* If the next token is of the given kind, return that token after advancing
1473
1467
* the lexer. Otherwise, do not change the parser state and throw an error.
1474
1468
*/
1475
- function expect ( lexer : Lexer < * > , kind : TokenKindEnum ) : Token {
1469
+ function expectToken ( lexer : Lexer < * > , kind : TokenKindEnum ) : Token {
1476
1470
const token = lexer . token ;
1477
1471
if ( token . kind === kind ) {
1478
1472
lexer . advance ( ) ;
1479
1473
return token ;
1480
1474
}
1475
+
1481
1476
throw syntaxError (
1482
1477
lexer . source ,
1483
1478
token . start ,
@@ -1486,31 +1481,47 @@ function expect(lexer: Lexer<*>, kind: TokenKindEnum): Token {
1486
1481
}
1487
1482
1488
1483
/**
1489
- * If the next token is a keyword with the given value, return true after advancing
1490
- * the lexer. Otherwise, do not change the parser state and return false.
1484
+ * If the next token is of the given kind, return that token after advancing
1485
+ * the lexer. Otherwise, do not change the parser state and return undefined.
1486
+ */
1487
+ function expectOptionalToken ( lexer : Lexer < * > , kind : TokenKindEnum ) : ?Token {
1488
+ const token = lexer . token ;
1489
+ if ( token . kind === kind ) {
1490
+ lexer . advance ( ) ;
1491
+ return token ;
1492
+ }
1493
+ return undefined ;
1494
+ }
1495
+
1496
+ /**
1497
+ * If the next token is a given keyword, return that token after advancing
1498
+ * the lexer. Otherwise, do not change the parser state and throw an error.
1491
1499
*/
1492
- function skipKeyword ( lexer : Lexer < * > , value : string ) : boolean {
1500
+ function expectKeyword ( lexer : Lexer < * > , value : string ) : Token {
1493
1501
const token = lexer . token ;
1494
1502
if ( token . kind === TokenKind . NAME && token . value === value ) {
1495
1503
lexer . advance ( ) ;
1496
- return true ;
1504
+ return token ;
1497
1505
}
1498
- return false ;
1506
+
1507
+ throw syntaxError (
1508
+ lexer . source ,
1509
+ lexer . token . start ,
1510
+ `Expected "${ value } ", found ${ getTokenDesc ( lexer . token ) } ` ,
1511
+ ) ;
1499
1512
}
1500
1513
1501
1514
/**
1502
- * If the next token is a keyword with the given value, return that token after
1503
- * advancing the lexer. Otherwise, do not change the parser state and throw
1504
- * an error.
1515
+ * If the next token is a given keyword, return that token after advancing
1516
+ * the lexer. Otherwise, do not change the parser state and return undefined.
1505
1517
*/
1506
- function expectKeyword ( lexer : Lexer < * > , value : string ) : void {
1507
- if ( ! skipKeyword ( lexer , value ) ) {
1508
- throw syntaxError (
1509
- lexer . source ,
1510
- lexer . token . start ,
1511
- `Expected "${ value } ", found ${ getTokenDesc ( lexer . token ) } ` ,
1512
- ) ;
1518
+ function expectOptionalKeyword ( lexer : Lexer < * > , value : string ) : ?Token {
1519
+ const token = lexer . token ;
1520
+ if ( token . kind === TokenKind . NAME && token . value === value ) {
1521
+ lexer . advance ( ) ;
1522
+ return token ;
1513
1523
}
1524
+ return undefined ;
1514
1525
}
1515
1526
1516
1527
/**
@@ -1538,9 +1549,9 @@ function any<T>(
1538
1549
parseFn: (lexer: Lexer< * > ) => T ,
1539
1550
closeKind : TokenKindEnum ,
1540
1551
) : Array < T > {
1541
- expect ( lexer , openKind ) ;
1552
+ expectToken ( lexer , openKind ) ;
1542
1553
const nodes = [ ] ;
1543
- while ( ! skip ( lexer , closeKind ) ) {
1554
+ while ( ! expectOptionalToken ( lexer , closeKind ) ) {
1544
1555
nodes . push ( parseFn ( lexer ) ) ;
1545
1556
}
1546
1557
return nodes ;
@@ -1558,9 +1569,9 @@ function many<T>(
1558
1569
parseFn: (lexer: Lexer< * > ) => T ,
1559
1570
closeKind : TokenKindEnum ,
1560
1571
) : Array < T > {
1561
- expect ( lexer , openKind ) ;
1572
+ expectToken ( lexer , openKind ) ;
1562
1573
const nodes = [ parseFn ( lexer ) ] ;
1563
- while ( ! skip ( lexer , closeKind ) ) {
1574
+ while ( ! expectOptionalToken ( lexer , closeKind ) ) {
1564
1575
nodes . push ( parseFn ( lexer ) ) ;
1565
1576
}
1566
1577
return nodes ;
0 commit comments