Skip to content

Commit 3f0be1d

Browse files
fix: Parser errors on empty extends
1 parent 2ac84b2 commit 3f0be1d

File tree

1 file changed

+115
-17
lines changed

1 file changed

+115
-17
lines changed

Sources/GraphQL/Language/Parser.swift

Lines changed: 115 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1025,10 +1025,31 @@ func parseExtensionDefinition(lexer: Lexer) throws -> TypeSystemDefinition {
10251025
func parseTypeExtensionDefinition(lexer: Lexer) throws -> TypeExtensionDefinition {
10261026
let start = lexer.token
10271027
try expectKeyword(lexer: lexer, value: "extend")
1028-
let definition = try parseObjectTypeDefinition(lexer: lexer)
1028+
try expectKeyword(lexer: lexer, value: "type")
1029+
let name = try parseName(lexer: lexer)
1030+
let interfaces = try parseImplementsInterfaces(lexer: lexer)
1031+
let directives = try parseDirectives(lexer: lexer)
1032+
let fields = try optionalMany(
1033+
lexer: lexer,
1034+
openKind: .openingBrace,
1035+
closeKind: .closingBrace,
1036+
parse: parseFieldDefinition
1037+
)
1038+
if
1039+
interfaces.isEmpty,
1040+
directives.isEmpty,
1041+
fields.isEmpty
1042+
{
1043+
throw unexpected(lexer: lexer)
1044+
}
10291045
return TypeExtensionDefinition(
10301046
loc: loc(lexer: lexer, startToken: start),
1031-
definition: definition
1047+
definition: ObjectTypeDefinition(
1048+
name: name,
1049+
interfaces: interfaces,
1050+
directives: directives,
1051+
fields: fields
1052+
)
10321053
)
10331054
}
10341055

@@ -1047,11 +1068,7 @@ func parseSchemaExtensionDefinition(lexer: Lexer) throws -> SchemaExtensionDefin
10471068
parse: parseOperationTypeDefinition
10481069
)
10491070
if directives.isEmpty, operationTypes.isEmpty {
1050-
throw syntaxError(
1051-
source: lexer.source,
1052-
position: lexer.token.start,
1053-
description: "expected schema extend to have directive or operation"
1054-
)
1071+
throw unexpected(lexer: lexer)
10551072
}
10561073
return SchemaExtensionDefinition(
10571074
loc: loc(lexer: lexer, startToken: start),
@@ -1070,10 +1087,31 @@ func parseSchemaExtensionDefinition(lexer: Lexer) throws -> SchemaExtensionDefin
10701087
func parseInterfaceExtensionDefinition(lexer: Lexer) throws -> InterfaceExtensionDefinition {
10711088
let start = lexer.token
10721089
try expectKeyword(lexer: lexer, value: "extend")
1073-
let interfaceDefinition = try parseInterfaceTypeDefinition(lexer: lexer)
1090+
try expectKeyword(lexer: lexer, value: "interface")
1091+
let name = try parseName(lexer: lexer)
1092+
let interfaces = try parseImplementsInterfaces(lexer: lexer)
1093+
let directives = try parseDirectives(lexer: lexer)
1094+
let fields = try optionalMany(
1095+
lexer: lexer,
1096+
openKind: .openingBrace,
1097+
closeKind: .closingBrace,
1098+
parse: parseFieldDefinition
1099+
)
1100+
if
1101+
interfaces.isEmpty,
1102+
directives.isEmpty,
1103+
fields.isEmpty
1104+
{
1105+
throw unexpected(lexer: lexer)
1106+
}
10741107
return InterfaceExtensionDefinition(
10751108
loc: loc(lexer: lexer, startToken: start),
1076-
definition: interfaceDefinition
1109+
definition: InterfaceTypeDefinition(
1110+
name: name,
1111+
interfaces: interfaces,
1112+
directives: directives,
1113+
fields: fields
1114+
)
10771115
)
10781116
}
10791117

@@ -1083,10 +1121,18 @@ func parseInterfaceExtensionDefinition(lexer: Lexer) throws -> InterfaceExtensio
10831121
func parseScalarExtensionDefinition(lexer: Lexer) throws -> ScalarExtensionDefinition {
10841122
let start = lexer.token
10851123
try expectKeyword(lexer: lexer, value: "extend")
1086-
let scalarDefinition = try parseScalarTypeDefinition(lexer: lexer)
1124+
try expectKeyword(lexer: lexer, value: "scalar")
1125+
let name = try parseName(lexer: lexer)
1126+
let directives = try parseDirectives(lexer: lexer)
1127+
if (directives.isEmpty) {
1128+
throw unexpected(lexer: lexer)
1129+
}
10871130
return ScalarExtensionDefinition(
10881131
loc: loc(lexer: lexer, startToken: start),
1089-
definition: scalarDefinition
1132+
definition: ScalarTypeDefinition(
1133+
name: name,
1134+
directives: directives
1135+
)
10901136
)
10911137
}
10921138

@@ -1096,10 +1142,24 @@ func parseScalarExtensionDefinition(lexer: Lexer) throws -> ScalarExtensionDefin
10961142
func parseUnionExtensionDefinition(lexer: Lexer) throws -> UnionExtensionDefinition {
10971143
let start = lexer.token
10981144
try expectKeyword(lexer: lexer, value: "extend")
1099-
let definition = try parseUnionTypeDefinition(lexer: lexer)
1145+
try expectKeyword(lexer: lexer, value: "union")
1146+
let name = try parseName(lexer: lexer)
1147+
let directives = try parseDirectives(lexer: lexer)
1148+
let types = try parseUnionMembers(lexer: lexer)
1149+
if
1150+
directives.isEmpty,
1151+
types.isEmpty
1152+
{
1153+
throw unexpected(lexer: lexer)
1154+
}
11001155
return UnionExtensionDefinition(
11011156
loc: loc(lexer: lexer, startToken: start),
1102-
definition: definition
1157+
definition: UnionTypeDefinition(
1158+
loc: loc(lexer: lexer, startToken: start),
1159+
name: name,
1160+
directives: directives,
1161+
types: types
1162+
)
11031163
)
11041164
}
11051165

@@ -1109,10 +1169,29 @@ func parseUnionExtensionDefinition(lexer: Lexer) throws -> UnionExtensionDefinit
11091169
func parseEnumExtensionDefinition(lexer: Lexer) throws -> EnumExtensionDefinition {
11101170
let start = lexer.token
11111171
try expectKeyword(lexer: lexer, value: "extend")
1112-
let definition = try parseEnumTypeDefinition(lexer: lexer)
1172+
try expectKeyword(lexer: lexer, value: "enum")
1173+
let name = try parseName(lexer: lexer)
1174+
let directives = try parseDirectives(lexer: lexer)
1175+
let values = try optionalMany(
1176+
lexer: lexer,
1177+
openKind: .openingBrace,
1178+
closeKind: .closingBrace,
1179+
parse: parseEnumValueDefinition
1180+
)
1181+
if
1182+
directives.isEmpty,
1183+
values.isEmpty
1184+
{
1185+
throw unexpected(lexer: lexer)
1186+
}
11131187
return EnumExtensionDefinition(
11141188
loc: loc(lexer: lexer, startToken: start),
1115-
definition: definition
1189+
definition: EnumTypeDefinition(
1190+
loc: loc(lexer: lexer, startToken: start),
1191+
name: name,
1192+
directives: directives,
1193+
values: values
1194+
)
11161195
)
11171196
}
11181197

@@ -1122,10 +1201,29 @@ func parseEnumExtensionDefinition(lexer: Lexer) throws -> EnumExtensionDefinitio
11221201
func parseInputObjectExtensionDefinition(lexer: Lexer) throws -> InputObjectExtensionDefinition {
11231202
let start = lexer.token
11241203
try expectKeyword(lexer: lexer, value: "extend")
1125-
let definition = try parseInputObjectTypeDefinition(lexer: lexer)
1204+
try expectKeyword(lexer: lexer, value: "input")
1205+
let name = try parseName(lexer: lexer)
1206+
let directives = try parseDirectives(lexer: lexer)
1207+
let fields = try optionalMany(
1208+
lexer: lexer,
1209+
openKind: .openingBrace,
1210+
closeKind: .closingBrace,
1211+
parse: parseInputValueDef
1212+
)
1213+
if
1214+
directives.isEmpty,
1215+
fields.isEmpty
1216+
{
1217+
throw unexpected(lexer: lexer)
1218+
}
11261219
return InputObjectExtensionDefinition(
11271220
loc: loc(lexer: lexer, startToken: start),
1128-
definition: definition
1221+
definition: InputObjectTypeDefinition(
1222+
loc: loc(lexer: lexer, startToken: start),
1223+
name: name,
1224+
directives: directives,
1225+
fields: fields
1226+
)
11291227
)
11301228
}
11311229

0 commit comments

Comments
 (0)