Skip to content

Commit 0ea4917

Browse files
committed
update parser to be closer to graphql-js
1 parent 4421aa5 commit 0ea4917

File tree

1 file changed

+64
-179
lines changed

1 file changed

+64
-179
lines changed

Sources/GraphQL/Language/Parser.swift

Lines changed: 64 additions & 179 deletions
Original file line numberDiff line numberDiff line change
@@ -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
*/
816799
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+
: []
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
*/
974916
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+
: []
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

1077982
func 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
*/
12381129
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)
12461131
}
12471132

12481133
// Core parsing utility funcs

0 commit comments

Comments
 (0)