Skip to content

Commit cddcad3

Browse files
authored
Address recent SDL spec changes (#1139)
This should be the last set of spec changes for a standardized SDL
1 parent 7e147a8 commit cddcad3

File tree

2 files changed

+60
-24
lines changed

2 files changed

+60
-24
lines changed

src/language/ast.js

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -176,10 +176,13 @@ export type DocumentNode = {
176176
};
177177

178178
export type DefinitionNode =
179-
| OperationDefinitionNode
180-
| FragmentDefinitionNode
179+
| ExecutableDefinitionNode
181180
| TypeSystemDefinitionNode; // experimental non-spec addition.
182181

182+
export type ExecutableDefinitionNode =
183+
| OperationDefinitionNode
184+
| FragmentDefinitionNode;
185+
183186
export type OperationDefinitionNode = {
184187
+kind: 'OperationDefinition',
185188
+loc?: Location,

src/language/parser.js

Lines changed: 55 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import type {
1919
VariableNode,
2020
DocumentNode,
2121
DefinitionNode,
22+
ExecutableDefinitionNode,
2223
OperationDefinitionNode,
2324
OperationTypeNode,
2425
VariableDefinitionNode,
@@ -213,26 +214,17 @@ function parseDocument(lexer: Lexer<*>): DocumentNode {
213214

214215
/**
215216
* Definition :
216-
* - OperationDefinition
217-
* - FragmentDefinition
217+
* - ExecutableDefinition
218218
* - TypeSystemDefinition
219219
*/
220220
function parseDefinition(lexer: Lexer<*>): DefinitionNode {
221-
if (peek(lexer, TokenKind.BRACE_L)) {
222-
return parseOperationDefinition(lexer);
223-
}
224-
225221
if (peek(lexer, TokenKind.NAME)) {
226222
switch (lexer.token.value) {
227223
case 'query':
228224
case 'mutation':
229225
case 'subscription':
230-
return parseOperationDefinition(lexer);
231-
232226
case 'fragment':
233-
return parseFragmentDefinition(lexer);
234-
235-
// Note: The schema definition language is an experimental addition.
227+
return parseExecutableDefinition(lexer);
236228
case 'schema':
237229
case 'scalar':
238230
case 'type':
@@ -242,13 +234,37 @@ function parseDefinition(lexer: Lexer<*>): DefinitionNode {
242234
case 'input':
243235
case 'extend':
244236
case 'directive':
237+
// Note: The schema definition language is an experimental addition.
245238
return parseTypeSystemDefinition(lexer);
246239
}
240+
} else if (peek(lexer, TokenKind.BRACE_L)) {
241+
return parseExecutableDefinition(lexer);
242+
} else if (peekDescription(lexer)) {
243+
// Note: The schema definition language is an experimental addition.
244+
return parseTypeSystemDefinition(lexer);
247245
}
248246

249-
// Note: The schema definition language is an experimental addition.
250-
if (peekDescription(lexer)) {
251-
return parseTypeSystemDefinition(lexer);
247+
throw unexpected(lexer);
248+
}
249+
250+
/**
251+
* ExecutableDefinition :
252+
* - OperationDefinition
253+
* - FragmentDefinition
254+
*/
255+
function parseExecutableDefinition(lexer: Lexer<*>): ExecutableDefinitionNode {
256+
if (peek(lexer, TokenKind.NAME)) {
257+
switch (lexer.token.value) {
258+
case 'query':
259+
case 'mutation':
260+
case 'subscription':
261+
return parseOperationDefinition(lexer);
262+
263+
case 'fragment':
264+
return parseFragmentDefinition(lexer);
265+
}
266+
} else if (peek(lexer, TokenKind.BRACE_L)) {
267+
return parseOperationDefinition(lexer);
252268
}
253269

254270
throw unexpected(lexer);
@@ -1321,14 +1337,31 @@ function parseDirectiveLocations(lexer: Lexer<*>): Array<NameNode> {
13211337
}
13221338

13231339
/*
1324-
* DirectiveLocation: one of
1325-
* `QUERY` `SCHEMA` `ENUM`
1326-
* `MUTATION` `SCALAR` `ENUM_VALUE`
1327-
* `SUBSCRIPTION` `OBJECT` `INPUT_OBJECT`
1328-
* `FIELD` `FIELD_DEFINITION` `INPUT_FIELD_DEFINITION`
1329-
* `FRAGMENT_DEFINITION` `ARGUMENT_DEFINITION`
1330-
* `FRAGMENT_SPREAD` `INTERFACE`
1331-
* `INLINE_FRAGMENT` `UNION`
1340+
* DirectiveLocation :
1341+
* - ExecutableDirectiveLocation
1342+
* - TypeSystemDirectiveLocation
1343+
*
1344+
* ExecutableDirectiveLocation : one of
1345+
* `QUERY`
1346+
* `MUTATION`
1347+
* `SUBSCRIPTION`
1348+
* `FIELD`
1349+
* `FRAGMENT_DEFINITION`
1350+
* `FRAGMENT_SPREAD`
1351+
* `INLINE_FRAGMENT`
1352+
*
1353+
* TypeSystemDirectiveLocation : one of
1354+
* `SCHEMA`
1355+
* `SCALAR`
1356+
* `OBJECT`
1357+
* `FIELD_DEFINITION`
1358+
* `ARGUMENT_DEFINITION`
1359+
* `INTERFACE`
1360+
* `UNION`
1361+
* `ENUM`
1362+
* `ENUM_VALUE`
1363+
* `INPUT_OBJECT`
1364+
* `INPUT_FIELD_DEFINITION`
13321365
*/
13331366
function parseDirectiveLocation(lexer: Lexer<*>): NameNode {
13341367
const start = lexer.token;

0 commit comments

Comments
 (0)