X Tutup
Skip to content

Commit bbdceea

Browse files
dondonzclaude
andcommitted
Add JSpecify annotations to execution instrumentation classes
Annotates the following classes with @NullMarked and appropriate @nullable annotations: - DeferredExecution (label is @nullable per GraphQL spec) - ChainedInstrumentation (removes @nonnull, propagates @nullable from Instrumentation interface) - DocumentAndVariables (@NullUnmarked on Builder) - NoContextChainedInstrumentation (runAll returns @nullable T) - ResponseMapFactory (values are @nullable per Javadoc contract) - SimpleInstrumentation - SimpleInstrumentationContext (@nullable fields, params, onCompleted) - SimplePerformantInstrumentation (removes @nonnull on instrument* overrides) - FieldAndArguments (getParentFieldAndArguments @nullable, getArgumentValue @nullable T) - FieldValidationEnvironment Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent 9116159 commit bbdceea

File tree

11 files changed

+68
-63
lines changed

11 files changed

+68
-63
lines changed

src/main/java/graphql/execution/ResponseMapFactory.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
import graphql.ExperimentalApi;
44
import graphql.PublicSpi;
5+
import org.jspecify.annotations.NullMarked;
6+
import org.jspecify.annotations.Nullable;
57

68
import java.util.List;
79
import java.util.Map;
@@ -12,6 +14,7 @@
1214
*/
1315
@ExperimentalApi
1416
@PublicSpi
17+
@NullMarked
1518
public interface ResponseMapFactory {
1619

1720
/**
@@ -27,6 +30,6 @@ public interface ResponseMapFactory {
2730
* @param values the values like v1, v2, ..., vn
2831
* @return a new or reused map instance with (k1,v1), (k2, v2), ... (kn, vn)
2932
*/
30-
Map<String, Object> createInsertionOrdered(List<String> keys, List<Object> values);
33+
Map<String, @Nullable Object> createInsertionOrdered(List<String> keys, List<@Nullable Object> values);
3134

3235
}

src/main/java/graphql/execution/incremental/DeferredExecution.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import graphql.ExperimentalApi;
44
import graphql.normalized.incremental.NormalizedDeferredExecution;
5+
import org.jspecify.annotations.NullMarked;
56
import org.jspecify.annotations.Nullable;
67

