Skip to content

Commit c9a7e11

Browse files
authored
[ggj] feat(gapic): propagate protobuf 'deprecated' to classes/methods (#708)
* feat(gapic): propagate protobuf 'deprecated' to classes/methods * fix method params
1 parent ba93722 commit c9a7e11

43 files changed

Lines changed: 2807 additions & 446 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

src/main/java/com/google/api/generator/engine/ast/TypeNode.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,9 @@ public enum TypeKind {
8181
public static final TypeNode STRING = withReference(ConcreteReference.withClazz(String.class));
8282
public static final TypeNode VOID_OBJECT = withReference(ConcreteReference.withClazz(Void.class));
8383

84+
public static final TypeNode DEPRECATED =
85+
withReference(ConcreteReference.withClazz(Deprecated.class));
86+
8487
public static final TypeNode STRING_ARRAY =
8588
builder()
8689
.setTypeKind(TypeKind.OBJECT)

src/main/java/com/google/api/generator/gapic/composer/GrpcServiceCallableFactoryClassComposer.java

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -77,8 +77,8 @@ public GapicClass generate(GapicContext ignored, Service service) {
7777
.setPackageString(pakkage)
7878
.setHeaderCommentStatements(
7979
StubCommentComposer.createGrpcServiceCallableFactoryClassHeaderComments(
80-
service.name()))
81-
.setAnnotations(createClassAnnotations(service.pakkage(), typeStore))
80+
service.name(), service.isDeprecated()))
81+
.setAnnotations(createClassAnnotations(service, typeStore))
8282
.setImplementsTypes(createClassImplements(typeStore))
8383
.setName(className)
8484
.setMethods(createClassMethods(typeStore))
@@ -87,11 +87,16 @@ public GapicClass generate(GapicContext ignored, Service service) {
8787
return GapicClass.create(kind, classDef);
8888
}
8989

90-
private static List<AnnotationNode> createClassAnnotations(String pakkage, TypeStore typeStore) {
90+
private static List<AnnotationNode> createClassAnnotations(Service service, TypeStore typeStore) {
9191
List<AnnotationNode> annotations = new ArrayList<>();
92-
if (!PackageChecker.isGaApi(pakkage)) {
92+
if (!PackageChecker.isGaApi(service.pakkage())) {
9393
annotations.add(AnnotationNode.withType(typeStore.get("BetaApi")));
9494
}
95+
96+
if (service.isDeprecated()) {
97+
annotations.add(AnnotationNode.withType(TypeNode.DEPRECATED));
98+
}
99+
95100
annotations.add(
96101
AnnotationNode.builder()
97102
.setType(typeStore.get("Generated"))

src/main/java/com/google/api/generator/gapic/composer/GrpcServiceStubClassComposer.java

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -162,8 +162,9 @@ public GapicClass generate(GapicContext ignored, Service service) {
162162
ClassDefinition.builder()
163163
.setPackageString(pakkage)
164164
.setHeaderCommentStatements(
165-
StubCommentComposer.createGrpcServiceStubClassHeaderComments(service.name()))
166-
.setAnnotations(createClassAnnotations(service.pakkage()))
165+
StubCommentComposer.createGrpcServiceStubClassHeaderComments(
166+
service.name(), service.isDeprecated()))
167+
.setAnnotations(createClassAnnotations(service))
167168
.setScope(ScopeNode.PUBLIC)
168169
.setName(className)
169170
.setExtendsType(typeStore.get(ClassNames.getServiceStubClassName(service)))
@@ -387,11 +388,16 @@ private static Map<String, VariableExpr> createCallableClassMembers(
387388
return callableClassMembers;
388389
}
389390

390-
private static List<AnnotationNode> createClassAnnotations(String pakkage) {
391+
private static List<AnnotationNode> createClassAnnotations(Service service) {
391392
List<AnnotationNode> annotations = new ArrayList<>();
392-
if (!PackageChecker.isGaApi(pakkage)) {
393+
if (!PackageChecker.isGaApi(service.pakkage())) {
393394
annotations.add(AnnotationNode.withType(FIXED_TYPESTORE.get("BetaApi")));
394395
}
396+
397+
if (service.isDeprecated()) {
398+
annotations.add(AnnotationNode.withType(TypeNode.DEPRECATED));
399+
}
400+
395401
annotations.add(
396402
AnnotationNode.builder()
397403
.setType(FIXED_TYPESTORE.get("Generated"))

src/main/java/com/google/api/generator/gapic/composer/ServiceClientClassComposer.java

Lines changed: 35 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ public GapicClass generate(GapicContext context, Service service) {
138138
.setHeaderCommentStatements(
139139
createClassHeaderComments(service, typeStore, resourceNames, messageTypes))
140140
.setPackageString(pakkage)
141-
.setAnnotations(createClassAnnotations(pakkage, typeStore))
141+
.setAnnotations(createClassAnnotations(service, typeStore))
142142
.setScope(ScopeNode.PUBLIC)
143143
.setName(className)
144144
.setImplementsTypes(createClassImplements(typeStore))
@@ -158,11 +158,14 @@ public GapicClass generate(GapicContext context, Service service) {
158158
return GapicClass.create(kind, classDef);
159159
}
160160

161-
private static List<AnnotationNode> createClassAnnotations(String pakkage, TypeStore typeStore) {
161+
private static List<AnnotationNode> createClassAnnotations(Service service, TypeStore typeStore) {
162162
List<AnnotationNode> annotations = new ArrayList<>();
163-
if (!PackageChecker.isGaApi(pakkage)) {
163+
if (!PackageChecker.isGaApi(service.pakkage())) {
164164
annotations.add(AnnotationNode.withType(typeStore.get("BetaApi")));
165165
}
166+
if (service.isDeprecated()) {
167+
annotations.add(AnnotationNode.withType(TypeNode.DEPRECATED));
168+
}
166169
annotations.add(
167170
AnnotationNode.builder()
168171
.setType(typeStore.get("Generated"))
@@ -544,6 +547,8 @@ private static List<MethodDefinition> createServiceMethods(
544547
messageTypes,
545548
typeStore,
546549
resourceNames);
550+
551+
// Collect data for gapic_metadata.json.
547552
grpcRpcToJavaMethodMetadata
548553
.get(method.name())
549554
.addAll(
@@ -559,23 +564,31 @@ private static List<MethodDefinition> createServiceMethods(
559564
messageTypes,
560565
typeStore,
561566
resourceNames);
567+
568+
// Collect data for gapic_metadata.json.
562569
grpcRpcToJavaMethodMetadata.get(method.name()).add(javaMethodNameFn.apply(generatedMethod));
563570
javaMethods.add(generatedMethod);
564571
}
565572
if (method.hasLro()) {
566573
MethodDefinition generatedMethod =
567574
createLroCallableMethod(service, method, typeStore, messageTypes, resourceNames);
575+
576+
// Collect data for gapic_metadata.json.
568577
grpcRpcToJavaMethodMetadata.get(method.name()).add(javaMethodNameFn.apply(generatedMethod));
569578
javaMethods.add(generatedMethod);
570579
}
571580
if (method.isPaged()) {
572581
MethodDefinition generatedMethod =
573582
createPagedCallableMethod(service, method, typeStore, messageTypes, resourceNames);
583+
584+
// Collect data for gapic_metadata.json.
574585
grpcRpcToJavaMethodMetadata.get(method.name()).add(javaMethodNameFn.apply(generatedMethod));
575586
javaMethods.add(generatedMethod);
576587
}
577588
MethodDefinition generatedMethod =
578589
createCallableMethod(service, method, typeStore, messageTypes, resourceNames);
590+
591+
// Collect data for the gapic_metadata.json file.
579592
grpcRpcToJavaMethodMetadata.get(method.name()).add(javaMethodNameFn.apply(generatedMethod));
580593
javaMethods.add(generatedMethod);
581594
}
@@ -670,6 +683,12 @@ private static List<MethodDefinition> createMethodVariants(
670683
methodVariantBuilder =
671684
methodVariantBuilder.setReturnType(methodOutputType).setReturnExpr(rpcInvocationExpr);
672685
}
686+
687+
if (method.isDeprecated()) {
688+
methodVariantBuilder =
689+
methodVariantBuilder.setAnnotations(
690+
Arrays.asList(AnnotationNode.withType(TypeNode.DEPRECATED)));
691+
}
673692
methodVariantBuilder = methodVariantBuilder.setBody(statements);
674693
javaMethods.add(methodVariantBuilder.build());
675694
}
@@ -739,6 +758,11 @@ private static MethodDefinition createMethodDefaultMethod(
739758
.setName(String.format(method.hasLro() ? "%sAsync" : "%s", methodName))
740759
.setArguments(Arrays.asList(requestArgVarExpr));
741760

761+
if (method.isDeprecated()) {
762+
methodBuilder =
763+
methodBuilder.setAnnotations(Arrays.asList(AnnotationNode.withType(TypeNode.DEPRECATED)));
764+
}
765+
742766
if (isProtoEmptyType(methodOutputType)) {
743767
methodBuilder =
744768
methodBuilder
@@ -866,7 +890,14 @@ private static MethodDefinition createCallableMethod(
866890
}
867891
}
868892

869-
return MethodDefinition.builder()
893+
MethodDefinition.Builder methodDefBuilder = MethodDefinition.builder();
894+
if (method.isDeprecated()) {
895+
methodDefBuilder =
896+
methodDefBuilder.setAnnotations(
897+
Arrays.asList(AnnotationNode.withType(TypeNode.DEPRECATED)));
898+
}
899+
900+
return methodDefBuilder
870901
.setHeaderCommentStatements(
871902
ServiceClientCommentComposer.createRpcCallableMethodHeaderComment(
872903
method, sampleCodeOpt))

src/main/java/com/google/api/generator/gapic/composer/ServiceSettingsClassComposer.java

Lines changed: 70 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@
6767
import java.io.IOException;
6868
import java.util.ArrayList;
6969
import java.util.Arrays;
70+
import java.util.Collections;
7071
import java.util.List;
7172
import java.util.Optional;
7273
import java.util.function.BiFunction;
@@ -104,7 +105,7 @@ public GapicClass generate(GapicContext ignored, Service service) {
104105
.setPackageString(pakkage)
105106
.setHeaderCommentStatements(
106107
createClassHeaderComments(service, typeStore.get(className)))
107-
.setAnnotations(createClassAnnotations(service.pakkage()))
108+
.setAnnotations(createClassAnnotations(service))
108109
.setScope(ScopeNode.PUBLIC)
109110
.setName(className)
110111
.setExtendsType(
@@ -143,16 +144,22 @@ private static List<CommentStatement> createClassHeaderComments(
143144
return SettingsCommentComposer.createClassHeaderComments(
144145
ClassNames.getServiceClientClassName(service),
145146
service.defaultHost(),
147+
service.isDeprecated(),
146148
methodNameOpt,
147149
sampleCodeOpt,
148150
classType);
149151
}
150152

151-
private static List<AnnotationNode> createClassAnnotations(String pakkage) {
153+
private static List<AnnotationNode> createClassAnnotations(Service service) {
152154
List<AnnotationNode> annotations = new ArrayList<>();
153-
if (!PackageChecker.isGaApi(pakkage)) {
155+
if (!PackageChecker.isGaApi(service.pakkage())) {
154156
annotations.add(AnnotationNode.withType(FIXED_TYPESTORE.get("BetaApi")));
155157
}
158+
159+
if (service.isDeprecated()) {
160+
annotations.add(AnnotationNode.withType(TypeNode.DEPRECATED));
161+
}
162+
156163
annotations.add(
157164
AnnotationNode.builder()
158165
.setType(FIXED_TYPESTORE.get("Generated"))
@@ -194,18 +201,16 @@ private static MethodDefinition createConstructorMethod(Service service, TypeSto
194201
.build();
195202
}
196203

204+
// TODO(miraleung): Consider merging this with createNestedBuilderSettingsGetterMethods.
197205
private static List<MethodDefinition> createSettingsGetterMethods(
198206
Service service, TypeStore typeStore) {
199207
TypeNode stubSettingsType = typeStore.get(ClassNames.getServiceStubSettingsClassName(service));
200-
BiFunction<TypeNode, String, MethodDefinition> methodMakerFn =
201-
(retType, methodName) ->
208+
BiFunction<TypeNode, String, MethodDefinition.Builder> methodMakerFn =
209+
(retType, javaMethodName) ->
202210
MethodDefinition.builder()
203-
.setHeaderCommentStatements(
204-
SettingsCommentComposer.createCallSettingsGetterComment(
205-
getMethodNameFromSettingsVarName(methodName)))
206211
.setScope(ScopeNode.PUBLIC)
207212
.setReturnType(retType)
208-
.setName(methodName)
213+
.setName(javaMethodName)
209214
.setReturnExpr(
210215
MethodInvocationExpr.builder()
211216
.setExprReferenceExpr(
@@ -217,22 +222,41 @@ private static List<MethodDefinition> createSettingsGetterMethods(
217222
.setReturnType(FIXED_TYPESTORE.get("StubSettings"))
218223
.build())
219224
.build())
220-
.setMethodName(methodName)
225+
.setMethodName(javaMethodName)
221226
.setReturnType(retType)
222-
.build())
223-
.build();
227+
.build());
224228
List<MethodDefinition> javaMethods = new ArrayList<>();
225229
for (Method protoMethod : service.methods()) {
226230
String javaStyleName = JavaStyle.toLowerCamelCase(protoMethod.name());
231+
String javaMethodName =
232+
String.format("%sSettings", JavaStyle.toLowerCamelCase(protoMethod.name()));
233+
MethodDefinition.Builder methodBuilder =
234+
methodMakerFn.apply(getCallSettingsType(protoMethod, typeStore), javaMethodName);
227235
javaMethods.add(
228-
methodMakerFn.apply(
229-
getCallSettingsType(protoMethod, typeStore),
230-
String.format("%sSettings", javaStyleName)));
236+
methodBuilder
237+
.setHeaderCommentStatements(
238+
SettingsCommentComposer.createCallSettingsGetterComment(
239+
getMethodNameFromSettingsVarName(javaMethodName), protoMethod.isDeprecated()))
240+
.setAnnotations(
241+
protoMethod.isDeprecated()
242+
? Arrays.asList(AnnotationNode.withType(TypeNode.DEPRECATED))
243+
: Collections.emptyList())
244+
.build());
231245
if (protoMethod.hasLro()) {
246+
javaMethodName = String.format("%sOperationSettings", javaStyleName);
247+
methodBuilder =
248+
methodMakerFn.apply(getOperationCallSettingsType(protoMethod), javaMethodName);
232249
javaMethods.add(
233-
methodMakerFn.apply(
234-
getOperationCallSettingsType(protoMethod),
235-
String.format("%sOperationSettings", javaStyleName)));
250+
methodBuilder
251+
.setHeaderCommentStatements(
252+
SettingsCommentComposer.createCallSettingsGetterComment(
253+
getMethodNameFromSettingsVarName(javaMethodName),
254+
protoMethod.isDeprecated()))
255+
.setAnnotations(
256+
protoMethod.isDeprecated()
257+
? Arrays.asList(AnnotationNode.withType(TypeNode.DEPRECATED))
258+
: Collections.emptyList())
259+
.build());
236260
}
237261
}
238262
return javaMethods;
@@ -635,12 +659,9 @@ private static MethodDefinition createNestedBuilderApplyToAllUnaryMethod(
635659

636660
private static List<MethodDefinition> createNestedBuilderSettingsGetterMethods(
637661
Service service, TypeStore typeStore) {
638-
BiFunction<TypeNode, String, MethodDefinition> methodMakerFn =
662+
BiFunction<TypeNode, String, MethodDefinition.Builder> methodMakerFn =
639663
(retType, methodName) ->
640664
MethodDefinition.builder()
641-
.setHeaderCommentStatements(
642-
SettingsCommentComposer.createCallSettingsBuilderGetterComment(
643-
getMethodNameFromSettingsVarName(methodName)))
644665
.setScope(ScopeNode.PUBLIC)
645666
.setReturnType(retType)
646667
.setName(methodName)
@@ -652,20 +673,39 @@ private static List<MethodDefinition> createNestedBuilderSettingsGetterMethods(
652673
.build())
653674
.setMethodName(methodName)
654675
.setReturnType(retType)
655-
.build())
656-
.build();
676+
.build());
657677
List<MethodDefinition> javaMethods = new ArrayList<>();
658678
for (Method protoMethod : service.methods()) {
659679
String javaStyleName = JavaStyle.toLowerCamelCase(protoMethod.name());
680+
String javaMethodName = String.format("%sSettings", javaStyleName);
681+
MethodDefinition.Builder methodBuilder =
682+
methodMakerFn.apply(getCallSettingsBuilderType(protoMethod, typeStore), javaMethodName);
660683
javaMethods.add(
661-
methodMakerFn.apply(
662-
getCallSettingsBuilderType(protoMethod, typeStore),
663-
String.format("%sSettings", javaStyleName)));
684+
methodBuilder
685+
.setHeaderCommentStatements(
686+
SettingsCommentComposer.createCallSettingsBuilderGetterComment(
687+
getMethodNameFromSettingsVarName(javaMethodName), protoMethod.isDeprecated()))
688+
.setAnnotations(
689+
protoMethod.isDeprecated()
690+
? Arrays.asList(AnnotationNode.withType(TypeNode.DEPRECATED))
691+
: Collections.emptyList())
692+
.build());
693+
664694
if (protoMethod.hasLro()) {
695+
javaMethodName = String.format("%sOperationSettings", javaStyleName);
696+
methodBuilder =
697+
methodMakerFn.apply(getOperationCallSettingsBuilderType(protoMethod), javaMethodName);
665698
javaMethods.add(
666-
methodMakerFn.apply(
667-
getOperationCallSettingsBuilderType(protoMethod),
668-
String.format("%sOperationSettings", javaStyleName)));
699+
methodBuilder
700+
.setHeaderCommentStatements(
701+
SettingsCommentComposer.createCallSettingsBuilderGetterComment(
702+
getMethodNameFromSettingsVarName(javaMethodName),
703+
protoMethod.isDeprecated()))
704+
.setAnnotations(
705+
protoMethod.isDeprecated()
706+
? Arrays.asList(AnnotationNode.withType(TypeNode.DEPRECATED))
707+
: Collections.emptyList())
708+
.build());
669709
}
670710
}
671711
return javaMethods;

0 commit comments

Comments
 (0)