Skip to content

Commit 408245d

Browse files
committed
add schema extension definition
1 parent ad4a715 commit 408245d

File tree

3 files changed

+54
-1
lines changed

3 files changed

+54
-1
lines changed

Sources/GraphQL/Language/AST.swift

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,7 @@ extension EnumTypeDefinition: Node {}
213213
extension EnumValueDefinition: Node {}
214214
extension InputObjectTypeDefinition: Node {}
215215
extension TypeExtensionDefinition: Node {}
216+
extension SchemaExtensionDefinition: Node {}
216217
extension DirectiveDefinition: Node {}
217218

218219
public final class Name {
@@ -1099,6 +1100,7 @@ extension NonNullType: Equatable {
10991100
public protocol TypeSystemDefinition: Definition {}
11001101
extension SchemaDefinition: TypeSystemDefinition {}
11011102
extension TypeExtensionDefinition: TypeSystemDefinition {}
1103+
extension SchemaExtensionDefinition: TypeSystemDefinition {}
11021104
extension DirectiveDefinition: TypeSystemDefinition {}
11031105

11041106
public func == (lhs: TypeSystemDefinition, rhs: TypeSystemDefinition) -> Bool {
@@ -1119,6 +1121,10 @@ public func == (lhs: TypeSystemDefinition, rhs: TypeSystemDefinition) -> Bool {
11191121
if let r = rhs as? TypeDefinition {
11201122
return l == r
11211123
}
1124+
case let l as SchemaExtensionDefinition:
1125+
if let r = rhs as? SchemaExtensionDefinition {
1126+
return l == r
1127+
}
11221128
default:
11231129
return false
11241130
}
@@ -1543,6 +1549,23 @@ extension TypeExtensionDefinition: Equatable {
15431549
}
15441550
}
15451551

1552+
public final class SchemaExtensionDefinition {
1553+
public let kind: Kind = .schemaExtensionDefinition
1554+
public let loc: Location?
1555+
public let definition: SchemaDefinition
1556+
1557+
init(loc: Location? = nil, definition: SchemaDefinition) {
1558+
self.loc = loc
1559+
self.definition = definition
1560+
}
1561+
}
1562+
1563+
extension SchemaExtensionDefinition: Equatable {
1564+
public static func == (lhs: SchemaExtensionDefinition, rhs: SchemaExtensionDefinition) -> Bool {
1565+
return lhs.definition == rhs.definition
1566+
}
1567+
}
1568+
15461569
public final class DirectiveDefinition {
15471570
public let kind: Kind = .directiveDefinition
15481571
public let loc: Location?

Sources/GraphQL/Language/Kinds.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,4 +36,5 @@ public enum Kind {
3636
case inputObjectTypeDefinition
3737
case typeExtensionDefinition
3838
case directiveDefinition
39+
case schemaExtensionDefinition
3940
}

Sources/GraphQL/Language/Parser.swift

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -706,7 +706,7 @@ func parseTypeSystemDefinition(lexer: Lexer) throws -> TypeSystemDefinition {
706706
case "union": return try parseUnionTypeDefinition(lexer: lexer)
707707
case "enum": return try parseEnumTypeDefinition(lexer: lexer)
708708
case "input": return try parseInputObjectTypeDefinition(lexer: lexer)
709-
case "extend": return try parseTypeExtensionDefinition(lexer: lexer)
709+
case "extend": return try parseExtensionDefinition(lexer: lexer)
710710
case "directive": return try parseDirectiveDefinition(lexer: lexer)
711711
default: break
712712
}
@@ -1002,6 +1002,16 @@ func parseInputObjectTypeDefinition(lexer: Lexer) throws -> InputObjectTypeDefin
10021002
)
10031003
}
10041004

1005+
func parseExtensionDefinition(lexer: Lexer) throws -> TypeSystemDefinition {
1006+
let token = try lexer.lookahead()
1007+
switch token.value {
1008+
case "type": return try parseTypeExtensionDefinition(lexer: lexer)
1009+
case "schema": return try parseSchemaExtensionDefinition(lexer: lexer)
1010+
default:
1011+
throw syntaxError(source: lexer.source, position: token.start, description: "expected schema or type after extend")
1012+
}
1013+
}
1014+
10051015
/**
10061016
* TypeExtensionDefinition : extend ObjectTypeDefinition
10071017
*/
@@ -1015,6 +1025,25 @@ func parseTypeExtensionDefinition(lexer: Lexer) throws -> TypeExtensionDefinitio
10151025
)
10161026
}
10171027

1028+
/**
1029+
* SchemaExtensionDefinition: extend SchemaExtensionDefinition
1030+
*/
1031+
func parseSchemaExtensionDefinition(lexer: Lexer) throws -> SchemaExtensionDefinition {
1032+
let start = lexer.token
1033+
try expectKeyword(lexer: lexer, value: "extend")
1034+
let description = try parseDescription(lexer: lexer)
1035+
try expectKeyword(lexer: lexer, value: "schema")
1036+
let directives = try parseDirectives(lexer: lexer)
1037+
return SchemaExtensionDefinition(
1038+
loc: loc(lexer: lexer, startToken: start),
1039+
definition: SchemaDefinition(
1040+
loc: loc(lexer: lexer, startToken: start),
1041+
description: description,
1042+
directives: directives,
1043+
operationTypes: []
1044+
))
1045+
}
1046+
10181047
/**
10191048
* DirectiveDefinition :
10201049
* - directive @ Name ArgumentsDefinition? on DirectiveLocations

0 commit comments

Comments
 (0)