Skip to content

Commit 7c910f2

Browse files
Merge pull request #123 from samisuteria/samisuteria/extended-kitchen-sink
Update Schema Kitchen Sink Parsing + Tests
2 parents ec3721a + 98d563e commit 7c910f2

File tree

7 files changed

+682
-59
lines changed

7 files changed

+682
-59
lines changed

Sources/GraphQL/Language/AST.swift

Lines changed: 121 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ public final class Token {
3939
case eof = "<EOF>"
4040
case bang = "!"
4141
case dollar = "$"
42+
case amp = "&"
4243
case openingParenthesis = "("
4344
case closingParenthesis = ")"
4445
case spread = "..."
@@ -1102,6 +1103,11 @@ extension SchemaDefinition: TypeSystemDefinition {}
11021103
extension TypeExtensionDefinition: TypeSystemDefinition {}
11031104
extension SchemaExtensionDefinition: TypeSystemDefinition {}
11041105
extension DirectiveDefinition: TypeSystemDefinition {}
1106+
extension InterfaceExtensionDefinition: TypeSystemDefinition {}
1107+
extension ScalarExtensionDefinition: TypeSystemDefinition {}
1108+
extension UnionExtensionDefinition: TypeSystemDefinition {}
1109+
extension EnumExtensionDefinition: TypeSystemDefinition {}
1110+
extension InputObjectExtensionDefinition: TypeSystemDefinition {}
11051111

11061112
public func == (lhs: TypeSystemDefinition, rhs: TypeSystemDefinition) -> Bool {
11071113
switch lhs {
@@ -1125,6 +1131,26 @@ public func == (lhs: TypeSystemDefinition, rhs: TypeSystemDefinition) -> Bool {
11251131
if let r = rhs as? SchemaExtensionDefinition {
11261132
return l == r
11271133
}
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+
}
11281154
default:
11291155
return false
11301156
}
@@ -1566,26 +1592,120 @@ extension SchemaExtensionDefinition: Equatable {
15661592
}
15671593
}
15681594

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 == (
1608+
lhs: InterfaceExtensionDefinition,
1609+
rhs: InterfaceExtensionDefinition
1610+
) -> Bool {
1611+
return lhs.definition == rhs.definition
1612+
}
1613+
}
1614+
1615+
public final class ScalarExtensionDefinition {
1616+
public let kind: Kind = .scalarExtensionDefinition
1617+
public let loc: Location?
1618+
public let definition: ScalarTypeDefinition
1619+
1620+
init(loc: Location? = nil, definition: ScalarTypeDefinition) {
1621+
self.loc = loc
1622+
self.definition = definition
1623+
}
1624+
}
1625+
1626+
extension ScalarExtensionDefinition: Equatable {
1627+
public static func == (lhs: ScalarExtensionDefinition, rhs: ScalarExtensionDefinition) -> Bool {
1628+
return lhs.definition == rhs.definition
1629+
}
1630+
}
1631+
1632+
public final class UnionExtensionDefinition {
1633+
public let kind: Kind = .unionExtensionDefinition
1634+
public let loc: Location?
1635+
public let definition: UnionTypeDefinition
1636+
1637+
init(loc: Location? = nil, definition: UnionTypeDefinition) {
1638+
self.loc = loc
1639+
self.definition = definition
1640+
}
1641+
}
1642+
1643+
extension UnionExtensionDefinition: Equatable {
1644+
public static func == (lhs: UnionExtensionDefinition, rhs: UnionExtensionDefinition) -> Bool {
1645+
return lhs.definition == rhs.definition
1646+
}
1647+
}
1648+
1649+
public final class EnumExtensionDefinition {
1650+
public let kind: Kind = .enumExtensionDefinition
1651+
public let loc: Location?
1652+
public let definition: EnumTypeDefinition
1653+
1654+
init(loc: Location? = nil, definition: EnumTypeDefinition) {
1655+
self.loc = loc
1656+
self.definition = definition
1657+
}
1658+
}
1659+
1660+
extension EnumExtensionDefinition: Equatable {
1661+
public static func == (lhs: EnumExtensionDefinition, rhs: EnumExtensionDefinition) -> Bool {
1662+
return lhs.definition == rhs.definition
1663+
}
1664+
}
1665+
1666+
public final class InputObjectExtensionDefinition {
1667+
public let kind: Kind = .inputObjectExtensionDefinition
1668+
public let loc: Location?
1669+
public let definition: InputObjectTypeDefinition
1670+
1671+
init(loc: Location? = nil, definition: InputObjectTypeDefinition) {
1672+
self.loc = loc
1673+
self.definition = definition
1674+
}
1675+
}
1676+
1677+
extension InputObjectExtensionDefinition: Equatable {
1678+
public static func == (
1679+
lhs: InputObjectExtensionDefinition,
1680+
rhs: InputObjectExtensionDefinition
1681+
) -> Bool {
1682+
return lhs.definition == rhs.definition
1683+
}
1684+
}
1685+
15691686
public final class DirectiveDefinition {
15701687
public let kind: Kind = .directiveDefinition
15711688
public let loc: Location?
15721689
public let description: StringValue?
15731690
public let name: Name
15741691
public let arguments: [InputValueDefinition]
15751692
public let locations: [Name]
1693+
public let repeatable: Bool
15761694

15771695
init(
15781696
loc: Location? = nil,
15791697
description: StringValue? = nil,
15801698
name: Name,
15811699
arguments: [InputValueDefinition] = [],
1582-
locations: [Name]
1700+
locations: [Name],
1701+
repeatable: Bool = false
15831702
) {
15841703
self.loc = loc
15851704
self.name = name
15861705
self.description = description
15871706
self.arguments = arguments
15881707
self.locations = locations
1708+
self.repeatable = repeatable
15891709
}
15901710
}
15911711

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/Lexer.swift

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,22 @@ func advanceLexer(lexer: Lexer) throws -> Token {
4646
return token
4747
}
4848

49+
/**
50+
* Returns a non-empty list of parse nodes, determined by the parseFn.
51+
* This list may begin with a lex token of delimiterKind followed by items separated by lex tokens of tokenKind.
52+
* Advances the parser to the next lex token after last item in the list.
53+
*/
54+
func delimitedMany<T>(lexer: Lexer, kind: Token.Kind, parseFn: (Lexer) throws -> T) throws -> [T] {
55+
_ = try expectOptional(lexer: lexer, kind: kind)
56+
57+
var nodes: [T] = []
58+
repeat {
59+
try nodes.append(parseFn(lexer))
60+
} while try expectOptional(lexer: lexer, kind: kind) != nil
61+
62+
return nodes
63+
}
64+
4965
/**
5066
* The return type of createLexer.
5167
*/
@@ -244,6 +260,16 @@ func readToken(lexer: Lexer, prev: Token) throws -> Token {
244260
column: col,
245261
prev: prev
246262
)
263+
// &
264+
case 38:
265+
return Token(
266+
kind: .amp,
267+
start: position,
268+
end: position + 1,
269+
line: line,
270+
column: col,
271+
prev: prev
272+
)
247273
// (
248274
case 40:
249275
return Token(

0 commit comments

Comments
 (0)