Skip to content

Commit 872f837

Browse files
committed
add support for optional Description defined for most TypeDefinitions
Doesn’t support multi-line descriptions because string parser currently doesn’t support multi-line strings. Tests for all additions. Two strategies used for two different kind of places for descriptions: 1) for items in lists (EnumValueDefinition, FieldDefinition, InputValueDefinition) uses new parseDescription(…) to get the optional description if present. 2) for object definitions where a bunch at the same level have optional descriptions followed by a distinguishing token (SchemaDefinition, ScalarTypeDefintion, ObjectTypeDefinition, InterfaceTypeDefinition, UnionTypeDefinition, EnumTypeDefinition, InputObjectTypeDefinition, DirectiveDefinition) we have to advance the lexer to the distinguishing token so we replace the .string Token in lastToken with a copy with only the token kind set to new Token kind, .description. Then each of the specific parsers for those Definitions checks .lastToken to see if it’s a kind is .description and if so, uses that for it’s optional description field. This was the approach that modified the existing code the least and seemed to keep in the spirit of the current implementation.
1 parent 0572308 commit 872f837

File tree

3 files changed

+453
-27
lines changed

3 files changed

+453
-27
lines changed

Sources/GraphQL/Language/AST.swift

Lines changed: 72 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ final public class Token {
5656
case float = "Float"
5757
case string = "String"
5858
case comment = "Comment"
59+
case description = "Description" // string in a description position
5960

6061
public var description: String {
6162
return rawValue
@@ -132,6 +133,19 @@ extension Token : CustomStringConvertible {
132133
}
133134
}
134135

136+
extension Token {
137+
convenience init(from token: Token, as kind: Kind ) {
138+
self.init(kind: kind,
139+
start: token.start,
140+
end: token.end,
141+
line: token.line,
142+
column: token.column,
143+
value: token.value,
144+
prev: token.prev,
145+
next: token.next)
146+
}
147+
}
148+
135149
public enum NodeResult {
136150
case node(Node)
137151
case array([Node])
@@ -1075,20 +1089,23 @@ public func == (lhs: TypeSystemDefinition, rhs: TypeSystemDefinition) -> Bool {
10751089
public final class SchemaDefinition {
10761090
public let kind: Kind = .schemaDefinition
10771091
public let loc: Location?
1092+
public let description: String?
10781093
public let directives: [Directive]
10791094
public let operationTypes: [OperationTypeDefinition]
10801095

1081-
init(loc: Location? = nil, directives: [Directive], operationTypes: [OperationTypeDefinition]) {
1096+
init(loc: Location? = nil, description: String? = nil, directives: [Directive], operationTypes: [OperationTypeDefinition]) {
10821097
self.loc = loc
1098+
self.description = description
10831099
self.directives = directives
10841100
self.operationTypes = operationTypes
10851101
}
10861102
}
10871103

10881104
extension SchemaDefinition : Equatable {
10891105
public static func == (lhs: SchemaDefinition, rhs: SchemaDefinition) -> Bool {
1090-
return lhs.directives == rhs.directives &&
1091-
lhs.operationTypes == rhs.operationTypes
1106+
return lhs.description == rhs.description &&
1107+
lhs.directives == rhs.directives &&
1108+
lhs.operationTypes == rhs.operationTypes
10921109
}
10931110
}
10941111

@@ -1156,33 +1173,38 @@ public func == (lhs: TypeDefinition, rhs: TypeDefinition) -> Bool {
11561173
public final class ScalarTypeDefinition {
11571174
public let kind: Kind = .scalarTypeDefinition
11581175
public let loc: Location?
1176+
public let description: String?
11591177
public let name: Name
11601178
public let directives: [Directive]
11611179

1162-
init(loc: Location? = nil, name: Name, directives: [Directive] = []) {
1180+
init(loc: Location? = nil, description: String? = nil, name: Name, directives: [Directive] = []) {
11631181
self.loc = loc
1182+
self.description = description
11641183
self.name = name
11651184
self.directives = directives
11661185
}
11671186
}
11681187

11691188
extension ScalarTypeDefinition : Equatable {
11701189
public static func == (lhs: ScalarTypeDefinition, rhs: ScalarTypeDefinition) -> Bool {
1171-
return lhs.name == rhs.name &&
1190+
return lhs.description == rhs.description &&
1191+
lhs.name == rhs.name &&
11721192
lhs.directives == rhs.directives
11731193
}
11741194
}
11751195

11761196
public final class ObjectTypeDefinition {
11771197
public let kind: Kind = .objectTypeDefinition
11781198
public let loc: Location?
1199+
public let description: String?
11791200
public let name: Name
11801201
public let interfaces: [NamedType]
11811202
public let directives: [Directive]
11821203
public let fields: [FieldDefinition]
11831204

1184-
init(loc: Location? = nil, name: Name, interfaces: [NamedType] = [], directives: [Directive] = [], fields: [FieldDefinition] = []) {
1205+
init(loc: Location? = nil, description: String? = nil, name: Name, interfaces: [NamedType] = [], directives: [Directive] = [], fields: [FieldDefinition] = []) {
11851206
self.loc = loc
1207+
self.description = description
11861208
self.name = name
11871209
self.interfaces = interfaces
11881210
self.directives = directives
@@ -1192,7 +1214,8 @@ public final class ObjectTypeDefinition {
11921214

11931215
extension ObjectTypeDefinition : Equatable {
11941216
public static func == (lhs: ObjectTypeDefinition, rhs: ObjectTypeDefinition) -> Bool {
1195-
return lhs.name == rhs.name &&
1217+
return lhs.description == rhs.description &&
1218+
lhs.name == rhs.name &&
11961219
lhs.interfaces == rhs.interfaces &&
11971220
lhs.directives == rhs.directives &&
11981221
lhs.fields == rhs.fields
@@ -1202,13 +1225,15 @@ extension ObjectTypeDefinition : Equatable {
12021225
public final class FieldDefinition {
12031226
public let kind: Kind = .fieldDefinition
12041227
public let loc: Location?
1228+
public let description: String?
12051229
public let name: Name
12061230
public let arguments: [InputValueDefinition]
12071231
public let type: Type
12081232
public let directives: [Directive]
12091233

1210-
init(loc: Location? = nil, name: Name, arguments: [InputValueDefinition] = [], type: Type, directives: [Directive] = []) {
1234+
init(loc: Location? = nil, description: String? = nil, name: Name, arguments: [InputValueDefinition] = [], type: Type, directives: [Directive] = []) {
12111235
self.loc = loc
1236+
self.description = description
12121237
self.name = name
12131238
self.arguments = arguments
12141239
self.type = type
@@ -1218,7 +1243,8 @@ public final class FieldDefinition {
12181243

12191244
extension FieldDefinition : Equatable {
12201245
public static func == (lhs: FieldDefinition, rhs: FieldDefinition) -> Bool {
1221-
return lhs.name == rhs.name &&
1246+
return lhs.description == rhs.description &&
1247+
lhs.name == rhs.name &&
12221248
lhs.arguments == rhs.arguments &&
12231249
lhs.type == rhs.type &&
12241250
lhs.directives == rhs.directives
@@ -1228,13 +1254,15 @@ extension FieldDefinition : Equatable {
12281254
public final class InputValueDefinition {
12291255
public let kind: Kind = .inputValueDefinition
12301256
public let loc: Location?
1257+
public let description: String?
12311258
public let name: Name
12321259
public let type: Type
12331260
public let defaultValue: Value?
12341261
public let directives: [Directive]
12351262

1236-
init(loc: Location? = nil, name: Name, type: Type, defaultValue: Value? = nil, directives: [Directive] = []) {
1263+
init(loc: Location? = nil, description: String? = nil, name: Name, type: Type, defaultValue: Value? = nil, directives: [Directive] = []) {
12371264
self.loc = loc
1265+
self.description = description
12381266
self.name = name
12391267
self.type = type
12401268
self.defaultValue = defaultValue
@@ -1271,19 +1299,22 @@ extension InputValueDefinition : Equatable {
12711299
public final class InterfaceTypeDefinition {
12721300
public let kind: Kind = .interfaceTypeDefinition
12731301
public let loc: Location?
1302+
public let description: String?
12741303
public let name: Name
12751304
public let interfaces: [NamedType]
12761305
public let directives: [Directive]
12771306
public let fields: [FieldDefinition]
12781307

12791308
init(
12801309
loc: Location? = nil,
1310+
description: String? = nil,
12811311
name: Name,
12821312
interfaces: [NamedType] = [],
12831313
directives: [Directive] = [],
12841314
fields: [FieldDefinition]
12851315
) {
12861316
self.loc = loc
1317+
self.description = description
12871318
self.name = name
12881319
self.interfaces = interfaces
12891320
self.directives = directives
@@ -1293,7 +1324,8 @@ public final class InterfaceTypeDefinition {
12931324

12941325
extension InterfaceTypeDefinition : Equatable {
12951326
public static func == (lhs: InterfaceTypeDefinition, rhs: InterfaceTypeDefinition) -> Bool {
1296-
return lhs.name == rhs.name &&
1327+
return lhs.description == rhs.description &&
1328+
lhs.name == rhs.name &&
12971329
lhs.directives == rhs.directives &&
12981330
lhs.fields == rhs.fields
12991331
}
@@ -1302,12 +1334,14 @@ extension InterfaceTypeDefinition : Equatable {
13021334
public final class UnionTypeDefinition {
13031335
public let kind: Kind = .unionTypeDefinition
13041336
public let loc: Location?
1337+
public let description: String?
13051338
public let name: Name
13061339
public let directives: [Directive]
13071340
public let types: [NamedType]
13081341

1309-
init(loc: Location? = nil, name: Name, directives: [Directive] = [], types: [NamedType]) {
1342+
init(loc: Location? = nil, description: String? = nil, name: Name, directives: [Directive] = [], types: [NamedType]) {
13101343
self.loc = loc
1344+
self.description = description
13111345
self.name = name
13121346
self.directives = directives
13131347
self.types = types
@@ -1316,7 +1350,8 @@ public final class UnionTypeDefinition {
13161350

13171351
extension UnionTypeDefinition : Equatable {
13181352
public static func == (lhs: UnionTypeDefinition, rhs: UnionTypeDefinition) -> Bool {
1319-
return lhs.name == rhs.name &&
1353+
return lhs.description == rhs.description &&
1354+
lhs.name == rhs.name &&
13201355
lhs.directives == rhs.directives &&
13211356
lhs.types == rhs.types
13221357
}
@@ -1325,12 +1360,14 @@ extension UnionTypeDefinition : Equatable {
13251360
public final class EnumTypeDefinition {
13261361
public let kind: Kind = .enumTypeDefinition
13271362
public let loc: Location?
1363+
public let description: String?
13281364
public let name: Name
13291365
public let directives: [Directive]
13301366
public let values: [EnumValueDefinition]
13311367

1332-
init(loc: Location? = nil, name: Name, directives: [Directive] = [], values: [EnumValueDefinition]) {
1368+
init(loc: Location? = nil, description: String? = nil, name: Name, directives: [Directive] = [], values: [EnumValueDefinition]) {
13331369
self.loc = loc
1370+
self.description = description
13341371
self.name = name
13351372
self.directives = directives
13361373
self.values = values
@@ -1339,7 +1376,8 @@ public final class EnumTypeDefinition {
13391376

13401377
extension EnumTypeDefinition : Equatable {
13411378
public static func == (lhs: EnumTypeDefinition, rhs: EnumTypeDefinition) -> Bool {
1342-
return lhs.name == rhs.name &&
1379+
return lhs.description == rhs.description &&
1380+
lhs.name == rhs.name &&
13431381
lhs.directives == rhs.directives &&
13441382
lhs.values == rhs.values
13451383
}
@@ -1348,32 +1386,37 @@ extension EnumTypeDefinition : Equatable {
13481386
public final class EnumValueDefinition {
13491387
public let kind: Kind = .enumValueDefinition
13501388
public let loc: Location?
1389+
public let description: String?
13511390
public let name: Name
13521391
public let directives: [Directive]
13531392

1354-
init(loc: Location? = nil, name: Name, directives: [Directive] = []) {
1393+
init(loc: Location? = nil, description: String? = nil, name: Name, directives: [Directive] = []) {
13551394
self.loc = loc
1395+
self.description = description
13561396
self.name = name
13571397
self.directives = directives
13581398
}
13591399
}
13601400

13611401
extension EnumValueDefinition : Equatable {
13621402
public static func == (lhs: EnumValueDefinition, rhs: EnumValueDefinition) -> Bool {
1363-
return lhs.name == rhs.name &&
1403+
return lhs.description == rhs.description &&
1404+
lhs.name == rhs.name &&
13641405
lhs.directives == rhs.directives
13651406
}
13661407
}
13671408

13681409
public final class InputObjectTypeDefinition {
13691410
public let kind: Kind = .inputObjectTypeDefinition
13701411
public let loc: Location?
1412+
public let description: String?
13711413
public let name: Name
13721414
public let directives: [Directive]
13731415
public let fields: [InputValueDefinition]
13741416

1375-
init(loc: Location? = nil, name: Name, directives: [Directive] = [], fields: [InputValueDefinition]) {
1417+
init(loc: Location? = nil, description: String? = nil, name: Name, directives: [Directive] = [], fields: [InputValueDefinition]) {
13761418
self.loc = loc
1419+
self.description = description
13771420
self.name = name
13781421
self.directives = directives
13791422
self.fields = fields
@@ -1382,9 +1425,10 @@ public final class InputObjectTypeDefinition {
13821425

13831426
extension InputObjectTypeDefinition : Equatable {
13841427
public static func == (lhs: InputObjectTypeDefinition, rhs: InputObjectTypeDefinition) -> Bool {
1385-
return lhs.name == rhs.name &&
1386-
lhs.directives == rhs.directives &&
1387-
lhs.fields == rhs.fields
1428+
return lhs.description == rhs.description &&
1429+
lhs.name == rhs.name &&
1430+
lhs.directives == rhs.directives &&
1431+
lhs.fields == rhs.fields
13881432
}
13891433
}
13901434

@@ -1408,22 +1452,25 @@ extension TypeExtensionDefinition : Equatable {
14081452
public final class DirectiveDefinition {
14091453
public let kind: Kind = .directiveDefinition
14101454
public let loc: Location?
1455+
public let description: String?
14111456
public let name: Name
14121457
public let arguments: [InputValueDefinition]
14131458
public let locations: [Name]
14141459

1415-
init(loc: Location? = nil, name: Name, arguments: [InputValueDefinition] = [], locations: [Name]) {
1460+
init(loc: Location? = nil, description: String? = nil, name: Name, arguments: [InputValueDefinition] = [], locations: [Name]) {
14161461
self.loc = loc
14171462
self.name = name
1463+
self.description = description
14181464
self.arguments = arguments
14191465
self.locations = locations
14201466
}
14211467
}
14221468

14231469
extension DirectiveDefinition : Equatable {
14241470
public static func == (lhs: DirectiveDefinition, rhs: DirectiveDefinition) -> Bool {
1425-
return lhs.name == rhs.name &&
1426-
lhs.arguments == rhs.arguments &&
1427-
lhs.locations == rhs.locations
1471+
return lhs.description == rhs.description &&
1472+
lhs.name == rhs.name &&
1473+
lhs.arguments == rhs.arguments &&
1474+
lhs.locations == rhs.locations
14281475
}
14291476
}

0 commit comments

Comments
 (0)