Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
b0ef95a
Initial plan
Copilot Jan 25, 2026
7235cf1
Add JSpecify annotations to 10 language classes
Copilot Jan 25, 2026
53e8423
Fix FragmentDefinition selectionSet to be nullable for validation tests
Copilot Jan 25, 2026
256724a
Make builder methods lenient to allow incomplete test instances
Copilot Jan 25, 2026
46c212c
Merge branch 'master' into copilot/add-jspecify-annotations-again
dondonz Feb 15, 2026
c0cab87
A selection set is not-nullable
dondonz Feb 15, 2026
75a9170
Add directive location
dondonz Feb 15, 2026
baa9a0e
Make name not nullable
dondonz Feb 15, 2026
1055f0c
Add more suggestions
dondonz Feb 15, 2026
2cd70a7
More improvements not nullable items according to spec
dondonz Feb 15, 2026
ea86f88
Add assert for compile check
dondonz Feb 15, 2026
6237b2d
Add nullunmarked on builders
dondonz Feb 15, 2026
fced94a
Fix more builders
dondonz Feb 15, 2026
97abdd1
Commit the fixing plan
dondonz Feb 15, 2026
d88fa6b
Fixing tests with new stricter non-nullable requirements
dondonz Feb 17, 2026
72ea92a
More test fixes
dondonz Feb 18, 2026
84f59fb
Merge branch 'master' into copilot/add-jspecify-annotations-again
dondonz Mar 21, 2026
346b85e
Remove already-annotated classes from JSpecify exemption list
dondonz Mar 21, 2026
dec1764
Remove no longer needed file
dondonz Mar 21, 2026
53a4a8a
Update test baseline for EnumValueDefinition coverage
dondonz Mar 21, 2026
4e425d7
Merge remote-tracking branch 'origin/master' into copilot/add-jspecif…
andimarek Apr 22, 2026
d9c44a3
Revert formatting-only changes
andimarek Apr 22, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 8 additions & 3 deletions src/main/java/graphql/language/DirectiveLocation.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@
import graphql.PublicApi;
import graphql.util.TraversalControl;
import graphql.util.TraverserContext;
import org.jspecify.annotations.NullMarked;
import org.jspecify.annotations.NullUnmarked;
import org.jspecify.annotations.Nullable;

import java.util.LinkedHashMap;
import java.util.List;
Expand All @@ -20,11 +23,12 @@
import static graphql.language.NodeUtil.assertNewChildrenAreEmpty;

