From 658eb35a1ea61102afe011b0cbe623b6e91fcbf6 Mon Sep 17 00:00:00 2001 From: Nicole Lee Date: Tue, 14 Jul 2026 14:13:31 +0000 Subject: [PATCH 1/4] feat: add JSpecify Null annotations to generator classes --- .../generator/engine/ast/AnnotationNode.java | 4 ++- .../generator/engine/ast/ClassDefinition.java | 4 ++- .../engine/ast/ConcreteReference.java | 4 ++- .../generator/engine/ast/JavaDocComment.java | 13 +++++---- .../engine/ast/MethodDefinition.java | 4 ++- .../engine/ast/MethodInvocationExpr.java | 4 ++- .../api/generator/engine/ast/Reference.java | 10 +++---- .../api/generator/engine/ast/ThrowExpr.java | 4 ++- .../engine/ast/TryCatchStatement.java | 8 +++--- .../api/generator/engine/ast/TypeNode.java | 4 ++- .../generator/engine/ast/VaporReference.java | 4 ++- .../generator/engine/ast/VariableExpr.java | 4 ++- .../engine/writer/ImportWriterVisitor.java | 10 ++++--- .../ClientLibraryPackageInfoComposer.java | 5 +++- .../generator/gapic/composer/Composer.java | 5 +++- ...tractServiceStubSettingsClassComposer.java | 4 +-- ...ractTransportServiceStubClassComposer.java | 10 +++---- .../composer/common/TransportContext.java | 4 ++- .../defaultvalue/DefaultValueComposer.java | 5 +++- .../grpc/MockServiceImplClassComposer.java | 5 +++- .../api/generator/gapic/model/Field.java | 4 ++- .../gapic/model/GapicBatchingSettings.java | 4 ++- .../generator/gapic/model/GapicContext.java | 7 ++--- .../generator/gapic/model/HttpBindings.java | 4 ++- .../gapic/model/LongrunningOperation.java | 4 ++- .../api/generator/gapic/model/Message.java | 4 ++- .../api/generator/gapic/model/Method.java | 4 ++- .../generator/gapic/model/ResourceName.java | 4 ++- .../api/generator/gapic/model/Service.java | 16 +++++------ .../gapic/model/SourceCodeInfoLocation.java | 8 +++--- .../gapic/protoparser/HttpRuleParser.java | 7 +++-- .../generator/gapic/protoparser/Parser.java | 5 +++- .../gapic/protoparser/ResourceNameParser.java | 5 +++- .../protoparser/ResourceReferenceParser.java | 4 ++- .../gapic/protoparser/RoutingRuleParser.java | 5 +++- .../protoparser/SourceCodeInfoParser.java | 27 ++++++++----------- .../gapic/protoparser/TypeParser.java | 14 +++++----- .../generator/gapic/protowriter/Writer.java | 7 +++-- .../com/google/api/generator/util/Trie.java | 7 +++-- .../BatchingDescriptorComposerTest.java | 5 +++- .../common/RetrySettingsComposerTest.java | 5 +++- .../gapic/model/GapicServiceConfigTest.java | 5 +++- .../protoparser/SourceCodeInfoParserTest.java | 5 +++- 43 files changed, 179 insertions(+), 96 deletions(-) diff --git a/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/engine/ast/AnnotationNode.java b/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/engine/ast/AnnotationNode.java index 7cb0f5ec37fa..514849603cea 100644 --- a/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/engine/ast/AnnotationNode.java +++ b/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/engine/ast/AnnotationNode.java @@ -19,8 +19,10 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import javax.annotation.Nullable; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; +@NullMarked @AutoValue public abstract class AnnotationNode implements AstNode { public static AnnotationNode OVERRIDE = diff --git a/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/engine/ast/ClassDefinition.java b/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/engine/ast/ClassDefinition.java index 1e09e39f4089..4697f284e6ef 100644 --- a/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/engine/ast/ClassDefinition.java +++ b/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/engine/ast/ClassDefinition.java @@ -21,8 +21,10 @@ import java.util.Arrays; import java.util.Collections; import java.util.List; -import javax.annotation.Nullable; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; +@NullMarked @AutoValue public abstract class ClassDefinition implements AstNode { // Optional. diff --git a/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/engine/ast/ConcreteReference.java b/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/engine/ast/ConcreteReference.java index 48288ab817a1..8693d3bd6d7c 100644 --- a/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/engine/ast/ConcreteReference.java +++ b/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/engine/ast/ConcreteReference.java @@ -19,8 +19,10 @@ import java.util.Arrays; import java.util.List; import java.util.Objects; -import javax.annotation.Nullable; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; +@NullMarked @AutoValue public abstract class ConcreteReference implements Reference { private static final String EXTENDS = "extends"; diff --git a/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/engine/ast/JavaDocComment.java b/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/engine/ast/JavaDocComment.java index 7184044598c2..a5873499ecd9 100644 --- a/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/engine/ast/JavaDocComment.java +++ b/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/engine/ast/JavaDocComment.java @@ -23,7 +23,10 @@ import java.util.List; import java.util.stream.Collectors; import java.util.stream.Stream; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; +@NullMarked @AutoValue public abstract class JavaDocComment implements Comment { @Override @@ -48,11 +51,11 @@ public abstract static class Builder { static final String PARAM_INDENT = " "; // The lack of a getter for these local variables in the external class is WAI. - String throwsType = null; - String throwsDescription = null; - String deprecated = null; - String internalOnly = null; - String returnDescription = null; + @Nullable String throwsType = null; + @Nullable String throwsDescription = null; + @Nullable String deprecated = null; + @Nullable String internalOnly = null; + @Nullable String returnDescription = null; List paramsList = new ArrayList<>(); List componentsList = new ArrayList<>(); diff --git a/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/engine/ast/MethodDefinition.java b/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/engine/ast/MethodDefinition.java index 6bd3bca9c532..1e6bbcd961e6 100644 --- a/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/engine/ast/MethodDefinition.java +++ b/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/engine/ast/MethodDefinition.java @@ -23,8 +23,10 @@ import java.util.List; import java.util.Set; import java.util.stream.Collectors; -import javax.annotation.Nullable; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; +@NullMarked @AutoValue public abstract class MethodDefinition implements AstNode { static final Reference RUNTIME_EXCEPTION_REFERENCE = diff --git a/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/engine/ast/MethodInvocationExpr.java b/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/engine/ast/MethodInvocationExpr.java index 2a0c2a45c48f..e40856a48707 100644 --- a/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/engine/ast/MethodInvocationExpr.java +++ b/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/engine/ast/MethodInvocationExpr.java @@ -19,8 +19,10 @@ import java.util.Arrays; import java.util.Collections; import java.util.List; -import javax.annotation.Nullable; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; +@NullMarked @AutoValue public abstract class MethodInvocationExpr implements Expr { public abstract IdentifierNode methodIdentifier(); diff --git a/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/engine/ast/Reference.java b/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/engine/ast/Reference.java index 4dce11783f49..c08dce549659 100644 --- a/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/engine/ast/Reference.java +++ b/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/engine/ast/Reference.java @@ -16,8 +16,10 @@ import com.google.common.collect.ImmutableList; import java.util.List; -import javax.annotation.Nullable; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; +@NullMarked public interface Reference extends AstNode { @Override void accept(AstNodeVisitor visitor); @@ -38,11 +40,9 @@ public interface Reference extends AstNode { // The nested types in left-to-right order, if any. // Example: com.google.Foo.Bar.Car.ThisType will have the outer types listed in the order // [Foo, Bar, Car]. - @Nullable - ImmutableList enclosingClassNames(); + @Nullable ImmutableList enclosingClassNames(); - @Nullable - Reference wildcardUpperBound(); + @Nullable Reference wildcardUpperBound(); Reference copyAndSetGenerics(List generics); diff --git a/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/engine/ast/ThrowExpr.java b/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/engine/ast/ThrowExpr.java index 5e4808d28aa9..1b5400ce2cf2 100644 --- a/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/engine/ast/ThrowExpr.java +++ b/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/engine/ast/ThrowExpr.java @@ -16,8 +16,10 @@ import com.google.auto.value.AutoValue; import com.google.common.base.Preconditions; -import javax.annotation.Nullable; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; +@NullMarked @AutoValue public abstract class ThrowExpr implements Expr { // TODO(miraleung): Refactor with StringObjectValue and possibly with NewObjectExpr. diff --git a/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/engine/ast/TryCatchStatement.java b/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/engine/ast/TryCatchStatement.java index 77cd964aed49..5f10084569a2 100644 --- a/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/engine/ast/TryCatchStatement.java +++ b/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/engine/ast/TryCatchStatement.java @@ -20,9 +20,11 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; +import org.jspecify.annotations.NonNull; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; +@NullMarked @AutoValue public abstract class TryCatchStatement implements Statement { @@ -61,7 +63,7 @@ public abstract static class Builder { public abstract Builder setIsSampleCode(boolean isSampleCode); - public Builder addCatch(@Nonnull VariableExpr variableExpr, List body) { + public Builder addCatch(@NonNull VariableExpr variableExpr, List body) { List catchVarExprs = new ArrayList<>(catchVariableExprs()); catchVarExprs.add(variableExpr); setCatchVariableExprs(catchVarExprs); diff --git a/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/engine/ast/TypeNode.java b/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/engine/ast/TypeNode.java index 12236842fccd..0b7698a8936e 100644 --- a/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/engine/ast/TypeNode.java +++ b/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/engine/ast/TypeNode.java @@ -21,8 +21,10 @@ import java.util.HashMap; import java.util.Map; import java.util.Objects; -import javax.annotation.Nullable; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; +@NullMarked @AutoValue public abstract class TypeNode implements AstNode, Comparable { static final Reference EXCEPTION_REFERENCE = ConcreteReference.withClazz(Exception.class); diff --git a/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/engine/ast/VaporReference.java b/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/engine/ast/VaporReference.java index 8c0cc858fa89..ebe69bdf5673 100644 --- a/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/engine/ast/VaporReference.java +++ b/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/engine/ast/VaporReference.java @@ -20,8 +20,10 @@ import java.util.Collections; import java.util.List; import java.util.Objects; -import javax.annotation.Nullable; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; +@NullMarked @AutoValue public abstract class VaporReference implements Reference { private static final String DOT = "."; diff --git a/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/engine/ast/VariableExpr.java b/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/engine/ast/VariableExpr.java index f882c97e8d3b..5abc82fe3226 100644 --- a/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/engine/ast/VariableExpr.java +++ b/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/engine/ast/VariableExpr.java @@ -22,8 +22,10 @@ import java.util.LinkedHashSet; import java.util.List; import java.util.stream.Collectors; -import javax.annotation.Nullable; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; +@NullMarked @AutoValue public abstract class VariableExpr implements Expr { public abstract Variable variable(); diff --git a/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/engine/writer/ImportWriterVisitor.java b/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/engine/writer/ImportWriterVisitor.java index e19e168c3eb5..e2caef207f37 100644 --- a/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/engine/writer/ImportWriterVisitor.java +++ b/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/engine/writer/ImportWriterVisitor.java @@ -69,9 +69,11 @@ import java.util.Set; import java.util.TreeSet; import java.util.stream.Collectors; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; +import org.jspecify.annotations.NonNull; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; +@NullMarked public class ImportWriterVisitor implements AstNodeVisitor { private static final String DOT = "."; private static final String PKG_JAVA_LANG = "java.lang"; @@ -91,12 +93,12 @@ public void clear() { importShortNames.clear(); } - public void initialize(@Nonnull String currentPackage) { + public void initialize(@NonNull String currentPackage) { this.currentPackage = currentPackage; currentClassName = null; } - public void initialize(@Nonnull String currentPackage, @Nonnull String currentClassName) { + public void initialize(@NonNull String currentPackage, @NonNull String currentClassName) { this.currentPackage = currentPackage; this.currentClassName = currentClassName; } diff --git a/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/ClientLibraryPackageInfoComposer.java b/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/ClientLibraryPackageInfoComposer.java index 5bd24bdbd0f0..ff5abc234842 100644 --- a/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/ClientLibraryPackageInfoComposer.java +++ b/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/ClientLibraryPackageInfoComposer.java @@ -32,7 +32,10 @@ import com.google.common.base.Strings; import java.util.logging.Logger; import javax.annotation.Generated; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; +@NullMarked public class ClientLibraryPackageInfoComposer { private static final Logger LOGGER = @@ -47,7 +50,7 @@ public class ClientLibraryPackageInfoComposer { private static final String SAMPLE_CODE_HEADER_PATTERN = "Sample for %s:"; private static final String SERVICE_DESCRIPTION_HEADER_PATTERN = "Service Description: %s"; - public static GapicPackageInfo generatePackageInfo(GapicContext context) { + public static @Nullable GapicPackageInfo generatePackageInfo(GapicContext context) { if (!context.containsServices()) { LOGGER.warning("Generating empty package info since no services were found"); return null; diff --git a/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/Composer.java b/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/Composer.java index 288b02e713f0..edb180676c82 100644 --- a/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/Composer.java +++ b/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/Composer.java @@ -43,7 +43,10 @@ import java.util.Collections; import java.util.List; import java.util.stream.Collectors; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; +@NullMarked public class Composer { public static List composeServiceClasses(GapicContext context) { List clazzes = new ArrayList<>(); @@ -53,7 +56,7 @@ public static List composeServiceClasses(GapicContext context) { return addApacheLicense(prepareExecutableSamples(clazzes)); } - public static GapicPackageInfo composePackageInfo(GapicContext context) { + public static @Nullable GapicPackageInfo composePackageInfo(GapicContext context) { if (!context.containsServices()) { return null; } diff --git a/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/common/AbstractServiceStubSettingsClassComposer.java b/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/common/AbstractServiceStubSettingsClassComposer.java index 9a0c1337b115..3c10b885764f 100644 --- a/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/common/AbstractServiceStubSettingsClassComposer.java +++ b/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/common/AbstractServiceStubSettingsClassComposer.java @@ -123,8 +123,8 @@ import java.util.function.Function; import java.util.stream.Collectors; import javax.annotation.Generated; -import javax.annotation.Nullable; import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; public abstract class AbstractServiceStubSettingsClassComposer implements ClassComposer { private static final Statement EMPTY_LINE_STATEMENT = EmptyLineStatement.create(); @@ -1889,7 +1889,7 @@ protected MethodDefinition createNestedClassCreateDefaultMethod( TypeStore typeStore, String methodName, String defaultTransportChannelProvider, - String defaultTransportChannelProviderBuilder, + @Nullable String defaultTransportChannelProviderBuilder, String defaultApiClientHeaderProviderBuilder) { List bodyStatements = new ArrayList<>(); diff --git a/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/common/AbstractTransportServiceStubClassComposer.java b/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/common/AbstractTransportServiceStubClassComposer.java index 6cdf49e38d4c..b3f45f38d301 100644 --- a/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/common/AbstractTransportServiceStubClassComposer.java +++ b/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/common/AbstractTransportServiceStubClassComposer.java @@ -99,8 +99,8 @@ import java.util.regex.Pattern; import java.util.stream.Collectors; import javax.annotation.Generated; -import javax.annotation.Nullable; import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; public abstract class AbstractTransportServiceStubClassComposer implements ClassComposer { private static final List AIP_STANDARDS_METHODS = @@ -912,8 +912,7 @@ protected List createLongRunningClient(Service service, TypeStore typ return ImmutableList.of(); } - @Nullable - protected VariableExpr declareLongRunningClient() { + protected @Nullable VariableExpr declareLongRunningClient() { return null; } @@ -1537,8 +1536,7 @@ private static Predicate shouldAutoPopulate(Message methodRequestMessage * The Resource Name Extractor should only be generated if the request contains a field that has * resource reference (see {@link Field#hasResourceReference()}) */ - @Nullable - protected LambdaExpr createResourceNameExtractorClassInstance( + protected @Nullable LambdaExpr createResourceNameExtractorClassInstance( Service service, Method method, ImmutableMap messageTypes, @@ -1679,7 +1677,7 @@ protected LambdaExpr createResourceNameExtractorClassInstance( } // Find the first field that has resource reference in a request message - private static Field getDestinationResourceIdField( + private static @Nullable Field getDestinationResourceIdField( Method method, ImmutableMap messageTypes) { if (method.inputType().reference() == null || method.inputType().reference().fullName() == null) { diff --git a/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/common/TransportContext.java b/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/common/TransportContext.java index ab98a86b18b5..d156d3f3b98d 100644 --- a/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/common/TransportContext.java +++ b/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/common/TransportContext.java @@ -20,8 +20,10 @@ import com.google.api.generator.gapic.model.Transport; import com.google.auto.value.AutoValue; import java.util.List; -import javax.annotation.Nullable; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; +@NullMarked @AutoValue public abstract class TransportContext { diff --git a/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/defaultvalue/DefaultValueComposer.java b/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/defaultvalue/DefaultValueComposer.java index 3669e9f77e99..9832e1cea6ea 100644 --- a/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/defaultvalue/DefaultValueComposer.java +++ b/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/defaultvalue/DefaultValueComposer.java @@ -54,7 +54,10 @@ import java.util.Optional; import java.util.regex.Pattern; import java.util.stream.Collectors; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; +@NullMarked public class DefaultValueComposer { private static final TypeNode OPERATION_TYPE = TypeNode.withReference(ConcreteReference.withClazz(Operation.class)); @@ -120,7 +123,7 @@ public static Expr createValue( Map resourceNames, Map messageTypes, Map valuePatterns, - HttpBindings bindings) { + @Nullable HttpBindings bindings) { if (field.isRepeated()) { ConcreteReference.Builder refBuilder = ConcreteReference.builder().setClazz(field.isMap() ? HashMap.class : ArrayList.class); diff --git a/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/grpc/MockServiceImplClassComposer.java b/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/grpc/MockServiceImplClassComposer.java index d6573f026dae..ae09a6c86a05 100644 --- a/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/grpc/MockServiceImplClassComposer.java +++ b/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/grpc/MockServiceImplClassComposer.java @@ -62,7 +62,10 @@ import java.util.function.Function; import java.util.stream.Collectors; import javax.annotation.Generated; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; +@NullMarked public class MockServiceImplClassComposer implements ClassComposer { private static final MockServiceImplClassComposer INSTANCE = new MockServiceImplClassComposer(); private static final String IMPL_BASE_PATTERN = "%sImplBase"; @@ -464,7 +467,7 @@ private static MethodDefinition createOnCompletedJavaMethod( private static Statement createHandleObjectStatement( Method protoMethod, - VariableExpr requestArgVarExpr, + @Nullable VariableExpr requestArgVarExpr, VariableExpr responseObserverVarExpr, VariableExpr localResponseVarExpr) { List ifBodyExprs = new ArrayList<>(); diff --git a/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/gapic/model/Field.java b/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/gapic/model/Field.java index ca2a98b56d27..1233ac934ae3 100644 --- a/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/gapic/model/Field.java +++ b/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/gapic/model/Field.java @@ -19,8 +19,10 @@ import com.google.auto.value.AutoValue; import java.util.Objects; import java.util.Optional; -import javax.annotation.Nullable; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; +@NullMarked @AutoValue public abstract class Field { // The field's canonical name, potentially post-processed by conflict resolution logic. diff --git a/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/gapic/model/GapicBatchingSettings.java b/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/gapic/model/GapicBatchingSettings.java index 2f7d4de00d84..19214538ad4c 100644 --- a/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/gapic/model/GapicBatchingSettings.java +++ b/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/gapic/model/GapicBatchingSettings.java @@ -17,8 +17,10 @@ import com.google.auto.value.AutoValue; import com.google.common.collect.ImmutableList; import java.util.List; -import javax.annotation.Nullable; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; +@NullMarked @AutoValue public abstract class GapicBatchingSettings { public enum FlowControlLimitExceededBehavior { diff --git a/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/gapic/model/GapicContext.java b/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/gapic/model/GapicContext.java index 680573bfdb50..dd096e11400f 100644 --- a/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/gapic/model/GapicContext.java +++ b/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/gapic/model/GapicContext.java @@ -25,8 +25,10 @@ import java.util.Set; import java.util.TreeMap; import java.util.stream.Collectors; -import javax.annotation.Nullable; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; +@NullMarked @AutoValue public abstract class GapicContext { // Keep a non-AutoValue reference to GapicMetadata, since we need to update @@ -69,8 +71,7 @@ public GapicMetadata gapicMetadata() { @Nullable public abstract GapicServiceConfig serviceConfig(); - @Nullable - public abstract com.google.api.Service serviceYamlProto(); + public abstract com.google.api.@Nullable Service serviceYamlProto(); @Nullable public abstract String repo(); diff --git a/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/gapic/model/HttpBindings.java b/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/gapic/model/HttpBindings.java index ae9194eeb2b7..9e37b61f55ef 100644 --- a/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/gapic/model/HttpBindings.java +++ b/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/gapic/model/HttpBindings.java @@ -23,8 +23,10 @@ import java.util.Map; import java.util.Set; import java.util.stream.Collectors; -import javax.annotation.Nullable; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; +@NullMarked @AutoValue public abstract class HttpBindings { public enum HttpVerb { diff --git a/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/gapic/model/LongrunningOperation.java b/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/gapic/model/LongrunningOperation.java index e23e8a6ee3f8..70e259c186ca 100644 --- a/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/gapic/model/LongrunningOperation.java +++ b/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/gapic/model/LongrunningOperation.java @@ -16,8 +16,10 @@ import com.google.api.generator.engine.ast.TypeNode; import com.google.auto.value.AutoValue; -import javax.annotation.Nullable; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; +@NullMarked @AutoValue public abstract class LongrunningOperation { public abstract TypeNode responseType(); diff --git a/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/gapic/model/Message.java b/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/gapic/model/Message.java index 2866e8462410..664c6f888508 100644 --- a/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/gapic/model/Message.java +++ b/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/gapic/model/Message.java @@ -31,8 +31,10 @@ import java.util.Map; import java.util.stream.Collectors; import java.util.stream.IntStream; -import javax.annotation.Nullable; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; +@NullMarked @AutoValue public abstract class Message { diff --git a/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/gapic/model/Method.java b/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/gapic/model/Method.java index 66acd065a3f8..45d8dabfaf98 100644 --- a/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/gapic/model/Method.java +++ b/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/gapic/model/Method.java @@ -19,8 +19,10 @@ import com.google.common.collect.ImmutableList; import java.util.ArrayList; import java.util.List; -import javax.annotation.Nullable; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; +@NullMarked @AutoValue public abstract class Method { public enum Stream { diff --git a/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/gapic/model/ResourceName.java b/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/gapic/model/ResourceName.java index 9a01bf6dba08..901a9b770fb4 100644 --- a/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/gapic/model/ResourceName.java +++ b/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/gapic/model/ResourceName.java @@ -26,8 +26,10 @@ import com.google.common.collect.ImmutableMap; import java.util.List; import java.util.Objects; -import javax.annotation.Nullable; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; +@NullMarked @AutoValue public abstract class ResourceName { static final String SLASH = "/"; diff --git a/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/gapic/model/Service.java b/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/gapic/model/Service.java index 656bf6bbd3af..835f086ed5e8 100644 --- a/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/gapic/model/Service.java +++ b/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/gapic/model/Service.java @@ -21,14 +21,15 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.Iterables; import java.util.List; -import javax.annotation.Nullable; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; +@NullMarked @AutoValue public abstract class Service { public abstract String name(); - @Nullable - public abstract String apiVersion(); + public abstract @Nullable String apiVersion(); public abstract String defaultHost(); @@ -48,8 +49,7 @@ public abstract class Service { public abstract ImmutableList methods(); - @Nullable - public abstract String description(); + public abstract @Nullable String description(); public boolean hasDescription() { return !Strings.isNullOrEmpty(description()); @@ -79,7 +79,7 @@ public String packageVersion() { return ""; } - public Method operationPollingMethod() { + public @Nullable Method operationPollingMethod() { for (Method method : methods()) { if (method.isOperationPollingMethod()) { return method; @@ -88,7 +88,7 @@ public Method operationPollingMethod() { return null; } - public TypeNode operationServiceStubType() { + public @Nullable TypeNode operationServiceStubType() { for (Method method : methods()) { if (method.hasLro() && method.lro().operationServiceStubType() != null) { // All methods within the same service must have the same operationServiceTypeName if @@ -99,7 +99,7 @@ public TypeNode operationServiceStubType() { return null; } - public TypeNode operationType() { + public @Nullable TypeNode operationType() { for (Method method : methods()) { if (method.hasLro() && method.lro().operationServiceStubType() != null) { return method.outputType(); diff --git a/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/gapic/model/SourceCodeInfoLocation.java b/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/gapic/model/SourceCodeInfoLocation.java index f39cb3953066..f2f4ecf38d16 100644 --- a/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/gapic/model/SourceCodeInfoLocation.java +++ b/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/gapic/model/SourceCodeInfoLocation.java @@ -15,20 +15,22 @@ package com.google.api.generator.gapic.model; import com.google.protobuf.DescriptorProtos.SourceCodeInfo.Location; -import javax.annotation.Nonnull; +import org.jspecify.annotations.NonNull; +import org.jspecify.annotations.NullMarked; /** * A light wrapper around SourceCodeInfo.Location to provide cleaner protobuf comments. Please see * additional documentation on descriptor.proto. */ +@NullMarked public class SourceCodeInfoLocation { - @Nonnull private final Location location; + @NonNull private final Location location; private SourceCodeInfoLocation(Location location) { this.location = location; } - public static SourceCodeInfoLocation create(@Nonnull Location location) { + public static SourceCodeInfoLocation create(@NonNull Location location) { return new SourceCodeInfoLocation(location); } diff --git a/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/gapic/protoparser/HttpRuleParser.java b/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/gapic/protoparser/HttpRuleParser.java index 0ea1c5aa456e..9bd6f14ac2f7 100644 --- a/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/gapic/protoparser/HttpRuleParser.java +++ b/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/gapic/protoparser/HttpRuleParser.java @@ -40,13 +40,16 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; +@NullMarked public class HttpRuleParser { private static final String ASTERISK = "*"; private static final Pattern TEMPLATE_VALS_PATTERN = Pattern.compile("\\{(?[\\w.]*)=(?