Skip to content

Commit b4d5a44

Browse files
committed
add more extension definitions
1 parent 13d1f73 commit b4d5a44

File tree

3 files changed

+186
-1
lines changed

3 files changed

+186
-1
lines changed

Sources/GraphQL/Language/AST.swift

Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1103,6 +1103,11 @@ extension SchemaDefinition: TypeSystemDefinition {}
11031103
extension TypeExtensionDefinition: TypeSystemDefinition {}
11041104
extension SchemaExtensionDefinition: TypeSystemDefinition {}
11051105
extension DirectiveDefinition: TypeSystemDefinition {}
1106+
extension InterfaceExtensionDefinition: TypeSystemDefinition {}
1107+
extension ScalarExtensionDefinition: TypeSystemDefinition {}
1108+
extension UnionExtensionDefinition: TypeSystemDefinition {}
1109+
extension EnumExtensionDefinition: TypeSystemDefinition {}
1110+
extension InputObjectExtensionDefinition: TypeSystemDefinition {}
11061111

11071112
public func == (lhs: TypeSystemDefinition, rhs: TypeSystemDefinition) -> Bool {
11081113
switch lhs {
@@ -1126,6 +1131,26 @@ public func == (lhs: TypeSystemDefinition, rhs: TypeSystemDefinition) -> Bool {
11261131
if let r = rhs as? SchemaExtensionDefinition {
11271132
return l == r
11281133
}
1134+
case let l as InterfaceExtensionDefinition:
1135+
if let r = rhs as? InterfaceExtensionDefinition {
1136+
return l == r
1137+
}
1138+
case let l as ScalarExtensionDefinition:
1139+
if let r = rhs as? ScalarExtensionDefinition {
1140+
return l == r
1141+
}
1142+
case let l as UnionExtensionDefinition:
1143+
if let r = rhs as? UnionExtensionDefinition {
1144+
return l == r
1145+
}
1146+
case let l as EnumExtensionDefinition:
1147+
if let r = rhs as? EnumExtensionDefinition {
1148+
return l == r
1149+
}
1150+
case let l as InputObjectExtensionDefinition:
1151+
if let r = rhs as? InputObjectExtensionDefinition {
1152+
return l == r
1153+
}
11291154
default:
11301155
return false
11311156
}
@@ -1567,6 +1592,91 @@ extension SchemaExtensionDefinition: Equatable {
15671592
}
15681593
}
15691594

1595+
public final class InterfaceExtensionDefinition {
1596+
public let kind: Kind = .interfaceExtensionDefinition
1597+
public let loc: Location?
1598+
public let definition: InterfaceTypeDefinition
1599+
1600+
init(loc: Location? = nil, definition: InterfaceTypeDefinition) {
1601+
self.loc = loc
1602+
self.definition = definition
1603+
}
1604+
}
1605+
1606+
extension InterfaceExtensionDefinition: Equatable {
1607+
public static func == (lhs: InterfaceExtensionDefinition, rhs: InterfaceExtensionDefinition) -> Bool {
1608+
return lhs.definition == rhs.definition
1609+
}
1610+
}
1611+
1612+
public final class ScalarExtensionDefinition {
1613+
public let kind: Kind = .scalarExtensionDefinition
1614+
public let loc: Location?
1615+
public let definition: ScalarTypeDefinition
1616+
1617+
init(loc: Location? = nil, definition: ScalarTypeDefinition) {
1618+
self.loc = loc
1619+
self.definition = definition
1620+
}
1621+
}
1622+
1623+
extension ScalarExtensionDefinition: Equatable {
1624+
public static func == (lhs: ScalarExtensionDefinition, rhs: ScalarExtensionDefinition) -> Bool {
1625+
return lhs.definition == rhs.definition
1626+
}
1627+
}
1628+
1629+
public final class UnionExtensionDefinition {
1630+
public let kind: Kind = .unionExtensionDefinition
1631+
public let loc: Location?
1632+
public let definition: UnionTypeDefinition
1633+
1634+
init(loc: Location? = nil, definition: UnionTypeDefinition) {
1635+
self.loc = loc
1636+
self.definition = definition
1637+
}
1638+
}
1639+
1640+
extension UnionExtensionDefinition: Equatable {
1641+
public static func == (lhs: UnionExtensionDefinition, rhs: UnionExtensionDefinition) -> Bool {
1642+
return lhs.definition == rhs.definition
1643+
}
1644+
}
1645+
1646+
public final class EnumExtensionDefinition {
1647+
public let kind: Kind = .enumExtensionDefinition
1648+
public let loc: Location?
1649+
public let definition: EnumTypeDefinition
1650+
1651+
init(loc: Location? = nil, definition: EnumTypeDefinition) {
1652+
self.loc = loc
1653+
self.definition = definition
1654+
}
1655+
}
1656+
1657+
extension EnumExtensionDefinition: Equatable {
1658+
public static func == (lhs: EnumExtensionDefinition, rhs: EnumExtensionDefinition) -> Bool {
1659+
return lhs.definition == rhs.definition
1660+
}
1661+
}
1662+
1663+
public final class InputObjectExtensionDefinition {
1664+
public let kind: Kind = .inputObjectExtensionDefinition
1665+
public let loc: Location?
1666+
public let definition: InputObjectTypeDefinition
1667+
1668+
init(loc: Location? = nil, definition: InputObjectTypeDefinition) {
1669+
self.loc = loc
1670+
self.definition = definition
1671+
}
1672+
}
1673+
1674+
extension InputObjectExtensionDefinition: Equatable {
1675+
public static func == (lhs: InputObjectExtensionDefinition, rhs: InputObjectExtensionDefinition) -> Bool {
1676+
return lhs.definition == rhs.definition
1677+
}
1678+
}
1679+
15701680
public final class DirectiveDefinition {
15711681
public let kind: Kind = .directiveDefinition
15721682
public let loc: Location?

Sources/GraphQL/Language/Kinds.swift

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,4 +37,9 @@ public enum Kind {
3737
case typeExtensionDefinition
3838
case directiveDefinition
3939
case schemaExtensionDefinition
40+
case interfaceExtensionDefinition
41+
case scalarExtensionDefinition
42+
case unionExtensionDefinition
43+
case enumExtensionDefinition
44+
case inputObjectExtensionDefinition
4045
}

Sources/GraphQL/Language/Parser.swift

Lines changed: 71 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1010,11 +1010,16 @@ func parseExtensionDefinition(lexer: Lexer) throws -> TypeSystemDefinition {
10101010
switch token.value {
10111011
case "type": return try parseTypeExtensionDefinition(lexer: lexer)
10121012
case "schema": return try parseSchemaExtensionDefinition(lexer: lexer)
1013+
case "interface": return try parseInterfaceExtensionDefinition(lexer: lexer)
1014+
case "scalar": return try parseScalarExtensionDefinition(lexer: lexer)
1015+
case "union": return try parseUnionExtensionDefinition(lexer: lexer)
1016+
case "enum": return try parseEnumExtensionDefinition(lexer: lexer)
1017+
case "input": return try parseInputObjectExtensionDefinition(lexer: lexer)
10131018
default:
10141019
throw syntaxError(
10151020
source: lexer.source,
10161021
position: token.start,
1017-
description: "expected schema or type after extend"
1022+
description: "expected schema or type or interface or scalar or union or enum or input after extend"
10181023
)
10191024
}
10201025
}
@@ -1052,6 +1057,71 @@ func parseSchemaExtensionDefinition(lexer: Lexer) throws -> SchemaExtensionDefin
10521057
)
10531058
}
10541059

