@@ -780,32 +780,15 @@ func parseObjectTypeDefinition(lexer: Lexer) throws -> ObjectTypeDefinition {
780
780
let name = try parseName ( lexer: lexer)
781
781
let interfaces = try parseImplementsInterfaces ( lexer: lexer)
782
782
let directives = try parseDirectives ( lexer: lexer)
783
-
784
- do {
785
- let fields = try any (
786
- lexer: lexer,
787
- openKind: . openingBrace,
788
- closeKind: . closingBrace,
789
- parse: parseFieldDefinition
790
- )
791
- return ObjectTypeDefinition (
792
- loc: loc ( lexer: lexer, startToken: start) ,
793
- description: description,
794
- name: name,
795
- interfaces: interfaces,
796
- directives: directives,
797
- fields: fields
798
- )
799
- } catch {
800
- return ObjectTypeDefinition (
801
- loc: loc ( lexer: lexer, startToken: start) ,
802
- description: description,
803
- name: name,
804
- interfaces: interfaces,
805
- directives: directives,
806
- fields: [ ]
807
- )
808
- }
783
+ let fields = try optionalMany ( lexer: lexer, openKind: . openingBrace, closeKind: . closingBrace, parse: parseFieldDefinition)
784
+ return ObjectTypeDefinition (
785
+ loc: loc ( lexer: lexer, startToken: start) ,
786
+ description: description,
787
+ name: name,
788
+ interfaces: interfaces,
789
+ directives: directives,
790
+ fields: fields
791
+ )
809
792
}
810
793
811
794
/**
@@ -814,19 +797,9 @@ func parseObjectTypeDefinition(lexer: Lexer) throws -> ObjectTypeDefinition {
814
797
* - ImplementsInterfaces & NamedType
815
798
*/
816
799
func parseImplementsInterfaces( lexer: Lexer ) throws -> [ NamedType ] {
817
- var types : [ NamedType ] = [ ]
818
-
819
- if lexer. token. value == " implements " {
820
- try lexer. advance ( )
821
-
822
- try expectOptional ( lexer: lexer, kind: . amp)
823
- repeat {
824
- types. append ( try parseNamedType ( lexer: lexer) )
825
- } while try expectOptional ( lexer: lexer, kind: . amp) != nil ||
826
- peek ( lexer: lexer, kind: . name)
827
- }
828
-
829
- return types
800
+ try expectOptionalKeyword ( lexer: lexer, value: " implements " )
801
+ ? delimitedMany ( lexer: lexer, kind: . amp, parseFn: parseNamedType)
802
+ : [ ]
830
803
}
831
804
832
805
/**
@@ -904,32 +877,15 @@ func parseInterfaceTypeDefinition(lexer: Lexer) throws -> InterfaceTypeDefinitio
904
877
let name = try parseName ( lexer: lexer)
905
878
let interfaces = try parseImplementsInterfaces ( lexer: lexer)
906
879
let directives = try parseDirectives ( lexer: lexer)
907
-
908
- do {
909
- let fields = try any (
910
- lexer: lexer,
911
- openKind: . openingBrace,
912
- closeKind: . closingBrace,
913
- parse: parseFieldDefinition
914
- )
915
- return InterfaceTypeDefinition (
916
- loc: loc ( lexer: lexer, startToken: start) ,
917
- description: description,
918
- name: name,
919
- interfaces: interfaces,
920
- directives: directives,
921
- fields: fields
922
- )
923
- } catch {
924
- return InterfaceTypeDefinition (
925
- loc: loc ( lexer: lexer, startToken: start) ,
926
- description: description,
927
- name: name,
928
- interfaces: interfaces,
929
- directives: directives,
930
- fields: [ ]
931
- )
932
- }
880
+ let fields = try optionalMany ( lexer: lexer, openKind: . openingBrace, closeKind: . closingBrace, parse: parseFieldDefinition)
881
+ return InterfaceTypeDefinition (
882
+ loc: loc ( lexer: lexer, startToken: start) ,
883
+ description: description,
884
+ name: name,
885
+ interfaces: interfaces,
886
+ directives: directives,
887
+ fields: fields
888
+ )
933
889
}
934
890
935
891
/**
@@ -943,43 +899,24 @@ func parseUnionTypeDefinition(lexer: Lexer) throws -> UnionTypeDefinition {
943
899
try expectKeyword ( lexer: lexer, value: " union " )
944
900
let name = try parseName ( lexer: lexer)
945
901
let directives = try parseDirectives ( lexer: lexer)
946
-
947
- do {
948
- try expect ( lexer: lexer, kind: . equals)
949
- let types = try parseUnionMembers ( lexer: lexer)
950
- return UnionTypeDefinition (
951
- loc: loc ( lexer: lexer, startToken: start) ,
952
- description: description,
953
- name: name,
954
- directives: directives,
955
- types: types
956
- )
957
- } catch {
958
- return UnionTypeDefinition (
959
- loc: loc ( lexer: lexer, startToken: start) ,
960
- description: description,
961
- name: name,
962
- directives: directives,
963
- types: [ ]
964
- )
965
- }
902
+ return UnionTypeDefinition (
903
+ loc: loc ( lexer: lexer, startToken: start) ,
904
+ description: description,
905
+ name: name,
906
+ directives: directives,
907
+ types: try parseUnionMembers ( lexer: lexer)
908
+ )
966
909
}
967
910
968
911
/**
969
912
* UnionMembers :
970
- * - NamedType
971
- * - UnionMembers | NamedType
972
- * - | UnionMembers | NamedType
913
+ * - = |? NamedType
914
+ * - UnionMemberTypes | NamedType
973
915
*/
974
916
func parseUnionMembers( lexer: Lexer ) throws -> [ NamedType ] {
975
- var members : [ NamedType ] = [ ]
976
-
977
- try expectOptional ( lexer: lexer, kind: . pipe)
978
- repeat {
979
- members. append ( try parseNamedType ( lexer: lexer) )
980
- } while try skip ( lexer: lexer, kind: . pipe)
981
-
982
- return members
917
+ try expectOptional ( lexer: lexer, kind: . equals) != nil
918
+ ? delimitedMany ( lexer: lexer, kind: . pipe, parseFn: parseNamedType)
919
+ : [ ]
983
920
}
984
921
985
922
/**
@@ -993,30 +930,14 @@ func parseEnumTypeDefinition(lexer: Lexer) throws -> EnumTypeDefinition {
993
930
try expectKeyword ( lexer: lexer, value: " enum " )
994
931
let name = try parseName ( lexer: lexer)
995
932
let directives = try parseDirectives ( lexer: lexer)
996
-
997
- do {
998
- let values = try many (
999
- lexer: lexer,
1000
- openKind: . openingBrace,
1001
- closeKind: . closingBrace,
1002
- parse: parseEnumValueDefinition
1003
- )
1004
- return EnumTypeDefinition (
1005
- loc: loc ( lexer: lexer, startToken: start) ,
1006
- description: description,
1007
- name: name,
1008
- directives: directives,
1009
- values: values
1010
- )
1011
- } catch {
1012
- return EnumTypeDefinition (
1013
- loc: loc ( lexer: lexer, startToken: start) ,
1014
- description: description,
1015
- name: name,
1016
- directives: directives,
1017
- values: [ ]
1018
- )
1019
- }
933
+ let values = try optionalMany ( lexer: lexer, openKind: . openingBrace, closeKind: . closingBrace, parse: parseEnumValueDefinition)
934
+ return EnumTypeDefinition (
935
+ loc: loc ( lexer: lexer, startToken: start) ,
936
+ description: description,
937
+ name: name,
938
+ directives: directives,
939
+ values: values
940
+ )
1020
941
}
1021
942
1022
943
/**
@@ -1048,30 +969,14 @@ func parseInputObjectTypeDefinition(lexer: Lexer) throws -> InputObjectTypeDefin
1048
969
try expectKeyword ( lexer: lexer, value: " input " )
1049
970
let name = try parseName ( lexer: lexer)
1050
971
let directives = try parseDirectives ( lexer: lexer)
1051
-
1052
- do {
1053
- let fields = try any (
1054
- lexer: lexer,
1055
- openKind: . openingBrace,
1056
- closeKind: . closingBrace,
1057
- parse: parseInputValueDef
1058
- )
1059
- return InputObjectTypeDefinition (
1060
- loc: loc ( lexer: lexer, startToken: start) ,
1061
- description: description,
1062
- name: name,
1063
- directives: directives,
1064
- fields: fields
1065
- )
1066
- } catch {
1067
- return InputObjectTypeDefinition (
1068
- loc: loc ( lexer: lexer, startToken: start) ,
1069
- description: description,
1070
- name: name,
1071
- directives: directives,
1072
- fields: [ ]
1073
- )
1074
- }
972
+ let fields = try optionalMany ( lexer: lexer, openKind: . openingBrace, closeKind: . closingBrace, parse: parseInputValueDef)
973
+ return InputObjectTypeDefinition (
974
+ loc: loc ( lexer: lexer, startToken: start) ,
975
+ description: description,
976
+ name: name,
977
+ directives: directives,
978
+ fields: fields
979
+ )
1075
980
}
1076
981
1077
982
func parseExtensionDefinition( lexer: Lexer ) throws -> TypeSystemDefinition {
@@ -1202,47 +1107,27 @@ func parseDirectiveDefinition(lexer: Lexer) throws -> DirectiveDefinition {
1202
1107
try expect ( lexer: lexer, kind: . at)
1203
1108
let name = try parseName ( lexer: lexer)
1204
1109
let args = try parseArgumentDefs ( lexer: lexer)
1205
-
1206
- do {
1207
- try expectKeyword ( lexer: lexer, value: " repeatable " )
1208
- try expectKeyword ( lexer: lexer, value: " on " )
1209
- try expectOptional ( lexer: lexer, kind: . pipe)
1210
- let locations = try parseDirectiveLocations ( lexer: lexer)
1211
- return DirectiveDefinition (
1212
- loc: loc ( lexer: lexer, startToken: start) ,
1213
- description: description,
1214
- name: name,
1215
- arguments: args,
1216
- locations: locations,
1217
- repeatable: true
1218
- )
1219
- } catch {
1220
- try expectKeyword ( lexer: lexer, value: " on " )
1221
- try expectOptional ( lexer: lexer, kind: . pipe)
1222
- let locations = try parseDirectiveLocations ( lexer: lexer)
1223
- return DirectiveDefinition (
1224
- loc: loc ( lexer: lexer, startToken: start) ,
1225
- description: description,
1226
- name: name,
1227
- arguments: args,
1228
- locations: locations
1229
- )
1230
- }
1110
+ let repeatable = try expectOptionalKeyword ( lexer: lexer, value: " repeatable " )
1111
+ try expectKeyword ( lexer: lexer, value: " on " )
1112
+ try expectOptional ( lexer: lexer, kind: . pipe)
1113
+ let locations = try parseDirectiveLocations ( lexer: lexer)
1114
+ return DirectiveDefinition (
1115
+ loc: loc ( lexer: lexer, startToken: start) ,
1116
+ description: description,
1117
+ name: name,
1118
+ arguments: args,
1119
+ locations: locations,
1120
+ repeatable: repeatable
1121
+ )
1231
1122
}
1232
1123
1233
1124
/**
1234
1125
* DirectiveLocations :
1235
- * - Name
1236
- * - DirectiveLocations | Name
1126
+ * - |? DirectiveLocation
1127
+ * - DirectiveLocations | DirectiveLocation
1237
1128
*/
1238
1129
func parseDirectiveLocations( lexer: Lexer ) throws -> [ Name ] {
1239
- var locations : [ Name ] = [ ]
1240
-
1241
- repeat {
1242
- locations. append ( try parseName ( lexer: lexer) )
1243
- } while try skip ( lexer: lexer, kind: . pipe)
1244
-
1245
- return locations
1130
+ try delimitedMany ( lexer: lexer, kind: . pipe, parseFn: parseName)
1246
1131
}
1247
1132
1248
1133
// Core parsing utility funcs
0 commit comments