Skip to content

Commit 1f09ab8

Browse files
add support for comments on fragments and variables (#66)
1 parent 6b1b212 commit 1f09ab8

File tree

2 files changed

+87
-6
lines changed

2 files changed

+87
-6
lines changed

src/GraphQLParser.Tests/ParserTests.cs

Lines changed: 76 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,81 @@ public class ParserTests
1212
{
1313
private static readonly string NL = Environment.NewLine;
1414

15+
[Fact]
16+
public void Comments_on_FragmentSpread_Should_Read_Correclty()
17+
{
18+
const string query = @"
19+
query _ {
20+
person {
21+
#comment
22+
...human
23+
}
24+
}
25+
26+
fragment human on person {
27+
name
28+
}";
29+
30+
var parser = new Parser(new Lexer());
31+
var document = parser.Parse(new Source(query));
32+
document.Definitions.Count().ShouldBe(2);
33+
var def = document.Definitions.First() as GraphQLOperationDefinition;
34+
def.SelectionSet.Selections.Count().ShouldBe(1);
35+
var field = def.SelectionSet.Selections.First() as GraphQLFieldSelection;
36+
field.SelectionSet.Selections.Count().ShouldBe(1);
37+
var fragment = field.SelectionSet.Selections.First() as GraphQLFragmentSpread;
38+
fragment.Comment.Text.ShouldBe("comment");
39+
}
40+
41+
[Fact]
42+
public void Comments_on_FragmentInline_Should_Read_Correclty()
43+
{
44+
const string query = @"
45+
query _ {
46+
person {
47+
#comment
48+
... on human {
49+
name
50+
}
51+
}
52+
}";
53+
54+
var parser = new Parser(new Lexer());
55+
var document = parser.Parse(new Source(query));
56+
document.Definitions.Count().ShouldBe(1);
57+
var def = document.Definitions.First() as GraphQLOperationDefinition;
58+
def.SelectionSet.Selections.Count().ShouldBe(1);
59+
var field = def.SelectionSet.Selections.First() as GraphQLFieldSelection;
60+
field.SelectionSet.Selections.Count().ShouldBe(1);
61+
var fragment = field.SelectionSet.Selections.First() as GraphQLInlineFragment;
62+
fragment.Comment.Text.ShouldBe("comment");
63+
}
64+
65+
[Fact]
66+
public void Comments_on_Variable_Should_Read_Correclty()
67+
{
68+
const string query = @"
69+
query _(
70+
#comment1
71+
$id: ID,
72+
$id2: String!,
73+
#comment3
74+
$id3: String) {
75+
person {
76+
name
77+
}
78+
}";
79+
80+
var parser = new Parser(new Lexer());
81+
var document = parser.Parse(new Source(query));
82+
document.Definitions.Count().ShouldBe(1);
83+
var def = document.Definitions.First() as GraphQLOperationDefinition;
84+
def.VariableDefinitions.Count().ShouldBe(3);
85+
def.VariableDefinitions.First().Comment.Text.ShouldBe("comment1");
86+
def.VariableDefinitions.Skip(1).First().Comment.ShouldBeNull();
87+
def.VariableDefinitions.Skip(2).First().Comment.Text.ShouldBe("comment3");
88+
}
89+
1590
[Fact]
1691
public void Comments_On_SelectionSet_Should_Read_Correctly()
1792
{
@@ -456,4 +531,4 @@ public void Should_Parse_Unions(string text)
456531
new Parser(new Lexer()).Parse(new Source(text)).ShouldNotBeNull();
457532
}
458533
}
459-
}
534+
}

src/GraphQLParser/ParserContext.cs

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -87,20 +87,22 @@ private GraphQLFieldSelection CreateFieldSelection(int start, GraphQLName name,
8787
};
8888
}
8989

90-
private ASTNode CreateGraphQLFragmentSpread(int start)
90+
private ASTNode CreateGraphQLFragmentSpread(int start, GraphQLComment? comment)
9191
{
9292
return new GraphQLFragmentSpread
9393
{
94+
Comment = comment,
9495
Name = ParseFragmentName(),
9596
Directives = ParseDirectives(),
9697
Location = GetLocation(start)
9798
};
9899
}
99100

100-
private ASTNode CreateInlineFragment(int start)
101+
private ASTNode CreateInlineFragment(int start, GraphQLComment? comment)
101102
{
102103
return new GraphQLInlineFragment
103104
{
105+
Comment = comment,
104106
TypeCondition = GetTypeCondition(),
105107
Directives = ParseDirectives(),
106108
SelectionSet = ParseSelectionSet(),
@@ -527,15 +529,16 @@ private GraphQLValue ParseFloat(bool isConstant)
527529

528530
private ASTNode ParseFragment()
529531
{
532+
var comment = GetComment();
530533
var start = currentToken.Start;
531534
Expect(TokenKind.SPREAD);
532535

533536
if (Peek(TokenKind.NAME) && !"on".Equals(currentToken.Value))
534537
{
535-
return CreateGraphQLFragmentSpread(start);
538+
return CreateGraphQLFragmentSpread(start, comment);
536539
}
537540

538-
return CreateInlineFragment(start);
541+
return CreateInlineFragment(start, comment);
539542
}
540543

541544
private GraphQLFragmentDefinition ParseFragmentDefinition()
@@ -1004,10 +1007,13 @@ private GraphQLVariable ParseVariable()
10041007
}
10051008

10061009
private GraphQLVariableDefinition ParseVariableDefinition()
1007-
{
1010+
{
1011+
var comment = GetComment();
10081012
int start = currentToken.Start;
1013+
10091014
return new GraphQLVariableDefinition
10101015
{
1016+
Comment = comment,
10111017
Variable = ParseVariable(),
10121018
Type = AdvanceThroughColonAndParseType(),
10131019
DefaultValue = SkipEqualsAndParseValueLiteral(),

0 commit comments

Comments
 (0)