Skip to content

Commit c3f01bd

Browse files
authored
use a different Kind for Fragment Arguments (#13)
at least for now!
1 parent 3918bb5 commit c3f01bd

File tree

7 files changed

+37
-4
lines changed

7 files changed

+37
-4
lines changed

src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,7 @@ export type {
264264
SelectionNode,
265265
FieldNode,
266266
ArgumentNode,
267+
FragmentArgumentNode,
267268
NullabilityAssertionNode,
268269
NonNullAssertionNode,
269270
ErrorBoundaryNode,

src/language/__tests__/visitor-test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -536,12 +536,12 @@ describe('Visitor', () => {
536536
['enter', 'FragmentSpread', undefined],
537537
['enter', 'Name', 's'],
538538
['leave', 'Name', 's'],
539-
['enter', 'Argument', { kind: 'BooleanValue', value: false }],
539+
['enter', 'FragmentArgument', { kind: 'BooleanValue', value: false }],
540540
['enter', 'Name', 'v'],
541541
['leave', 'Name', 'v'],
542542
['enter', 'BooleanValue', false],
543543
['leave', 'BooleanValue', false],
544-
['leave', 'Argument', { kind: 'BooleanValue', value: false }],
544+
['leave', 'FragmentArgument', { kind: 'BooleanValue', value: false }],
545545
['leave', 'FragmentSpread', undefined],
546546
['leave', 'SelectionSet', undefined],
547547
['leave', 'FragmentDefinition', undefined],

src/language/ast.ts

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,7 @@ export type ASTNode =
146146
| SelectionSetNode
147147
| FieldNode
148148
| ArgumentNode
149+
| FragmentArgumentNode
149150
| FragmentSpreadNode
150151
| InlineFragmentNode
151152
| FragmentDefinitionNode
@@ -221,6 +222,7 @@ export const QueryDocumentKeys: {
221222
'nullabilityAssertion',
222223
],
223224
Argument: ['name', 'value'],
225+
FragmentArgument: ['name', 'value'],
224226
// Note: Client Controlled Nullability is experimental and may be changed
225227
// or removed in the future.
226228
ListNullabilityOperator: ['nullabilityAssertion'],
@@ -422,13 +424,20 @@ export interface ConstArgumentNode {
422424
readonly value: ConstValueNode;
423425
}
424426

427+
export interface FragmentArgumentNode {
428+
readonly kind: Kind.FRAGMENT_ARGUMENT;
429+
readonly loc?: Location | undefined;
430+
readonly name: NameNode;
431+
readonly value: ValueNode;
432+
}
433+
425434
/** Fragments */
426435

427436
export interface FragmentSpreadNode {
428437
readonly kind: Kind.FRAGMENT_SPREAD;
429438
readonly loc?: Location | undefined;
430439
readonly name: NameNode;
431-
readonly arguments?: ReadonlyArray<ArgumentNode> | undefined;
440+
readonly arguments?: ReadonlyArray<FragmentArgumentNode> | undefined;
432441
readonly directives?: ReadonlyArray<DirectiveNode> | undefined;
433442
}
434443

src/language/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ export type {
4444
ErrorBoundaryNode,
4545
ListNullabilityOperatorNode,
4646
ArgumentNode,
47+
FragmentArgumentNode /* for experimental fragment arguments */,
4748
ConstArgumentNode,
4849
FragmentSpreadNode,
4950
InlineFragmentNode,

src/language/kinds.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ export enum Kind {
1212
SELECTION_SET = 'SelectionSet',
1313
FIELD = 'Field',
1414
ARGUMENT = 'Argument',
15+
FRAGMENT_ARGUMENT = 'FragmentArgument',
1516

1617
/** Nullability Modifiers */
1718
LIST_NULLABILITY_OPERATOR = 'ListNullabilityOperator',

src/language/parser.ts

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import type {
2424
FieldDefinitionNode,
2525
FieldNode,
2626
FloatValueNode,
27+
FragmentArgumentNode,
2728
FragmentDefinitionNode,
2829
FragmentSpreadNode,
2930
InlineFragmentNode,
@@ -528,6 +529,12 @@ export class Parser {
528529
return this.optionalMany(TokenKind.PAREN_L, item, TokenKind.PAREN_R);
529530
}
530531

532+
/* experimental */
533+
parseFragmentArguments(): Array<FragmentArgumentNode> {
534+
const item = this.parseFragmentArgument;
535+
return this.optionalMany(TokenKind.PAREN_L, item, TokenKind.PAREN_R);
536+
}
537+
531538
/**
532539
* Argument[Const] : Name : Value[?Const]
533540
*/
@@ -549,6 +556,19 @@ export class Parser {
549556
return this.parseArgument(true);
550557
}
551558

559+
/* experimental */
560+
parseFragmentArgument(): FragmentArgumentNode {
561+
const start = this._lexer.token;
562+
const name = this.parseName();
563+
564+
this.expectToken(TokenKind.COLON);
565+
return this.node<FragmentArgumentNode>(start, {
566+
kind: Kind.FRAGMENT_ARGUMENT,
567+
name,
568+
value: this.parseValueLiteral(false),
569+
});
570+
}
571+
552572
// Implements the parsing rules in the Fragments section.
553573

554574
/**
@@ -572,7 +592,7 @@ export class Parser {
572592
return this.node<FragmentSpreadNode>(start, {
573593
kind: Kind.FRAGMENT_SPREAD,
574594
name,
575-
arguments: this.parseArguments(false),
595+
arguments: this.parseFragmentArguments(),
576596
directives: this.parseDirectives(false),
577597
});
578598
}

src/language/printer.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ const printDocASTReducer: ASTReducer<string> = {
7676
},
7777
},
7878
Argument: { leave: ({ name, value }) => name + ': ' + value },
79+
FragmentArgument: { leave: ({ name, value }) => name + ': ' + value },
7980

8081
// Nullability Modifiers
8182

0 commit comments

Comments
 (0)