Skip to content

Commit 142d7dd

Browse files
committed
support undefined types
1 parent b4d5a44 commit 142d7dd

File tree

1 file changed

+133
-67
lines changed

1 file changed

+133
-67
lines changed

Sources/GraphQL/Language/Parser.swift

Lines changed: 133 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -771,6 +771,7 @@ func parseScalarTypeDefinition(lexer: Lexer) throws -> ScalarTypeDefinition {
771771
/**
772772
* ObjectTypeDefinition :
773773
* - type Name ImplementsInterfaces? Directives? { FieldDefinition+ }
774+
* - type Name ImplementsInterfaces? Directives?
774775
*/
775776
func parseObjectTypeDefinition(lexer: Lexer) throws -> ObjectTypeDefinition {
776777
let start = lexer.token
@@ -779,20 +780,32 @@ func parseObjectTypeDefinition(lexer: Lexer) throws -> ObjectTypeDefinition {
779780
let name = try parseName(lexer: lexer)
780781
let interfaces = try parseImplementsInterfaces(lexer: lexer)
781782
let directives = try parseDirectives(lexer: lexer)
782-
let fields = try any(
783-
lexer: lexer,
784-
openKind: .openingBrace,
785-
closeKind: .closingBrace,
786-
parse: parseFieldDefinition
787-
)
788-
return ObjectTypeDefinition(
789-
loc: loc(lexer: lexer, startToken: start),
790-
description: description,
791-
name: name,
792-
interfaces: interfaces,
793-
directives: directives,
794-
fields: fields
795-
)
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+
}
796809
}
797810

798811
/**
@@ -879,7 +892,9 @@ func parseInputValueDef(lexer: Lexer) throws -> InputValueDefinition {
879892
}
880893

881894
/**
882-
* InterfaceTypeDefinition : interface Name Directives? { FieldDefinition+ }
895+
* InterfaceTypeDefinition :
896+
* - interface Name Directives? { FieldDefinition+ }
897+
* - interface Name Directives?
883898
*/
884899
func parseInterfaceTypeDefinition(lexer: Lexer) throws -> InterfaceTypeDefinition {
885900
let start = lexer.token
@@ -888,40 +903,65 @@ func parseInterfaceTypeDefinition(lexer: Lexer) throws -> InterfaceTypeDefinitio
888903
let name = try parseName(lexer: lexer)
889904
let interfaces = try parseImplementsInterfaces(lexer: lexer)
890905
let directives = try parseDirectives(lexer: lexer)
891-
let fields = try any(
892-
lexer: lexer,
893-
openKind: .openingBrace,
894-
closeKind: .closingBrace,
895-
parse: parseFieldDefinition
896-
)
897-
return InterfaceTypeDefinition(
898-
loc: loc(lexer: lexer, startToken: start),
899-
description: description,
900-
name: name,
901-
interfaces: interfaces,
902-
directives: directives,
903-
fields: fields
904-
)
906+
907+
do {
908+
let fields = try any(
909+
lexer: lexer,
910+
openKind: .openingBrace,
911+
closeKind: .closingBrace,
912+
parse: parseFieldDefinition
913+
)
914+
return InterfaceTypeDefinition(
915+
loc: loc(lexer: lexer, startToken: start),
916+
description: description,
917+
name: name,
918+
interfaces: interfaces,
919+
directives: directives,
920+
fields: fields
921+
)
922+
} catch {
923+
return InterfaceTypeDefinition(
924+
loc: loc(lexer: lexer, startToken: start),
925+
description: description,
926+
name: name,
927+
interfaces: interfaces,
928+
directives: directives,
929+
fields: []
930+
)
931+
}
905932
}
906933

907934
/**
908-
* UnionTypeDefinition : union Name Directives? = UnionMembers
935+
* UnionTypeDefinition :
936+
* - union Name Directives? = UnionMembers
937+
* - union Name Directives?
909938
*/
910939
func parseUnionTypeDefinition(lexer: Lexer) throws -> UnionTypeDefinition {
911940
let start = lexer.token
912941
let description = try parseDescription(lexer: lexer)
913942
try expectKeyword(lexer: lexer, value: "union")
914943
let name = try parseName(lexer: lexer)
915944
let directives = try parseDirectives(lexer: lexer)
916-
try expect(lexer: lexer, kind: .equals)
917-
let types = try parseUnionMembers(lexer: lexer)
918-
return UnionTypeDefinition(
919-
loc: loc(lexer: lexer, startToken: start),
920-
description: description,
921-
name: name,
922-
directives: directives,
923-
types: types
924-
)
945+
946+
do {
947+
try expect(lexer: lexer, kind: .equals)
948+
let types = try parseUnionMembers(lexer: lexer)
949+
return UnionTypeDefinition(
950+
loc: loc(lexer: lexer, startToken: start),
951+
description: description,
952+
name: name,
953+
directives: directives,
954+
types: types
955+
)
956+
} catch {
957+
return UnionTypeDefinition(
958+
loc: loc(lexer: lexer, startToken: start),
959+
description: description,
960+
name: name,
961+
directives: directives,
962+
types: []
963+
)
964+
}
925965
}
926966

927967
/**
@@ -940,27 +980,40 @@ func parseUnionMembers(lexer: Lexer) throws -> [NamedType] {
940980
}
941981

942982
/**
943-
* EnumTypeDefinition : enum Name Directives? { EnumValueDefinition+ }
983+
* EnumTypeDefinition :
984+
* - enum Name Directives? { EnumValueDefinition+ }
985+
* - enum Name Directives?
944986
*/
945987
func parseEnumTypeDefinition(lexer: Lexer) throws -> EnumTypeDefinition {
946988
let start = lexer.token
947989
let description = try parseDescription(lexer: lexer)
948990
try expectKeyword(lexer: lexer, value: "enum")
949991
let name = try parseName(lexer: lexer)
950992
let directives = try parseDirectives(lexer: lexer)
951-
let values = try many(
952-
lexer: lexer,
953-
openKind: .openingBrace,
954-
closeKind: .closingBrace,
955-
parse: parseEnumValueDefinition
956-
)
957-
return EnumTypeDefinition(
958-
loc: loc(lexer: lexer, startToken: start),
959-
description: description,
960-
name: name,
961-
directives: directives,
962-
values: values
963-
)
993+
994+
do {
995+
let values = try many(
996+
lexer: lexer,
997+
openKind: .openingBrace,
998+
closeKind: .closingBrace,
999+
parse: parseEnumValueDefinition
1000+
)
1001+
return EnumTypeDefinition(
1002+
loc: loc(lexer: lexer, startToken: start),
1003+
description: description,
1004+
name: name,
1005+
directives: directives,
1006+
values: values
1007+
)
1008+
} catch {
1009+
return EnumTypeDefinition(
1010+
loc: loc(lexer: lexer, startToken: start),
1011+
description: description,
1012+
name: name,
1013+
directives: directives,
1014+
values: []
1015+
)
1016+
}
9641017
}
9651018

9661019
/**
@@ -982,27 +1035,40 @@ func parseEnumValueDefinition(lexer: Lexer) throws -> EnumValueDefinition {
9821035
}
9831036

9841037
/**
985-
* InputObjectTypeDefinition : input Name Directives? { InputValueDefinition+ }
1038+
* InputObjectTypeDefinition :
1039+
* - input Name Directives? { InputValueDefinition+ }
1040+
* - input Name Directives?
9861041
*/
9871042
func parseInputObjectTypeDefinition(lexer: Lexer) throws -> InputObjectTypeDefinition {
9881043
let start = lexer.token
9891044
let description = try parseDescription(lexer: lexer)
9901045
try expectKeyword(lexer: lexer, value: "input")
9911046
let name = try parseName(lexer: lexer)
9921047
let directives = try parseDirectives(lexer: lexer)
993-
let fields = try any(
994-
lexer: lexer,
995-
openKind: .openingBrace,
996-
closeKind: .closingBrace,
997-
parse: parseInputValueDef
998-
)
999-
return InputObjectTypeDefinition(
1000-
loc: loc(lexer: lexer, startToken: start),
1001-
description: description,
1002-
name: name,
1003-
directives: directives,
1004-
fields: fields
1005-
)
1048+
1049+
do {
1050+
let fields = try any(
1051+
lexer: lexer,
1052+
openKind: .openingBrace,
1053+
closeKind: .closingBrace,
1054+
parse: parseInputValueDef
1055+
)
1056+
return InputObjectTypeDefinition(
1057+
loc: loc(lexer: lexer, startToken: start),
1058+
description: description,
1059+
name: name,
1060+
directives: directives,
1061+
fields: fields
1062+
)
1063+
} catch {
1064+
return InputObjectTypeDefinition(
1065+
loc: loc(lexer: lexer, startToken: start),
1066+
description: description,
1067+
name: name,
1068+
directives: directives,
1069+
fields: []
1070+
)
1071+
}
10061072
}
10071073

10081074
func parseExtensionDefinition(lexer: Lexer) throws -> TypeSystemDefinition {

0 commit comments

Comments
 (0)