@@ -780,32 +780,15 @@ func parseObjectTypeDefinition(lexer: Lexer) throws -> ObjectTypeDefinition {
780780 let name = try parseName ( lexer: lexer)
781781 let interfaces = try parseImplementsInterfaces ( lexer: lexer)
782782 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+ )
809792}
810793
811794/**
@@ -814,19 +797,9 @@ func parseObjectTypeDefinition(lexer: Lexer) throws -> ObjectTypeDefinition {
814797 * - ImplementsInterfaces & NamedType
815798 */
816799func 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+ : [ ]
830803}
831804
832805/**
@@ -904,32 +877,15 @@ func parseInterfaceTypeDefinition(lexer: Lexer) throws -> InterfaceTypeDefinitio
904877 let name = try parseName ( lexer: lexer)
905878 let interfaces = try parseImplementsInterfaces ( lexer: lexer)
906879 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+ )
933889}
934890
935891/**
@@ -943,43 +899,24 @@ func parseUnionTypeDefinition(lexer: Lexer) throws -> UnionTypeDefinition {
943899 try expectKeyword ( lexer: lexer, value: " union " )
944900 let name = try parseName ( lexer: lexer)
945901 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+ )
966909}
967910
968911/**
969912 * UnionMembers :
970- * - NamedType
971- * - UnionMembers | NamedType
972- * - | UnionMembers | NamedType
913+ * - = |? NamedType
914+ * - UnionMemberTypes | NamedType
973915 */
974916func 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+ : [ ]
983920}
984921
985922/**
@@ -993,30 +930,14 @@ func parseEnumTypeDefinition(lexer: Lexer) throws -> EnumTypeDefinition {
993930 try expectKeyword ( lexer: lexer, value: " enum " )
994931 let name = try parseName ( lexer: lexer)
995932 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+ )
1020941}
1021942
1022943/**
@@ -1048,30 +969,14 @@ func parseInputObjectTypeDefinition(lexer: Lexer) throws -> InputObjectTypeDefin
1048969 try expectKeyword ( lexer: lexer, value: " input " )
1049970 let name = try parseName ( lexer: lexer)
1050971 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+ )
1075980}
1076981
1077982func parseExtensionDefinition( lexer: Lexer ) throws -> TypeSystemDefinition {
@@ -1202,47 +1107,27 @@ func parseDirectiveDefinition(lexer: Lexer) throws -> DirectiveDefinition {
12021107 try expect ( lexer: lexer, kind: . at)
12031108 let name = try parseName ( lexer: lexer)
12041109 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+ )
12311122}
12321123
12331124/**
12341125 * DirectiveLocations :
1235- * - Name
1236- * - DirectiveLocations | Name
1126+ * - |? DirectiveLocation
1127+ * - DirectiveLocations | DirectiveLocation
12371128 */
12381129func 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)
12461131}
12471132
12481133// Core parsing utility funcs
0 commit comments