@@ -173,24 +173,45 @@ func parseDefinition(lexer: Lexer) throws -> Definition {
173
173
return try parseOperationDefinition ( lexer: lexer)
174
174
}
175
175
176
- if peek ( lexer: lexer, kind: . name) {
177
- guard let value = lexer. token. value else {
176
+ // Many definitions begin with a description and require a lookahead.
177
+ let hasDescription = peekDescription ( lexer: lexer)
178
+ let keywordToken = hasDescription
179
+ ? try lexer. lookahead ( )
180
+ : lexer. token
181
+
182
+ if keywordToken. kind == . name {
183
+ guard let value = keywordToken. value else {
178
184
throw GraphQLError ( message: " Expected name token to have value: \( lexer. token) " )
179
185
}
186
+
180
187
switch value {
181
- case " query " , " mutation " , " subscription " :
182
- return try parseOperationDefinition ( lexer: lexer)
183
- case " fragment " :
184
- return try parseFragmentDefinition ( lexer: lexer)
185
- // Note: the Type System IDL is an experimental non-spec addition.
186
- case " schema " , " scalar " , " type " , " interface " , " union " , " enum " , " input " , " extend " ,
187
- " directive " :
188
- return try parseTypeSystemDefinition ( lexer: lexer)
188
+ case " schema " : return try parseSchemaDefinition ( lexer : lexer )
189
+ case " scalar " : return try parseScalarTypeDefinition ( lexer: lexer)
190
+ case " type " : return try parseObjectTypeDefinition ( lexer : lexer )
191
+ case " interface " : return try parseInterfaceTypeDefinition ( lexer: lexer)
192
+ case " union " : return try parseUnionTypeDefinition ( lexer : lexer )
193
+ case " enum " : return try parseEnumTypeDefinition ( lexer : lexer )
194
+ case " input " : return try parseInputObjectTypeDefinition ( lexer : lexer )
195
+ case " directive " : return try parseDirectiveDefinition ( lexer: lexer)
189
196
default :
190
- break
197
+ if hasDescription {
198
+ throw syntaxError (
199
+ source: lexer. source,
200
+ position: lexer. token. start,
201
+ description: " Unexpected description, descriptions are supported only on type definitions. "
202
+ )
203
+ }
204
+ switch value {
205
+ case " query " , " mutation " , " subscription " :
206
+ return try parseOperationDefinition ( lexer: lexer)
207
+ case " fragment " :
208
+ return try parseFragmentDefinition ( lexer: lexer)
209
+ case " extend " :
210
+ return try parseExtensionDefinition ( lexer: lexer)
211
+ default :
212
+ break
213
+ }
191
214
}
192
- } else if peekDescription ( lexer: lexer) {
193
- return try parseTypeSystemDefinition ( lexer: lexer)
194
215
}
195
216
196
217
throw unexpected ( lexer: lexer)
@@ -675,47 +696,6 @@ func parseNamedType(lexer: Lexer) throws -> NamedType {
675
696
676
697
// Implements the parsing rules in the Type Definition section.
677
698
678
- /**
679
- * TypeSystemDefinition :
680
- * - SchemaDefinition
681
- * - TypeDefinition
682
- * - TypeExtensionDefinition
683
- * - DirectiveDefinition
684
- *
685
- * TypeDefinition :
686
- * - ScalarTypeDefinition
687
- * - ObjectTypeDefinition
688
- * - InterfaceTypeDefinition
689
- * - UnionTypeDefinition
690
- * - EnumTypeDefinition
691
- * - InputObjectTypeDefinition
692
- */
693
- func parseTypeSystemDefinition( lexer: Lexer ) throws -> TypeSystemDefinition {
694
- let keywordToken = peekDescription ( lexer: lexer)
695
- ? try lexer. lookahead ( )
696
- : lexer. token
697
-
698
- if keywordToken. kind == . name {
699
- guard let value = keywordToken. value else {
700
- throw GraphQLError ( message: " Expected keyword token to have value: \( keywordToken) " )
701
- }
702
- switch value {
703
- case " schema " : return try parseSchemaDefinition ( lexer: lexer)
704
- case " scalar " : return try parseScalarTypeDefinition ( lexer: lexer)
705
- case " type " : return try parseObjectTypeDefinition ( lexer: lexer)
706
- case " interface " : return try parseInterfaceTypeDefinition ( lexer: lexer)
707
- case " union " : return try parseUnionTypeDefinition ( lexer: lexer)
708
- case " enum " : return try parseEnumTypeDefinition ( lexer: lexer)
709
- case " input " : return try parseInputObjectTypeDefinition ( lexer: lexer)
710
- case " extend " : return try parseExtensionDefinition ( lexer: lexer)
711
- case " directive " : return try parseDirectiveDefinition ( lexer: lexer)
712
- default : break
713
- }
714
- }
715
-
716
- throw unexpected ( lexer: lexer, atToken: keywordToken)
717
- }
718
-
719
699
/**
720
700
* SchemaDefinition : schema Directives? { OperationTypeDefinition+ }
721
701
*
@@ -1124,8 +1104,8 @@ func parseScalarExtensionDefinition(lexer: Lexer) throws -> ScalarExtensionDefin
1124
1104
try expectKeyword ( lexer: lexer, value: " scalar " )
1125
1105
let name = try parseName ( lexer: lexer)
1126
1106
let directives = try parseDirectives ( lexer: lexer)
1127
- if ( directives. isEmpty) {
1128
- throw unexpected ( lexer: lexer)
1107
+ if directives. isEmpty {
1108
+ throw unexpected ( lexer: lexer)
1129
1109
}
1130
1110
return ScalarExtensionDefinition (
1131
1111
loc: loc ( lexer: lexer, startToken: start) ,
0 commit comments