78
/**
@@ -11,10 +12,11 @@
1112
* for the normalized representation of @defer.
1213
*/
1314
@ExperimentalApi
15+
@NullMarked
1416
public class DeferredExecution {
15-
private final String label;
17+
private final @Nullable String label;
1618

17-
public DeferredExecution(String label) {
19+
public DeferredExecution(@Nullable String label) {
1820
this.label = label;
1921
}
2022

src/main/java/graphql/execution/instrumentation/ChainedInstrumentation.java

Lines changed: 17 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
import graphql.schema.DataFetcher;
2323
import graphql.schema.GraphQLSchema;
2424
import graphql.validation.ValidationError;
25-
import org.jspecify.annotations.NonNull;
25+
import org.jspecify.annotations.NullMarked;
2626
import org.jspecify.annotations.Nullable;
2727

2828
import java.util.AbstractMap;
@@ -45,6 +45,7 @@
4545
* @see graphql.execution.instrumentation.Instrumentation
4646
*/
4747
@PublicApi
48+
@NullMarked
4849
public class ChainedInstrumentation implements Instrumentation {
4950

5051
// This class is inspired from https://github.com/leangen/graphql-spqr/blob/master/src/main/java/io/leangen/graphql/GraphQLRuntime.java#L80
@@ -113,29 +114,29 @@ protected void chainedConsume(InstrumentationState state, BiConsumer<Instrumenta
113114
}
114115

115116
@Override
116-
public @NonNull CompletableFuture<InstrumentationState> createStateAsync(InstrumentationCreateStateParameters parameters) {
117+
public CompletableFuture<InstrumentationState> createStateAsync(InstrumentationCreateStateParameters parameters) {
117118
return ChainedInstrumentationState.combineAll(instrumentations, parameters);
118119
}
119120

120121
@Override
121-
public InstrumentationContext<ExecutionResult> beginExecution(InstrumentationExecutionParameters parameters, InstrumentationState state) {
122+
public @Nullable InstrumentationContext<ExecutionResult> beginExecution(InstrumentationExecutionParameters parameters, InstrumentationState state) {
122123
return chainedCtx(state, (instrumentation, specificState) -> instrumentation.beginExecution(parameters, specificState));
123124
}
124125

125126

126127
@Override
127-
public InstrumentationContext<Document> beginParse(InstrumentationExecutionParameters parameters, InstrumentationState state) {
128+
public @Nullable InstrumentationContext<Document> beginParse(InstrumentationExecutionParameters parameters, InstrumentationState state) {
128129
return chainedCtx(state, (instrumentation, specificState) -> instrumentation.beginParse(parameters, specificState));
129130
}
130131

131132

132133
@Override
133-
public InstrumentationContext<List<ValidationError>> beginValidation(InstrumentationValidationParameters parameters, InstrumentationState state) {
134+
public @Nullable InstrumentationContext<List<ValidationError>> beginValidation(InstrumentationValidationParameters parameters, InstrumentationState state) {
134135
return chainedCtx(state, (instrumentation, specificState) -> instrumentation.beginValidation(parameters, specificState));
135136
}
136137

137138
@Override
138-
public InstrumentationContext<ExecutionResult> beginExecuteOperation(InstrumentationExecuteOperationParameters parameters, InstrumentationState state) {
139+
public @Nullable InstrumentationContext<ExecutionResult> beginExecuteOperation(InstrumentationExecuteOperationParameters parameters, InstrumentationState state) {
139140
return chainedCtx(state, (instrumentation, specificState) -> instrumentation.beginExecuteOperation(parameters, specificState));
140141
}
141142

@@ -145,7 +146,7 @@ public InstrumentationContext<ExecutionResult> beginExecuteOperation(Instrumenta
145146
}
146147

147148
@Override
148-
public ExecutionStrategyInstrumentationContext beginExecutionStrategy(InstrumentationExecutionStrategyParameters parameters, InstrumentationState state) {
149+
public @Nullable ExecutionStrategyInstrumentationContext beginExecutionStrategy(InstrumentationExecutionStrategyParameters parameters, InstrumentationState state) {
149150
if (instrumentations.isEmpty()) {
150151
return ExecutionStrategyInstrumentationContext.NOOP;
151152
}
@@ -172,12 +173,12 @@ public ExecutionStrategyInstrumentationContext beginExecutionStrategy(Instrument
172173

173174
@ExperimentalApi
174175
@Override
175-
public InstrumentationContext<Object> beginDeferredField(InstrumentationFieldParameters parameters, InstrumentationState state) {
176+
public @Nullable InstrumentationContext<Object> beginDeferredField(InstrumentationFieldParameters parameters, InstrumentationState state) {
176177
return chainedCtx(state, (instrumentation, specificState) -> instrumentation.beginDeferredField(parameters, specificState));
177178
}
178179

179180
@Override
180-
public InstrumentationContext<ExecutionResult> beginSubscribedFieldEvent(InstrumentationFieldParameters parameters, InstrumentationState state) {
181+
public @Nullable InstrumentationContext<ExecutionResult> beginSubscribedFieldEvent(InstrumentationFieldParameters parameters, InstrumentationState state) {
181182
return chainedCtx(state, (instrumentation, specificState) -> instrumentation.beginSubscribedFieldEvent(parameters, specificState));
182183
}
183184

@@ -188,12 +189,12 @@ public InstrumentationContext<ExecutionResult> beginSubscribedFieldEvent(Instrum
188189

189190
@SuppressWarnings("deprecation")
190191
@Override
191-
public InstrumentationContext<Object> beginFieldFetch(InstrumentationFieldFetchParameters parameters, InstrumentationState state) {
192+
public @Nullable InstrumentationContext<Object> beginFieldFetch(InstrumentationFieldFetchParameters parameters, InstrumentationState state) {
192193
return chainedCtx(state, (instrumentation, specificState) -> instrumentation.beginFieldFetch(parameters, specificState));
193194
}
194195

195196
@Override
196-
public FieldFetchingInstrumentationContext beginFieldFetching(InstrumentationFieldFetchParameters parameters, InstrumentationState state) {
197+
public @Nullable FieldFetchingInstrumentationContext beginFieldFetching(InstrumentationFieldFetchParameters parameters, InstrumentationState state) {
197198
if (instrumentations.isEmpty()) {
198199
return FieldFetchingInstrumentationContext.NOOP;
199200
}
@@ -217,41 +218,35 @@ public FieldFetchingInstrumentationContext beginFieldFetching(InstrumentationFie
217218
return chainedCtx(state, (instrumentation, specificState) -> instrumentation.beginFieldListCompletion(parameters, specificState));
218219
}
219220

220-
@NonNull
221221
@Override
222222
public ExecutionInput instrumentExecutionInput(ExecutionInput executionInput, InstrumentationExecutionParameters parameters, InstrumentationState state) {
223223
return chainedInstrument(state, executionInput, (instrumentation, specificState, accumulator) -> instrumentation.instrumentExecutionInput(accumulator, parameters, specificState));
224224
}
225225

226-
@NonNull
227226
@Override
228227
public DocumentAndVariables instrumentDocumentAndVariables(DocumentAndVariables documentAndVariables, InstrumentationExecutionParameters parameters, InstrumentationState state) {
229228
return chainedInstrument(state, documentAndVariables, (instrumentation, specificState, accumulator) ->
230229
instrumentation.instrumentDocumentAndVariables(accumulator, parameters, specificState));
231230
}
232231

233-
@NonNull
234232
@Override
235233
public GraphQLSchema instrumentSchema(GraphQLSchema schema, InstrumentationExecutionParameters parameters, InstrumentationState state) {
236234
return chainedInstrument(state, schema, (instrumentation, specificState, accumulator) ->
237235
instrumentation.instrumentSchema(accumulator, parameters, specificState));
238236
}
239237

240-
@NonNull
241238
@Override
242239
public ExecutionContext instrumentExecutionContext(ExecutionContext executionContext, InstrumentationExecutionParameters parameters, InstrumentationState state) {
243240
return chainedInstrument(state, executionContext, (instrumentation, specificState, accumulator) ->
244241
instrumentation.instrumentExecutionContext(accumulator, parameters, specificState));
245242
}
246243

247-
@NonNull
248244
@Override
249245
public DataFetcher<?> instrumentDataFetcher(DataFetcher<?> dataFetcher, InstrumentationFieldFetchParameters parameters, InstrumentationState state) {
250246
return chainedInstrument(state, dataFetcher, (Instrumentation instrumentation, InstrumentationState specificState, DataFetcher<?> accumulator) ->
251247
instrumentation.instrumentDataFetcher(accumulator, parameters, specificState));
252248
}
253249

254-
@NonNull
255250
@Override
256251
public CompletableFuture<ExecutionResult> instrumentExecutionResult(ExecutionResult executionResult, InstrumentationExecutionParameters parameters, InstrumentationState state) {
257252
ImmutableList<Map.Entry<Instrumentation, InstrumentationState>> entries = chainedMapAndDropNulls(state, AbstractMap.SimpleEntry::new);
@@ -300,7 +295,7 @@ public void onDispatched() {
300295
}
301296

302297
@Override
303-
public void onCompleted(T result, Throwable t) {
298+
public void onCompleted(@Nullable T result, @Nullable Throwable t) {
304299
contexts.forEach(context -> context.onCompleted(result, t));
305300
}
306301
}
@@ -319,7 +314,7 @@ public void onDispatched() {
319314
}
320315

321316
@Override
322-
public void onCompleted(ExecutionResult result, Throwable t) {
317+
public void onCompleted(@Nullable ExecutionResult result, @Nullable Throwable t) {
323318
contexts.forEach(context -> context.onCompleted(result, t));
324319
}
325320

@@ -348,7 +343,7 @@ public void onDispatched() {
348343
}
349344

350345
@Override
351-
public void onCompleted(Map<String, Object> result, Throwable t) {
346+
public void onCompleted(@Nullable Map<String, Object> result, @Nullable Throwable t) {
352347
contexts.forEach(context -> context.onCompleted(result, t));
353348
}
354349

@@ -387,7 +382,7 @@ public void onExceptionHandled(DataFetcherResult<Object> dataFetcherResult) {
387382
}
388383

389384
@Override
390-
public void onCompleted(Object result, Throwable t) {
385+
public void onCompleted(@Nullable Object result, @Nullable Throwable t) {
391386
contexts.forEach(context -> context.onCompleted(result, t));
392387
}
393388
}
@@ -407,7 +402,7 @@ public void onDispatched() {
407402
}
408403

409404
@Override
410-
public void onCompleted(Object result, Throwable t) {
405+
public void onCompleted(@Nullable Object result, @Nullable Throwable t) {
411406
contexts.forEach(context -> context.onCompleted(result, t));
412407
}
413408
}

src/main/java/graphql/execution/instrumentation/DocumentAndVariables.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,16 @@
33
import graphql.PublicApi;
44
import graphql.collect.ImmutableMapWithNullValues;
55
import graphql.language.Document;
6+
import org.jspecify.annotations.NullMarked;
7+
import org.jspecify.annotations.NullUnmarked;
68

79
import java.util.Map;
810
import java.util.function.Consumer;
911

1012
import static graphql.Assert.assertNotNull;
1113

1214
@PublicApi
15+
@NullMarked
1316
public class DocumentAndVariables {
1417
private final Document document;
1518
private final ImmutableMapWithNullValues<String, Object> variables;
@@ -37,6 +40,7 @@ public static Builder newDocumentAndVariables() {
3740
return new Builder();
3841
}
3942

43+
@NullUnmarked
4044
public static class Builder {
4145
private Document document;
4246
private Map<String, Object> variables;

src/main/java/graphql/execution/instrumentation/NoContextChainedInstrumentation.java

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import graphql.execution.instrumentation.parameters.InstrumentationValidationParameters;
1313
import graphql.language.Document;
1414
import graphql.validation.ValidationError;
15+
import org.jspecify.annotations.NullMarked;
1516
import org.jspecify.annotations.Nullable;
1617

1718
import java.util.List;
@@ -39,6 +40,7 @@
3940
* as itself.
4041
*/
4142
@PublicApi
43+
@NullMarked
4244
public class NoContextChainedInstrumentation extends ChainedInstrumentation {
4345

4446
public NoContextChainedInstrumentation(List<Instrumentation> instrumentations) {
@@ -49,28 +51,28 @@ public NoContextChainedInstrumentation(Instrumentation... instrumentations) {
4951
super(instrumentations);
5052
}
5153

52-
private <T> T runAll(InstrumentationState state, BiConsumer<Instrumentation, InstrumentationState> stateConsumer) {
54+
private <T> @Nullable T runAll(InstrumentationState state, BiConsumer<Instrumentation, InstrumentationState> stateConsumer) {
5355
chainedConsume(state, stateConsumer);
5456
return null;
5557
}
5658

5759
@Override
58-
public InstrumentationContext<ExecutionResult> beginExecution(InstrumentationExecutionParameters parameters, InstrumentationState state) {
60+
public @Nullable InstrumentationContext<ExecutionResult> beginExecution(InstrumentationExecutionParameters parameters, InstrumentationState state) {
5961
return runAll(state, (instrumentation, specificState) -> instrumentation.beginExecution(parameters, specificState));
6062
}
6163

6264
@Override
63-
public InstrumentationContext<Document> beginParse(InstrumentationExecutionParameters parameters, InstrumentationState state) {
65+
public @Nullable InstrumentationContext<Document> beginParse(InstrumentationExecutionParameters parameters, InstrumentationState state) {
6466
return runAll(state, (instrumentation, specificState) -> instrumentation.beginParse(parameters, specificState));
6567
}
6668

6769
@Override
68-
public InstrumentationContext<List<ValidationError>> beginValidation(InstrumentationValidationParameters parameters, InstrumentationState state) {
70+
public @Nullable InstrumentationContext<List<ValidationError>> beginValidation(InstrumentationValidationParameters parameters, InstrumentationState state) {
6971
return runAll(state, (instrumentation, specificState) -> instrumentation.beginValidation(parameters, specificState));
7072
}
7173

7274
@Override
73-
public InstrumentationContext<ExecutionResult> beginExecuteOperation(InstrumentationExecuteOperationParameters parameters, InstrumentationState state) {
75+
public @Nullable InstrumentationContext<ExecutionResult> beginExecuteOperation(InstrumentationExecuteOperationParameters parameters, InstrumentationState state) {
7476
return runAll(state, (instrumentation, specificState) -> instrumentation.beginExecuteOperation(parameters, specificState));
7577
}
7678

@@ -80,7 +82,7 @@ public InstrumentationContext<ExecutionResult> beginExecuteOperation(Instrumenta
8082
}
8183

8284
@Override
83-
public ExecutionStrategyInstrumentationContext beginExecutionStrategy(InstrumentationExecutionStrategyParameters parameters, InstrumentationState state) {
85+
public @Nullable ExecutionStrategyInstrumentationContext beginExecutionStrategy(InstrumentationExecutionStrategyParameters parameters, InstrumentationState state) {
8486
return runAll(state, (instrumentation, specificState) -> instrumentation.beginExecutionStrategy(parameters, specificState));
8587
}
8688

@@ -90,12 +92,12 @@ public ExecutionStrategyInstrumentationContext beginExecutionStrategy(Instrument
9092
}
9193

9294
@Override
93-
public InstrumentationContext<Object> beginDeferredField(InstrumentationFieldParameters parameters, InstrumentationState state) {
95+
public @Nullable InstrumentationContext<Object> beginDeferredField(InstrumentationFieldParameters parameters, InstrumentationState state) {
9496
return runAll(state, (instrumentation, specificState) -> instrumentation.beginDeferredField(parameters, specificState));
9597
}
9698

9799
@Override
98-
public InstrumentationContext<ExecutionResult> beginSubscribedFieldEvent(InstrumentationFieldParameters parameters, InstrumentationState state) {
100+
public @Nullable InstrumentationContext<ExecutionResult> beginSubscribedFieldEvent(InstrumentationFieldParameters parameters, InstrumentationState state) {
99101
return runAll(state, (instrumentation, specificState) -> instrumentation.beginSubscribedFieldEvent(parameters, specificState));
100102
}
101103

@@ -105,12 +107,12 @@ public InstrumentationContext<ExecutionResult> beginSubscribedFieldEvent(Instrum
105107
}
106108

107109
@Override
108-
public InstrumentationContext<Object> beginFieldFetch(InstrumentationFieldFetchParameters parameters, InstrumentationState state) {
110+
public @Nullable InstrumentationContext<Object> beginFieldFetch(InstrumentationFieldFetchParameters parameters, InstrumentationState state) {
109111
return runAll(state, (instrumentation, specificState) -> instrumentation.beginFieldFetch(parameters, specificState));
110112
}
111113

112114
@Override
113-
public FieldFetchingInstrumentationContext beginFieldFetching(InstrumentationFieldFetchParameters parameters, InstrumentationState state) {
115+
public @Nullable FieldFetchingInstrumentationContext beginFieldFetching(InstrumentationFieldFetchParameters parameters, InstrumentationState state) {
114116
return runAll(state, (instrumentation, specificState) -> instrumentation.beginFieldFetching(parameters, specificState));
115117
}
116118

src/main/java/graphql/execution/instrumentation/SimpleInstrumentation.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package graphql.execution.instrumentation;
22

33
import graphql.PublicApi;
4+
import org.jspecify.annotations.NullMarked;
45

56
/**
67
* An implementation of {@link graphql.execution.instrumentation.Instrumentation} that does nothing. It can be used
@@ -11,6 +12,7 @@
1112
* @deprecated use {@link SimplePerformantInstrumentation} instead as a base class.
1213
*/
1314
@PublicApi
15+
@NullMarked
1416
@Deprecated(since = "2022-10-05")
1517
public class SimpleInstrumentation implements Instrumentation {
1618

0 commit comments

Comments
 (0)
X Tutup