diff --git a/src/main/java/graphql/execution/ResponseMapFactory.java b/src/main/java/graphql/execution/ResponseMapFactory.java index 01a37d8491..2a7cd52bd1 100644 --- a/src/main/java/graphql/execution/ResponseMapFactory.java +++ b/src/main/java/graphql/execution/ResponseMapFactory.java @@ -2,6 +2,8 @@ import graphql.ExperimentalApi; import graphql.PublicSpi; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; import java.util.List; import java.util.Map; @@ -12,6 +14,7 @@ */ @ExperimentalApi @PublicSpi +@NullMarked public interface ResponseMapFactory { /** @@ -27,6 +30,6 @@ public interface ResponseMapFactory { * @param values the values like v1, v2, ..., vn * @return a new or reused map instance with (k1,v1), (k2, v2), ... (kn, vn) */ - Map createInsertionOrdered(List keys, List values); + Map createInsertionOrdered(List keys, List<@Nullable Object> values); } diff --git a/src/main/java/graphql/execution/incremental/DeferredExecution.java b/src/main/java/graphql/execution/incremental/DeferredExecution.java index ae63808989..b24ddc92b0 100644 --- a/src/main/java/graphql/execution/incremental/DeferredExecution.java +++ b/src/main/java/graphql/execution/incremental/DeferredExecution.java @@ -2,6 +2,7 @@ import graphql.ExperimentalApi; import graphql.normalized.incremental.NormalizedDeferredExecution; +import org.jspecify.annotations.NullMarked; import org.jspecify.annotations.Nullable; /** @@ -11,10 +12,11 @@ * for the normalized representation of @defer. */ @ExperimentalApi +@NullMarked public class DeferredExecution { - private final String label; + private final @Nullable String label; - public DeferredExecution(String label) { + public DeferredExecution(@Nullable String label) { this.label = label; } diff --git a/src/main/java/graphql/execution/instrumentation/ChainedInstrumentation.java b/src/main/java/graphql/execution/instrumentation/ChainedInstrumentation.java index 4ae65742bf..ebf2758e37 100644 --- a/src/main/java/graphql/execution/instrumentation/ChainedInstrumentation.java +++ b/src/main/java/graphql/execution/instrumentation/ChainedInstrumentation.java @@ -22,7 +22,7 @@ import graphql.schema.DataFetcher; import graphql.schema.GraphQLSchema; import graphql.validation.ValidationError; -import org.jspecify.annotations.NonNull; +import org.jspecify.annotations.NullMarked; import org.jspecify.annotations.Nullable; import java.util.AbstractMap; @@ -45,6 +45,7 @@ * @see graphql.execution.instrumentation.Instrumentation */ @PublicApi +@NullMarked public class ChainedInstrumentation implements Instrumentation { // This class is inspired from https://github.com/leangen/graphql-spqr/blob/master/src/main/java/io/leangen/graphql/GraphQLRuntime.java#L80 @@ -66,7 +67,7 @@ public List getInstrumentations() { return instrumentations; } - private InstrumentationContext chainedCtx(InstrumentationState state, BiFunction> mapper) { + private @Nullable InstrumentationContext chainedCtx(InstrumentationState state, BiFunction> mapper) { // if we have zero or 1 instrumentations (and 1 is the most common), then we can avoid an object allocation // of the ChainedInstrumentationContext since it won't be needed if (instrumentations.isEmpty()) { @@ -113,29 +114,29 @@ protected void chainedConsume(InstrumentationState state, BiConsumer createStateAsync(InstrumentationCreateStateParameters parameters) { + public CompletableFuture createStateAsync(InstrumentationCreateStateParameters parameters) { return ChainedInstrumentationState.combineAll(instrumentations, parameters); } @Override - public InstrumentationContext beginExecution(InstrumentationExecutionParameters parameters, InstrumentationState state) { + public @Nullable InstrumentationContext beginExecution(InstrumentationExecutionParameters parameters, InstrumentationState state) { return chainedCtx(state, (instrumentation, specificState) -> instrumentation.beginExecution(parameters, specificState)); } @Override - public InstrumentationContext beginParse(InstrumentationExecutionParameters parameters, InstrumentationState state) { + public @Nullable InstrumentationContext beginParse(InstrumentationExecutionParameters parameters, InstrumentationState state) { return chainedCtx(state, (instrumentation, specificState) -> instrumentation.beginParse(parameters, specificState)); } @Override - public InstrumentationContext> beginValidation(InstrumentationValidationParameters parameters, InstrumentationState state) { + public @Nullable InstrumentationContext> beginValidation(InstrumentationValidationParameters parameters, InstrumentationState state) { return chainedCtx(state, (instrumentation, specificState) -> instrumentation.beginValidation(parameters, specificState)); } @Override - public InstrumentationContext beginExecuteOperation(InstrumentationExecuteOperationParameters parameters, InstrumentationState state) { + public @Nullable InstrumentationContext beginExecuteOperation(InstrumentationExecuteOperationParameters parameters, InstrumentationState state) { return chainedCtx(state, (instrumentation, specificState) -> instrumentation.beginExecuteOperation(parameters, specificState)); } @@ -145,7 +146,7 @@ public InstrumentationContext beginExecuteOperation(Instrumenta } @Override - public ExecutionStrategyInstrumentationContext beginExecutionStrategy(InstrumentationExecutionStrategyParameters parameters, InstrumentationState state) { + public @Nullable ExecutionStrategyInstrumentationContext beginExecutionStrategy(InstrumentationExecutionStrategyParameters parameters, InstrumentationState state) { if (instrumentations.isEmpty()) { return ExecutionStrategyInstrumentationContext.NOOP; } @@ -172,12 +173,12 @@ public ExecutionStrategyInstrumentationContext beginExecutionStrategy(Instrument @ExperimentalApi @Override - public InstrumentationContext beginDeferredField(InstrumentationFieldParameters parameters, InstrumentationState state) { + public @Nullable InstrumentationContext beginDeferredField(InstrumentationFieldParameters parameters, InstrumentationState state) { return chainedCtx(state, (instrumentation, specificState) -> instrumentation.beginDeferredField(parameters, specificState)); } @Override - public InstrumentationContext beginSubscribedFieldEvent(InstrumentationFieldParameters parameters, InstrumentationState state) { + public @Nullable InstrumentationContext beginSubscribedFieldEvent(InstrumentationFieldParameters parameters, InstrumentationState state) { return chainedCtx(state, (instrumentation, specificState) -> instrumentation.beginSubscribedFieldEvent(parameters, specificState)); } @@ -188,12 +189,12 @@ public InstrumentationContext beginSubscribedFieldEvent(Instrum @SuppressWarnings("deprecation") @Override - public InstrumentationContext beginFieldFetch(InstrumentationFieldFetchParameters parameters, InstrumentationState state) { + public @Nullable InstrumentationContext beginFieldFetch(InstrumentationFieldFetchParameters parameters, InstrumentationState state) { return chainedCtx(state, (instrumentation, specificState) -> instrumentation.beginFieldFetch(parameters, specificState)); } @Override - public FieldFetchingInstrumentationContext beginFieldFetching(InstrumentationFieldFetchParameters parameters, InstrumentationState state) { + public @Nullable FieldFetchingInstrumentationContext beginFieldFetching(InstrumentationFieldFetchParameters parameters, InstrumentationState state) { if (instrumentations.isEmpty()) { return FieldFetchingInstrumentationContext.NOOP; } @@ -217,41 +218,35 @@ public FieldFetchingInstrumentationContext beginFieldFetching(InstrumentationFie return chainedCtx(state, (instrumentation, specificState) -> instrumentation.beginFieldListCompletion(parameters, specificState)); } - @NonNull @Override public ExecutionInput instrumentExecutionInput(ExecutionInput executionInput, InstrumentationExecutionParameters parameters, InstrumentationState state) { return chainedInstrument(state, executionInput, (instrumentation, specificState, accumulator) -> instrumentation.instrumentExecutionInput(accumulator, parameters, specificState)); } - @NonNull @Override public DocumentAndVariables instrumentDocumentAndVariables(DocumentAndVariables documentAndVariables, InstrumentationExecutionParameters parameters, InstrumentationState state) { return chainedInstrument(state, documentAndVariables, (instrumentation, specificState, accumulator) -> instrumentation.instrumentDocumentAndVariables(accumulator, parameters, specificState)); } - @NonNull @Override public GraphQLSchema instrumentSchema(GraphQLSchema schema, InstrumentationExecutionParameters parameters, InstrumentationState state) { return chainedInstrument(state, schema, (instrumentation, specificState, accumulator) -> instrumentation.instrumentSchema(accumulator, parameters, specificState)); } - @NonNull @Override public ExecutionContext instrumentExecutionContext(ExecutionContext executionContext, InstrumentationExecutionParameters parameters, InstrumentationState state) { return chainedInstrument(state, executionContext, (instrumentation, specificState, accumulator) -> instrumentation.instrumentExecutionContext(accumulator, parameters, specificState)); } - @NonNull @Override public DataFetcher instrumentDataFetcher(DataFetcher dataFetcher, InstrumentationFieldFetchParameters parameters, InstrumentationState state) { return chainedInstrument(state, dataFetcher, (Instrumentation instrumentation, InstrumentationState specificState, DataFetcher accumulator) -> instrumentation.instrumentDataFetcher(accumulator, parameters, specificState)); } - @NonNull @Override public CompletableFuture instrumentExecutionResult(ExecutionResult executionResult, InstrumentationExecutionParameters parameters, InstrumentationState state) { ImmutableList> entries = chainedMapAndDropNulls(state, AbstractMap.SimpleEntry::new); @@ -300,7 +295,7 @@ public void onDispatched() { } @Override - public void onCompleted(T result, Throwable t) { + public void onCompleted(@Nullable T result, @Nullable Throwable t) { contexts.forEach(context -> context.onCompleted(result, t)); } } @@ -319,7 +314,7 @@ public void onDispatched() { } @Override - public void onCompleted(ExecutionResult result, Throwable t) { + public void onCompleted(@Nullable ExecutionResult result, @Nullable Throwable t) { contexts.forEach(context -> context.onCompleted(result, t)); } @@ -348,7 +343,7 @@ public void onDispatched() { } @Override - public void onCompleted(Map result, Throwable t) { + public void onCompleted(@Nullable Map result, @Nullable Throwable t) { contexts.forEach(context -> context.onCompleted(result, t)); } @@ -387,7 +382,7 @@ public void onExceptionHandled(DataFetcherResult dataFetcherResult) { } @Override - public void onCompleted(Object result, Throwable t) { + public void onCompleted(@Nullable Object result, @Nullable Throwable t) { contexts.forEach(context -> context.onCompleted(result, t)); } } @@ -407,7 +402,7 @@ public void onDispatched() { } @Override - public void onCompleted(Object result, Throwable t) { + public void onCompleted(@Nullable Object result, @Nullable Throwable t) { contexts.forEach(context -> context.onCompleted(result, t)); } } diff --git a/src/main/java/graphql/execution/instrumentation/DocumentAndVariables.java b/src/main/java/graphql/execution/instrumentation/DocumentAndVariables.java index 7b5c4c4978..7d7a43117d 100644 --- a/src/main/java/graphql/execution/instrumentation/DocumentAndVariables.java +++ b/src/main/java/graphql/execution/instrumentation/DocumentAndVariables.java @@ -3,6 +3,8 @@ import graphql.PublicApi; import graphql.collect.ImmutableMapWithNullValues; import graphql.language.Document; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.NullUnmarked; import java.util.Map; import java.util.function.Consumer; @@ -10,6 +12,7 @@ import static graphql.Assert.assertNotNull; @PublicApi +@NullMarked public class DocumentAndVariables { private final Document document; private final ImmutableMapWithNullValues variables; @@ -37,6 +40,7 @@ public static Builder newDocumentAndVariables() { return new Builder(); } + @NullUnmarked public static class Builder { private Document document; private Map variables; diff --git a/src/main/java/graphql/execution/instrumentation/Instrumentation.java b/src/main/java/graphql/execution/instrumentation/Instrumentation.java index 565c4333da..2bfb6eadcf 100644 --- a/src/main/java/graphql/execution/instrumentation/Instrumentation.java +++ b/src/main/java/graphql/execution/instrumentation/Instrumentation.java @@ -175,6 +175,7 @@ default ExecuteObjectInstrumentationContext beginExecuteObject(InstrumentationEx * @return a nullable {@link InstrumentationContext} object that will be called back when the step ends (assuming it's not null) */ @ExperimentalApi + @Nullable default InstrumentationContext beginDeferredField(InstrumentationFieldParameters parameters, InstrumentationState state) { return noOp(); } diff --git a/src/main/java/graphql/execution/instrumentation/NoContextChainedInstrumentation.java b/src/main/java/graphql/execution/instrumentation/NoContextChainedInstrumentation.java index 8d56230825..719376819a 100644 --- a/src/main/java/graphql/execution/instrumentation/NoContextChainedInstrumentation.java +++ b/src/main/java/graphql/execution/instrumentation/NoContextChainedInstrumentation.java @@ -12,6 +12,7 @@ import graphql.execution.instrumentation.parameters.InstrumentationValidationParameters; import graphql.language.Document; import graphql.validation.ValidationError; +import org.jspecify.annotations.NullMarked; import org.jspecify.annotations.Nullable; import java.util.List; @@ -39,6 +40,7 @@ * as itself. */ @PublicApi +@NullMarked public class NoContextChainedInstrumentation extends ChainedInstrumentation { public NoContextChainedInstrumentation(List instrumentations) { @@ -49,28 +51,28 @@ public NoContextChainedInstrumentation(Instrumentation... instrumentations) { super(instrumentations); } - private T runAll(InstrumentationState state, BiConsumer stateConsumer) { + private @Nullable T runAll(InstrumentationState state, BiConsumer stateConsumer) { chainedConsume(state, stateConsumer); return null; } @Override - public InstrumentationContext beginExecution(InstrumentationExecutionParameters parameters, InstrumentationState state) { + public @Nullable InstrumentationContext beginExecution(InstrumentationExecutionParameters parameters, InstrumentationState state) { return runAll(state, (instrumentation, specificState) -> instrumentation.beginExecution(parameters, specificState)); } @Override - public InstrumentationContext beginParse(InstrumentationExecutionParameters parameters, InstrumentationState state) { + public @Nullable InstrumentationContext beginParse(InstrumentationExecutionParameters parameters, InstrumentationState state) { return runAll(state, (instrumentation, specificState) -> instrumentation.beginParse(parameters, specificState)); } @Override - public InstrumentationContext> beginValidation(InstrumentationValidationParameters parameters, InstrumentationState state) { + public @Nullable InstrumentationContext> beginValidation(InstrumentationValidationParameters parameters, InstrumentationState state) { return runAll(state, (instrumentation, specificState) -> instrumentation.beginValidation(parameters, specificState)); } @Override - public InstrumentationContext beginExecuteOperation(InstrumentationExecuteOperationParameters parameters, InstrumentationState state) { + public @Nullable InstrumentationContext beginExecuteOperation(InstrumentationExecuteOperationParameters parameters, InstrumentationState state) { return runAll(state, (instrumentation, specificState) -> instrumentation.beginExecuteOperation(parameters, specificState)); } @@ -80,7 +82,7 @@ public InstrumentationContext beginExecuteOperation(Instrumenta } @Override - public ExecutionStrategyInstrumentationContext beginExecutionStrategy(InstrumentationExecutionStrategyParameters parameters, InstrumentationState state) { + public @Nullable ExecutionStrategyInstrumentationContext beginExecutionStrategy(InstrumentationExecutionStrategyParameters parameters, InstrumentationState state) { return runAll(state, (instrumentation, specificState) -> instrumentation.beginExecutionStrategy(parameters, specificState)); } @@ -90,12 +92,12 @@ public ExecutionStrategyInstrumentationContext beginExecutionStrategy(Instrument } @Override - public InstrumentationContext beginDeferredField(InstrumentationFieldParameters parameters, InstrumentationState state) { + public @Nullable InstrumentationContext beginDeferredField(InstrumentationFieldParameters parameters, InstrumentationState state) { return runAll(state, (instrumentation, specificState) -> instrumentation.beginDeferredField(parameters, specificState)); } @Override - public InstrumentationContext beginSubscribedFieldEvent(InstrumentationFieldParameters parameters, InstrumentationState state) { + public @Nullable InstrumentationContext beginSubscribedFieldEvent(InstrumentationFieldParameters parameters, InstrumentationState state) { return runAll(state, (instrumentation, specificState) -> instrumentation.beginSubscribedFieldEvent(parameters, specificState)); } @@ -105,12 +107,12 @@ public InstrumentationContext beginSubscribedFieldEvent(Instrum } @Override - public InstrumentationContext beginFieldFetch(InstrumentationFieldFetchParameters parameters, InstrumentationState state) { + public @Nullable InstrumentationContext beginFieldFetch(InstrumentationFieldFetchParameters parameters, InstrumentationState state) { return runAll(state, (instrumentation, specificState) -> instrumentation.beginFieldFetch(parameters, specificState)); } @Override - public FieldFetchingInstrumentationContext beginFieldFetching(InstrumentationFieldFetchParameters parameters, InstrumentationState state) { + public @Nullable FieldFetchingInstrumentationContext beginFieldFetching(InstrumentationFieldFetchParameters parameters, InstrumentationState state) { return runAll(state, (instrumentation, specificState) -> instrumentation.beginFieldFetching(parameters, specificState)); } diff --git a/src/main/java/graphql/execution/instrumentation/SimpleInstrumentation.java b/src/main/java/graphql/execution/instrumentation/SimpleInstrumentation.java index d2df536e75..9f9c2d272e 100644 --- a/src/main/java/graphql/execution/instrumentation/SimpleInstrumentation.java +++ b/src/main/java/graphql/execution/instrumentation/SimpleInstrumentation.java @@ -1,6 +1,7 @@ package graphql.execution.instrumentation; import graphql.PublicApi; +import org.jspecify.annotations.NullMarked; /** * An implementation of {@link graphql.execution.instrumentation.Instrumentation} that does nothing. It can be used @@ -11,6 +12,7 @@ * @deprecated use {@link SimplePerformantInstrumentation} instead as a base class. */ @PublicApi +@NullMarked @Deprecated(since = "2022-10-05") public class SimpleInstrumentation implements Instrumentation { diff --git a/src/main/java/graphql/execution/instrumentation/SimpleInstrumentationContext.java b/src/main/java/graphql/execution/instrumentation/SimpleInstrumentationContext.java index 0abfc744d6..1a3d240c65 100644 --- a/src/main/java/graphql/execution/instrumentation/SimpleInstrumentationContext.java +++ b/src/main/java/graphql/execution/instrumentation/SimpleInstrumentationContext.java @@ -1,7 +1,8 @@ package graphql.execution.instrumentation; import graphql.PublicApi; -import org.jspecify.annotations.NonNull; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; import java.util.function.BiConsumer; @@ -9,6 +10,7 @@ * A simple implementation of {@link InstrumentationContext} */ @PublicApi +@NullMarked public class SimpleInstrumentationContext implements InstrumentationContext { private static final InstrumentationContext NO_OP = new InstrumentationContext() { @@ -17,7 +19,7 @@ public void onDispatched() { } @Override - public void onCompleted(Object result, Throwable t) { + public void onCompleted(@Nullable Object result, @Nullable Throwable t) { } }; @@ -41,19 +43,18 @@ public static InstrumentationContext noOp() { * * @return a non null {@link InstrumentationContext} that maybe a no-op */ - @NonNull - public static InstrumentationContext nonNullCtx(InstrumentationContext nullableContext) { + public static InstrumentationContext nonNullCtx(@Nullable InstrumentationContext nullableContext) { return nullableContext == null ? noOp() : nullableContext; } - private final BiConsumer codeToRunOnComplete; - private final Runnable codeToRunOnDispatch; + private final @Nullable BiConsumer codeToRunOnComplete; + private final @Nullable Runnable codeToRunOnDispatch; public SimpleInstrumentationContext() { this(null, null); } - private SimpleInstrumentationContext(Runnable codeToRunOnDispatch, BiConsumer codeToRunOnComplete) { + private SimpleInstrumentationContext(@Nullable Runnable codeToRunOnDispatch, @Nullable BiConsumer codeToRunOnComplete) { this.codeToRunOnComplete = codeToRunOnComplete; this.codeToRunOnDispatch = codeToRunOnDispatch; } @@ -66,7 +67,7 @@ public void onDispatched() { } @Override - public void onCompleted(T result, Throwable t) { + public void onCompleted(@Nullable T result, @Nullable Throwable t) { if (codeToRunOnComplete != null) { codeToRunOnComplete.accept(result, t); } @@ -99,7 +100,7 @@ public static SimpleInstrumentationContext whenCompleted(BiConsumer BiConsumer completeInstrumentationCtxCF( - InstrumentationContext instrumentationContext) { + @Nullable InstrumentationContext instrumentationContext) { return (result, throwable) -> { nonNullCtx(instrumentationContext).onCompleted(result, throwable); }; diff --git a/src/main/java/graphql/execution/instrumentation/SimplePerformantInstrumentation.java b/src/main/java/graphql/execution/instrumentation/SimplePerformantInstrumentation.java index 26f30714fa..a2cb05b592 100644 --- a/src/main/java/graphql/execution/instrumentation/SimplePerformantInstrumentation.java +++ b/src/main/java/graphql/execution/instrumentation/SimplePerformantInstrumentation.java @@ -16,7 +16,7 @@ import graphql.schema.DataFetcher; import graphql.schema.GraphQLSchema; import graphql.validation.ValidationError; -import org.jspecify.annotations.NonNull; +import org.jspecify.annotations.NullMarked; import org.jspecify.annotations.Nullable; import java.util.List; @@ -38,6 +38,7 @@ */ @SuppressWarnings("deprecation") @PublicApi +@NullMarked public class SimplePerformantInstrumentation implements Instrumentation { /** @@ -112,32 +113,32 @@ public class SimplePerformantInstrumentation implements Instrumentation { } @Override - public @NonNull ExecutionInput instrumentExecutionInput(ExecutionInput executionInput, InstrumentationExecutionParameters parameters, InstrumentationState state) { + public ExecutionInput instrumentExecutionInput(ExecutionInput executionInput, InstrumentationExecutionParameters parameters, InstrumentationState state) { return executionInput; } @Override - public @NonNull DocumentAndVariables instrumentDocumentAndVariables(DocumentAndVariables documentAndVariables, InstrumentationExecutionParameters parameters, InstrumentationState state) { + public DocumentAndVariables instrumentDocumentAndVariables(DocumentAndVariables documentAndVariables, InstrumentationExecutionParameters parameters, InstrumentationState state) { return documentAndVariables; } @Override - public @NonNull GraphQLSchema instrumentSchema(GraphQLSchema schema, InstrumentationExecutionParameters parameters, InstrumentationState state) { + public GraphQLSchema instrumentSchema(GraphQLSchema schema, InstrumentationExecutionParameters parameters, InstrumentationState state) { return schema; } @Override - public @NonNull ExecutionContext instrumentExecutionContext(ExecutionContext executionContext, InstrumentationExecutionParameters parameters, InstrumentationState state) { + public ExecutionContext instrumentExecutionContext(ExecutionContext executionContext, InstrumentationExecutionParameters parameters, InstrumentationState state) { return executionContext; } @Override - public @NonNull DataFetcher instrumentDataFetcher(DataFetcher dataFetcher, InstrumentationFieldFetchParameters parameters, InstrumentationState state) { + public DataFetcher instrumentDataFetcher(DataFetcher dataFetcher, InstrumentationFieldFetchParameters parameters, InstrumentationState state) { return dataFetcher; } @Override - public @NonNull CompletableFuture instrumentExecutionResult(ExecutionResult executionResult, InstrumentationExecutionParameters parameters, InstrumentationState state) { + public CompletableFuture instrumentExecutionResult(ExecutionResult executionResult, InstrumentationExecutionParameters parameters, InstrumentationState state) { return CompletableFuture.completedFuture(executionResult); } } diff --git a/src/main/java/graphql/execution/instrumentation/fieldvalidation/FieldAndArguments.java b/src/main/java/graphql/execution/instrumentation/fieldvalidation/FieldAndArguments.java index 3ad6bc3e9c..9a0e2dfa4c 100644 --- a/src/main/java/graphql/execution/instrumentation/fieldvalidation/FieldAndArguments.java +++ b/src/main/java/graphql/execution/instrumentation/fieldvalidation/FieldAndArguments.java @@ -5,6 +5,8 @@ import graphql.language.Field; import graphql.schema.GraphQLCompositeType; import graphql.schema.GraphQLFieldDefinition; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; import java.util.Map; @@ -12,6 +14,7 @@ * This represents a field and its arguments that may be validated. */ @PublicApi +@NullMarked public interface FieldAndArguments { /** @@ -32,7 +35,7 @@ public interface FieldAndArguments { /** * @return the parent arguments or null if there is no parent */ - FieldAndArguments getParentFieldAndArguments(); + @Nullable FieldAndArguments getParentFieldAndArguments(); /** * @return the path to this field @@ -56,5 +59,5 @@ public interface FieldAndArguments { * @return a cast object of type T */ @SuppressWarnings("TypeParameterUnusedInFormals") - T getArgumentValue(String argumentName); + @Nullable T getArgumentValue(String argumentName); } diff --git a/src/main/java/graphql/execution/instrumentation/fieldvalidation/FieldValidationEnvironment.java b/src/main/java/graphql/execution/instrumentation/fieldvalidation/FieldValidationEnvironment.java index 047c3e7831..467e96610e 100644 --- a/src/main/java/graphql/execution/instrumentation/fieldvalidation/FieldValidationEnvironment.java +++ b/src/main/java/graphql/execution/instrumentation/fieldvalidation/FieldValidationEnvironment.java @@ -4,6 +4,7 @@ import graphql.PublicApi; import graphql.execution.ExecutionContext; import graphql.execution.ResultPath; +import org.jspecify.annotations.NullMarked; import java.util.List; import java.util.Map; @@ -21,6 +22,7 @@ * @see FieldAndArguments */ @PublicApi +@NullMarked public interface FieldValidationEnvironment { /** diff --git a/src/test/groovy/graphql/archunit/JSpecifyAnnotationsCheck.groovy b/src/test/groovy/graphql/archunit/JSpecifyAnnotationsCheck.groovy index 1b6cdafa61..26eaf56493 100644 --- a/src/test/groovy/graphql/archunit/JSpecifyAnnotationsCheck.groovy +++ b/src/test/groovy/graphql/archunit/JSpecifyAnnotationsCheck.groovy @@ -58,16 +58,6 @@ class JSpecifyAnnotationsCheck extends Specification { "graphql.execution.directives.QueryAppliedDirective", "graphql.execution.directives.QueryAppliedDirectiveArgument", "graphql.execution.directives.QueryDirectives", - "graphql.execution.incremental.DeferredExecution", - "graphql.execution.instrumentation.ChainedInstrumentation", - "graphql.execution.instrumentation.DocumentAndVariables", - "graphql.execution.instrumentation.NoContextChainedInstrumentation", - "graphql.execution.ResponseMapFactory", - "graphql.execution.instrumentation.SimpleInstrumentation", - "graphql.execution.instrumentation.SimpleInstrumentationContext", - "graphql.execution.instrumentation.SimplePerformantInstrumentation", - "graphql.execution.instrumentation.fieldvalidation.FieldAndArguments", - "graphql.execution.instrumentation.fieldvalidation.FieldValidationEnvironment", "graphql.execution.instrumentation.fieldvalidation.FieldValidationInstrumentation", "graphql.execution.instrumentation.fieldvalidation.SimpleFieldValidation", "graphql.execution.instrumentation.parameters.InstrumentationCreateStateParameters",