Skip to content

Commit ee3179c

Browse files
authored
Fix NRE when printing directive without locations (#300)
1 parent b05f365 commit ee3179c

File tree

2 files changed

+59
-12
lines changed

2 files changed

+59
-12
lines changed

src/GraphQLParser.Tests/Visitors/SDLPrinterTests.cs

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -823,6 +823,46 @@ public void UTF8_MemoryStream_Runs_Synchronously()
823823
printer.PrintAsync(document, writer).IsCompletedSuccessfully.ShouldBeTrue();
824824
}
825825

826+
[Theory]
827+
[InlineData(true)]
828+
[InlineData(false)]
829+
public void Printer_Should_Print_DirectiveDefinition_Without_Locations(bool eachDirectiveLocationOnNewLine)
830+
{
831+
var printer = new SDLPrinter(new SDLPrinterOptions
832+
{
833+
EachDirectiveLocationOnNewLine = eachDirectiveLocationOnNewLine,
834+
});
835+
var document = new GraphQLDocument
836+
{
837+
Definitions = new List<ASTNode>
838+
{
839+
new GraphQLDirectiveDefinition
840+
{
841+
Name = new GraphQLName("null_locations"),
842+
Locations = new GraphQLDirectiveLocations() // Items is null
843+
},
844+
new GraphQLDirectiveDefinition
845+
{
846+
Name = new GraphQLName("empty_locations"),
847+
Locations = new GraphQLDirectiveLocations() { Items = new List<DirectiveLocation>() } // Items is empty
848+
},
849+
new GraphQLScalarTypeDefinition
850+
{
851+
Name = new GraphQLName("AAA")
852+
}
853+
}
854+
};
855+
856+
var actual = printer.Print(document);
857+
actual.ShouldBe("""
858+
directive @null_locations on
859+
860+
directive @empty_locations on
861+
862+
scalar AAA
863+
""");
864+
}
865+
826866
[Theory]
827867
[InlineData("query a { name }")]
828868
[InlineData("directive @skip(if: Boolean!) on FIELD | FRAGMENT_SPREAD | INLINE_FRAGMENT")]

src/GraphQLParser/Visitors/SDLPrinter.cs

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -372,24 +372,31 @@ protected override async ValueTask VisitDirectiveLocationsAsync(GraphQLDirective
372372
if (Options.EachDirectiveLocationOnNewLine)
373373
{
374374
await context.WriteAsync(" on").ConfigureAwait(false);
375-
await context.WriteLineAsync().ConfigureAwait(false);
376-
for (int i = 0; i < directiveLocations.Items.Count; ++i)
375+
if (directiveLocations.Items?.Count > 0) // should always be true but may be negligently uninitialized
377376
{
378-
await WriteIndentAsync(context).ConfigureAwait(false);
379-
await context.WriteAsync("| ").ConfigureAwait(false);
380-
await context.WriteAsync(GetDirectiveLocation(directiveLocations.Items[i])).ConfigureAwait(false);
381-
if (i < directiveLocations.Items.Count - 1)
382-
await context.WriteLineAsync().ConfigureAwait(false);
377+
await context.WriteLineAsync().ConfigureAwait(false);
378+
for (int i = 0; i < directiveLocations.Items.Count; ++i)
379+
{
380+
await WriteIndentAsync(context).ConfigureAwait(false);
381+
await context.WriteAsync("| ").ConfigureAwait(false);
382+
await context.WriteAsync(GetDirectiveLocation(directiveLocations.Items[i])).ConfigureAwait(false);
383+
if (i < directiveLocations.Items.Count - 1)
384+
await context.WriteLineAsync().ConfigureAwait(false);
385+
}
383386
}
384387
}
385388
else
386389
{
387-
await context.WriteAsync(" on ").ConfigureAwait(false);
388-
for (int i = 0; i < directiveLocations.Items.Count; ++i)
390+
await context.WriteAsync(" on").ConfigureAwait(false);
391+
if (directiveLocations.Items?.Count > 0) // should always be true but may be negligently uninitialized
389392
{
390-
await context.WriteAsync(GetDirectiveLocation(directiveLocations.Items[i])).ConfigureAwait(false);
391-
if (i < directiveLocations.Items.Count - 1)
392-
await context.WriteAsync(" | ").ConfigureAwait(false);
393+
await context.WriteAsync(" ").ConfigureAwait(false);
394+
for (int i = 0; i < directiveLocations.Items.Count; ++i)
395+
{
396+
await context.WriteAsync(GetDirectiveLocation(directiveLocations.Items[i])).ConfigureAwait(false);
397+
if (i < directiveLocations.Items.Count - 1)
398+
await context.WriteAsync(" | ").ConfigureAwait(false);
399+
}
393400
}
394401
}
395402
}

0 commit comments

Comments
 (0)