diff --git a/src/GraphQLParser.Tests/ParserTests.cs b/src/GraphQLParser.Tests/ParserTests.cs index c0543ef7..18afd3d6 100644 --- a/src/GraphQLParser.Tests/ParserTests.cs +++ b/src/GraphQLParser.Tests/ParserTests.cs @@ -12,6 +12,81 @@ public class ParserTests { private static readonly string NL = Environment.NewLine; + [Fact] + public void Comments_on_FragmentSpread_Should_Read_Correclty() + { + const string query = @" +query _ { + person { + #comment + ...human + } +} + +fragment human on person { + name +}"; + + var parser = new Parser(new Lexer()); + var document = parser.Parse(new Source(query)); + document.Definitions.Count().ShouldBe(2); + var def = document.Definitions.First() as GraphQLOperationDefinition; + def.SelectionSet.Selections.Count().ShouldBe(1); + var field = def.SelectionSet.Selections.First() as GraphQLFieldSelection; + field.SelectionSet.Selections.Count().ShouldBe(1); + var fragment = field.SelectionSet.Selections.First() as GraphQLFragmentSpread; + fragment.Comment.Text.ShouldBe("comment"); + } + + [Fact] + public void Comments_on_FragmentInline_Should_Read_Correclty() + { + const string query = @" +query _ { + person { + #comment + ... on human { + name + } + } +}"; + + var parser = new Parser(new Lexer()); + var document = parser.Parse(new Source(query)); + document.Definitions.Count().ShouldBe(1); + var def = document.Definitions.First() as GraphQLOperationDefinition; + def.SelectionSet.Selections.Count().ShouldBe(1); + var field = def.SelectionSet.Selections.First() as GraphQLFieldSelection; + field.SelectionSet.Selections.Count().ShouldBe(1); + var fragment = field.SelectionSet.Selections.First() as GraphQLInlineFragment; + fragment.Comment.Text.ShouldBe("comment"); + } + + [Fact] + public void Comments_on_Variable_Should_Read_Correclty() + { + const string query = @" +query _( + #comment1 + $id: ID, + $id2: String!, + #comment3 + $id3: String) { + person { + name + } +}"; + + var parser = new Parser(new Lexer()); + var document = parser.Parse(new Source(query)); + document.Definitions.Count().ShouldBe(1); + var def = document.Definitions.First() as GraphQLOperationDefinition; + def.VariableDefinitions.Count().ShouldBe(3); + def.VariableDefinitions.First().Comment.Text.ShouldBe("comment1"); + def.VariableDefinitions.Skip(1).First().Comment.ShouldBeNull(); + def.VariableDefinitions.Skip(2).First().Comment.Text.ShouldBe("comment3"); + } + [Fact] public void Comments_On_SelectionSet_Should_Read_Correctly() { @@ -456,4 +531,4 @@ public void Should_Parse_Unions(string text) new Parser(new Lexer()).Parse(new Source(text)).ShouldNotBeNull(); } } -} \ No newline at end of file +} diff --git a/src/GraphQLParser/ParserContext.cs b/src/GraphQLParser/ParserContext.cs index 9b503f40..00583b1a 100644 --- a/src/GraphQLParser/ParserContext.cs +++ b/src/GraphQLParser/ParserContext.cs @@ -87,20 +87,22 @@ private GraphQLFieldSelection CreateFieldSelection(int start, GraphQLName name, }; } - private ASTNode CreateGraphQLFragmentSpread(int start) + private ASTNode CreateGraphQLFragmentSpread(int start, GraphQLComment? comment) { return new GraphQLFragmentSpread { + Comment = comment, Name = ParseFragmentName(), Directives = ParseDirectives(), Location = GetLocation(start) }; } - private ASTNode CreateInlineFragment(int start) + private ASTNode CreateInlineFragment(int start, GraphQLComment? comment) { return new GraphQLInlineFragment { + Comment = comment, TypeCondition = GetTypeCondition(), Directives = ParseDirectives(), SelectionSet = ParseSelectionSet(), @@ -527,15 +529,16 @@ private GraphQLValue ParseFloat(bool isConstant) private ASTNode ParseFragment() { + var comment = GetComment(); var start = currentToken.Start; Expect(TokenKind.SPREAD); if (Peek(TokenKind.NAME) && !"on".Equals(currentToken.Value)) { - return CreateGraphQLFragmentSpread(start); + return CreateGraphQLFragmentSpread(start, comment); } - return CreateInlineFragment(start); + return CreateInlineFragment(start, comment); } private GraphQLFragmentDefinition ParseFragmentDefinition() @@ -1004,10 +1007,13 @@ private GraphQLVariable ParseVariable() } private GraphQLVariableDefinition ParseVariableDefinition() - { + { + var comment = GetComment(); int start = currentToken.Start; + return new GraphQLVariableDefinition { + Comment = comment, Variable = ParseVariable(), Type = AdvanceThroughColonAndParseType(), DefaultValue = SkipEqualsAndParseValueLiteral(),