@PublicApi
@NullMarked
public class DirectiveLocation extends AbstractNode<DirectiveLocation> implements NamedNode<DirectiveLocation> {
private final String name;

@Internal
protected DirectiveLocation(String name, SourceLocation sourceLocation, List<Comment> comments, IgnoredChars ignoredChars, Map<String, String> additionalData) {
protected DirectiveLocation(String name, @Nullable SourceLocation sourceLocation, List<Comment> comments, IgnoredChars ignoredChars, Map<String, String> additionalData) {
super(sourceLocation, comments, ignoredChars, additionalData);
this.name = name;
}
Expand Down Expand Up @@ -60,7 +64,7 @@ public DirectiveLocation withNewChildren(NodeChildrenContainer newChildren) {
}

@Override
public boolean isEqualTo(Node o) {
public boolean isEqualTo(@Nullable Node o) {
if (this == o) {
return true;
}
Expand Down Expand Up @@ -100,6 +104,7 @@ public DirectiveLocation transform(Consumer<Builder> builderConsumer) {
return builder.build();
}

@NullUnmarked
public static final class Builder implements NodeBuilder {
private SourceLocation sourceLocation;
private ImmutableList<Comment> comments = emptyList();
Expand Down Expand Up @@ -148,7 +153,7 @@ public Builder additionalData(String key, String value) {
}

public DirectiveLocation build() {
return new DirectiveLocation(name, sourceLocation, comments, ignoredChars, additionalData);
return new DirectiveLocation(assertNotNull(name), sourceLocation, comments, ignoredChars, additionalData);
}
}
}
2 changes: 2 additions & 0 deletions src/main/java/graphql/language/DirectivesContainer.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@


import graphql.PublicApi;
import org.jspecify.annotations.NullMarked;

import java.util.List;
import java.util.Map;
Expand All @@ -15,6 +16,7 @@
* @see DirectiveDefinition#isRepeatable()
*/
@PublicApi
@NullMarked
public interface DirectivesContainer<T extends DirectivesContainer> extends Node<T> {

/**
Expand Down
11 changes: 8 additions & 3 deletions src/main/java/graphql/language/Document.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,9 @@
import graphql.collect.ImmutableKit;
import graphql.util.TraversalControl;
import graphql.util.TraverserContext;
import org.jspecify.annotations.NullMarked;
import org.jspecify.annotations.NullUnmarked;
import org.jspecify.annotations.Nullable;

import java.util.LinkedHashMap;
import java.util.List;
Expand All @@ -21,14 +24,15 @@
import static graphql.language.NodeChildrenContainer.newNodeChildrenContainer;

@PublicApi
@NullMarked
public class Document extends AbstractNode<Document> {

private final ImmutableList<Definition> definitions;

public static final String CHILD_DEFINITIONS = "definitions";

@Internal
protected Document(List<Definition> definitions, SourceLocation sourceLocation, List<Comment> comments, IgnoredChars ignoredChars, Map<String, String> additionalData) {
protected Document(List<Definition> definitions, @Nullable SourceLocation sourceLocation, List<Comment> comments, IgnoredChars ignoredChars, Map<String, String> additionalData) {
super(sourceLocation, comments, ignoredChars, additionalData);
this.definitions = ImmutableList.copyOf(definitions);
}
Expand Down Expand Up @@ -114,7 +118,7 @@ public Document withNewChildren(NodeChildrenContainer newChildren) {
}

@Override
public boolean isEqualTo(Node o) {
public boolean isEqualTo(@Nullable Node o) {
if (this == o) {
return true;
}
Expand All @@ -127,7 +131,7 @@ public boolean isEqualTo(Node o) {

@Override
public Document deepCopy() {
return new Document(deepCopy(definitions), getSourceLocation(), getComments(), getIgnoredChars(), getAdditionalData());
return new Document(assertNotNull(deepCopy(definitions)), getSourceLocation(), getComments(), getIgnoredChars(), getAdditionalData());
}

@Override
Expand All @@ -152,6 +156,7 @@ public Document transform(Consumer<Builder> builderConsumer) {
return builder.build();
}

@NullUnmarked
public static final class Builder implements NodeBuilder {
private ImmutableList<Definition> definitions = emptyList();
private SourceLocation sourceLocation;
Expand Down
17 changes: 11 additions & 6 deletions src/main/java/graphql/language/EnumTypeDefinition.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@
import graphql.collect.ImmutableKit;
import graphql.util.TraversalControl;
import graphql.util.TraverserContext;
import org.jspecify.annotations.NullMarked;
import org.jspecify.annotations.NullUnmarked;
import org.jspecify.annotations.Nullable;

import java.util.ArrayList;
import java.util.LinkedHashMap;
Expand All @@ -20,6 +23,7 @@
import static graphql.language.NodeChildrenContainer.newNodeChildrenContainer;

@PublicApi
@NullMarked
public class EnumTypeDefinition extends AbstractDescribedNode<EnumTypeDefinition> implements TypeDefinition<EnumTypeDefinition>, DirectivesContainer<EnumTypeDefinition>, NamedNode<EnumTypeDefinition> {
private final String name;
private final ImmutableList<EnumValueDefinition> enumValueDefinitions;
Expand All @@ -32,8 +36,8 @@ public class EnumTypeDefinition extends AbstractDescribedNode<EnumTypeDefinition
protected EnumTypeDefinition(String name,
List<EnumValueDefinition> enumValueDefinitions,
List<Directive> directives,
Description description,
SourceLocation sourceLocation,
@Nullable Description description,
@Nullable SourceLocation sourceLocation,
List<Comment> comments,
IgnoredChars ignoredChars, Map<String, String> additionalData) {
super(sourceLocation, comments, ignoredChars, additionalData, description);
Expand Down Expand Up @@ -105,7 +109,7 @@ public EnumTypeDefinition withNewChildren(NodeChildrenContainer newChildren) {
}

@Override
public boolean isEqualTo(Node o) {
public boolean isEqualTo(@Nullable Node o) {
if (this == o) {
return true;
}
Expand All @@ -121,8 +125,8 @@ public boolean isEqualTo(Node o) {
@Override
public EnumTypeDefinition deepCopy() {
return new EnumTypeDefinition(name,
deepCopy(enumValueDefinitions),
deepCopy(directives.getDirectives()),
assertNotNull(deepCopy(enumValueDefinitions)),
assertNotNull(deepCopy(directives.getDirectives())),
description,
getSourceLocation(),
getComments(),
Expand Down Expand Up @@ -154,6 +158,7 @@ public EnumTypeDefinition transform(Consumer<Builder> builderConsumer) {
return builder.build();
}

@NullUnmarked
public static final class Builder implements NodeDirectivesBuilder {
private SourceLocation sourceLocation;
private ImmutableList<Comment> comments = emptyList();
Expand Down Expand Up @@ -236,7 +241,7 @@ public Builder additionalData(String key, String value) {


public EnumTypeDefinition build() {
return new EnumTypeDefinition(name, enumValueDefinitions, directives, description, sourceLocation, comments, ignoredChars, additionalData);
return new EnumTypeDefinition(assertNotNull(name), enumValueDefinitions, directives, description, sourceLocation, comments, ignoredChars, additionalData);
}
}
}
15 changes: 10 additions & 5 deletions src/main/java/graphql/language/EnumTypeExtensionDefinition.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,9 @@
import graphql.Internal;
import graphql.PublicApi;
import graphql.collect.ImmutableKit;
import org.jspecify.annotations.NullMarked;
import org.jspecify.annotations.NullUnmarked;
import org.jspecify.annotations.Nullable;

import java.util.LinkedHashMap;
import java.util.List;
Expand All @@ -14,14 +17,15 @@
import static graphql.collect.ImmutableKit.emptyList;

@PublicApi
@NullMarked
public class EnumTypeExtensionDefinition extends EnumTypeDefinition implements SDLExtensionDefinition {

@Internal
protected EnumTypeExtensionDefinition(String name,
List<EnumValueDefinition> enumValueDefinitions,
List<Directive> directives,
Description description,
SourceLocation sourceLocation,
@Nullable Description description,
@Nullable SourceLocation sourceLocation,
List<Comment> comments,
IgnoredChars ignoredChars,
Map<String, String> additionalData) {
Expand All @@ -32,8 +36,8 @@ protected EnumTypeExtensionDefinition(String name,
@Override
public EnumTypeExtensionDefinition deepCopy() {
return new EnumTypeExtensionDefinition(getName(),
deepCopy(getEnumValueDefinitions()),
deepCopy(getDirectives()),
assertNotNull(deepCopy(getEnumValueDefinitions())),
assertNotNull(deepCopy(getDirectives())),
getDescription(),
getSourceLocation(),
getComments(),
Expand Down Expand Up @@ -67,6 +71,7 @@ public EnumTypeExtensionDefinition transformExtension(Consumer<Builder> builderC
return builder.build();
}

@NullUnmarked
public static final class Builder implements NodeDirectivesBuilder {
private SourceLocation sourceLocation;
private ImmutableList<Comment> comments = emptyList();
Expand Down Expand Up @@ -144,7 +149,7 @@ public Builder additionalData(String key, String value) {


public EnumTypeExtensionDefinition build() {
return new EnumTypeExtensionDefinition(name,
return new EnumTypeExtensionDefinition(assertNotNull(name),
enumValueDefinitions,
directives,
description,
Expand Down
15 changes: 10 additions & 5 deletions src/main/java/graphql/language/EnumValueDefinition.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,9 @@
import graphql.collect.ImmutableKit;
import graphql.util.TraversalControl;
import graphql.util.TraverserContext;
import org.jspecify.annotations.NullMarked;
import org.jspecify.annotations.NullUnmarked;
import org.jspecify.annotations.Nullable;

import java.util.LinkedHashMap;
import java.util.List;
Expand All @@ -20,6 +23,7 @@
import static graphql.language.NodeChildrenContainer.newNodeChildrenContainer;

@PublicApi
@NullMarked
public class EnumValueDefinition extends AbstractDescribedNode<EnumValueDefinition> implements DirectivesContainer<EnumValueDefinition>, NamedNode<EnumValueDefinition> {
private final String name;
private final NodeUtil.DirectivesHolder directives;
Expand All @@ -29,8 +33,8 @@ public class EnumValueDefinition extends AbstractDescribedNode<EnumValueDefiniti
@Internal
protected EnumValueDefinition(String name,
List<Directive> directives,
Description description,
SourceLocation sourceLocation,
@Nullable Description description,
@Nullable SourceLocation sourceLocation,
List<Comment> comments,
IgnoredChars ignoredChars, Map<String, String> additionalData) {
super(sourceLocation, comments, ignoredChars, additionalData, description);
Expand Down Expand Up @@ -102,7 +106,7 @@ public EnumValueDefinition withNewChildren(NodeChildrenContainer newChildren) {
}

@Override
public boolean isEqualTo(Node o) {
public boolean isEqualTo(@Nullable Node o) {
if (this == o) {
return true;
}
Expand All @@ -118,7 +122,7 @@ public boolean isEqualTo(Node o) {

@Override
public EnumValueDefinition deepCopy() {
return new EnumValueDefinition(name, deepCopy(directives.getDirectives()), description, getSourceLocation(), getComments(), getIgnoredChars(), getAdditionalData());
return new EnumValueDefinition(name, assertNotNull(deepCopy(directives.getDirectives())), description, getSourceLocation(), getComments(), getIgnoredChars(), getAdditionalData());
}

@Override
Expand All @@ -144,6 +148,7 @@ public EnumValueDefinition transform(Consumer<Builder> builderConsumer) {
return builder.build();
}

@NullUnmarked
public static final class Builder implements NodeDirectivesBuilder {
private SourceLocation sourceLocation;
private ImmutableList<Comment> comments = emptyList();
Expand Down Expand Up @@ -214,7 +219,7 @@ public Builder additionalData(String key, String value) {


public EnumValueDefinition build() {
return new EnumValueDefinition(name, directives, description, sourceLocation, comments, ignoredChars, additionalData);
return new EnumValueDefinition(assertNotNull(name), directives, description, sourceLocation, comments, ignoredChars, additionalData);
}
}
}
Loading