1060+
/**
1061+
* InterfaceExtensionDefinition: extend InterfaceTypeDefinition
1062+
*/
1063+
func parseInterfaceExtensionDefinition(lexer: Lexer) throws -> InterfaceExtensionDefinition {
1064+
let start = lexer.token
1065+
try expectKeyword(lexer: lexer, value: "extend")
1066+
let interfaceDefinition = try parseInterfaceTypeDefinition(lexer: lexer)
1067+
return InterfaceExtensionDefinition(
1068+
loc: loc(lexer: lexer, startToken: start),
1069+
definition: interfaceDefinition
1070+
)
1071+
}
1072+
1073+
/**
1074+
* ScalarExtensionDefinition: extend InterfaceTypeDefinition
1075+
*/
1076+
func parseScalarExtensionDefinition(lexer: Lexer) throws -> ScalarExtensionDefinition {
1077+
let start = lexer.token
1078+
try expectKeyword(lexer: lexer, value: "extend")
1079+
let scalarDefinition = try parseScalarTypeDefinition(lexer: lexer)
1080+
return ScalarExtensionDefinition(
1081+
loc: loc(lexer: lexer, startToken: start),
1082+
definition: scalarDefinition
1083+
)
1084+
}
1085+
1086+
/**
1087+
* UnionExtensionDefinition: extend UnionTypeDefinition
1088+
*/
1089+
func parseUnionExtensionDefinition(lexer: Lexer) throws -> UnionExtensionDefinition {
1090+
let start = lexer.token
1091+
try expectKeyword(lexer: lexer, value: "extend")
1092+
let definition = try parseUnionTypeDefinition(lexer: lexer)
1093+
return UnionExtensionDefinition(
1094+
loc: loc(lexer: lexer, startToken: start),
1095+
definition: definition
1096+
)
1097+
}
1098+
1099+
/**
1100+
* EnumExtensionDefinition: extend EnumTypeDefinition
1101+
*/
1102+
func parseEnumExtensionDefinition(lexer: Lexer) throws -> EnumExtensionDefinition {
1103+
let start = lexer.token
1104+
try expectKeyword(lexer: lexer, value: "extend")
1105+
let definition = try parseEnumTypeDefinition(lexer: lexer)
1106+
return EnumExtensionDefinition(
1107+
loc: loc(lexer: lexer, startToken: start),
1108+
definition: definition
1109+
)
1110+
}
1111+
1112+
/**
1113+
* InputObjectExtensionDefinition: extend InputObjectTypeDefinition
1114+
*/
1115+
func parseInputObjectExtensionDefinition(lexer: Lexer) throws -> InputObjectExtensionDefinition {
1116+
let start = lexer.token
1117+
try expectKeyword(lexer: lexer, value: "extend")
1118+
let definition = try parseInputObjectTypeDefinition(lexer: lexer)
1119+
return InputObjectExtensionDefinition(
1120+
loc: loc(lexer: lexer, startToken: start),
1121+
definition: definition
1122+
)
1123+
}
1124+
10551125
/**
10561126
* DirectiveDefinition :
10571127
* - directive @ Name ArgumentsDefinition? on DirectiveLocations

0 commit comments

Comments
 (0)