Skip to content

Commit 19b661c

Browse files
authored
feat: Lambda-ize single-method anon classes (#815)
1 parent c98c0c7 commit 19b661c

36 files changed

Lines changed: 889 additions & 1711 deletions

File tree

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,9 @@ public MethodInvocationExpr build() {
126126
"generics",
127127
String.format("method invocation of %s", methodInvocationExpr.methodIdentifier().name()));
128128

129+
// TODO(v2): If type-checking is ever added for arguments, beware of lambdas and their type
130+
// workarounds.
131+
129132
return methodInvocationExpr;
130133
}
131134
}

src/main/java/com/google/api/generator/gapic/composer/common/AbstractServiceStubSettingsClassComposer.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -613,13 +613,13 @@ private static Expr createPagedListDescriptorAssignExpr(
613613
.setReturnType(returnType)
614614
.build();
615615
thenExpr =
616-
MethodInvocationExpr.builder()
617-
.setStaticReferenceType(
618-
TypeNode.withReference(ConcreteReference.withClazz(ImmutableList.class)))
619-
.setGenerics(Arrays.asList(repeatedResponseType.reference()))
620-
.setMethodName("of")
621-
.setReturnType(returnType)
622-
.build();
616+
MethodInvocationExpr.builder()
617+
.setStaticReferenceType(
618+
TypeNode.withReference(ConcreteReference.withClazz(ImmutableList.class)))
619+
.setGenerics(Arrays.asList(repeatedResponseType.reference()))
620+
.setMethodName("of")
621+
.setReturnType(returnType)
622+
.build();
623623
elseExpr = getResponsesExpr;
624624
}
625625
// While protobufs should not be null, this null-check is needed to protect against NPEs

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

Lines changed: 9 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -30,14 +30,14 @@
3030
import com.google.api.gax.rpc.ServerStreamingCallable;
3131
import com.google.api.gax.rpc.UnaryCallable;
3232
import com.google.api.generator.engine.ast.AnnotationNode;
33-
import com.google.api.generator.engine.ast.AnonymousClassExpr;
3433
import com.google.api.generator.engine.ast.AssignmentExpr;
3534
import com.google.api.generator.engine.ast.CastExpr;
3635
import com.google.api.generator.engine.ast.ClassDefinition;
3736
import com.google.api.generator.engine.ast.CommentStatement;
3837
import com.google.api.generator.engine.ast.ConcreteReference;
3938
import com.google.api.generator.engine.ast.Expr;
4039
import com.google.api.generator.engine.ast.ExprStatement;
40+
import com.google.api.generator.engine.ast.LambdaExpr;
4141
import com.google.api.generator.engine.ast.MethodDefinition;
4242
import com.google.api.generator.engine.ast.MethodInvocationExpr;
4343
import com.google.api.generator.engine.ast.NewObjectExpr;
@@ -1165,23 +1165,14 @@ private static ClassDefinition createNestedRpcPagedResponseClass(
11651165
.setClazz(ApiFunction.class)
11661166
.setGenerics(Arrays.asList(methodPageType.reference(), thisClassType.reference()))
11671167
.build());
1168+
1169+
// Overrides ApiFunction.apply.
1170+
// (https://github.com/googleapis/api-common-java/blob/debf25960dea0367b0d3b5e16d57d76c1d01947e/src/main/java/com/google/api/core/ApiFunction.java).
11681171
Expr pageToTransformExpr =
1169-
AnonymousClassExpr.builder()
1170-
.setType(anonClassType)
1171-
.setMethods(
1172-
Arrays.asList(
1173-
MethodDefinition.builder()
1174-
.setIsOverride(true)
1175-
.setScope(ScopeNode.PUBLIC)
1176-
.setReturnType(thisClassType)
1177-
.setName("apply")
1178-
.setArguments(inputVarExpr.toBuilder().setIsDecl(true).build())
1179-
.setReturnExpr(
1180-
NewObjectExpr.builder()
1181-
.setType(thisClassType)
1182-
.setArguments(inputVarExpr)
1183-
.build())
1184-
.build()))
1172+
LambdaExpr.builder()
1173+
.setArguments(inputVarExpr.toBuilder().setIsDecl(true).build())
1174+
.setReturnExpr(
1175+
NewObjectExpr.builder().setType(thisClassType).setArguments(inputVarExpr).build())
11851176
.build();
11861177

11871178
// createAsync method - return expression.
@@ -1739,9 +1730,7 @@ private static boolean isProtoEmptyType(TypeNode type) {
17391730
private static void updateGapicMetadata(
17401731
GapicContext context, String protoPackage, String javaPackage) {
17411732
context.updateGapicMetadata(
1742-
context
1743-
.gapicMetadata()
1744-
.toBuilder()
1733+
context.gapicMetadata().toBuilder()
17451734
.setProtoPackage(protoPackage)
17461735
.setLibraryPackage(javaPackage)
17471736
.build());

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

Lines changed: 11 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,12 @@
1616

1717
import com.google.api.gax.grpc.GrpcCallSettings;
1818
import com.google.api.gax.grpc.GrpcStubCallableFactory;
19-
import com.google.api.gax.rpc.RequestParamsExtractor;
20-
import com.google.api.generator.engine.ast.AnonymousClassExpr;
2119
import com.google.api.generator.engine.ast.AssignmentExpr;
2220
import com.google.api.generator.engine.ast.ConcreteReference;
2321
import com.google.api.generator.engine.ast.EnumRefExpr;
2422
import com.google.api.generator.engine.ast.Expr;
2523
import com.google.api.generator.engine.ast.ExprStatement;
24+
import com.google.api.generator.engine.ast.LambdaExpr;
2625
import com.google.api.generator.engine.ast.MethodDefinition;
2726
import com.google.api.generator.engine.ast.MethodInvocationExpr;
2827
import com.google.api.generator.engine.ast.ScopeNode;
@@ -223,7 +222,7 @@ protected Expr createTransportSettingsInitExpr(
223222
MethodInvocationExpr.builder()
224223
.setExprReferenceExpr(callSettingsBuilderExpr)
225224
.setMethodName("setParamsExtractor")
226-
.setArguments(createRequestParamsExtractorAnonClass(method))
225+
.setArguments(createRequestParamsExtractorClassInstance(method))
227226
.build();
228227
}
229228

@@ -255,7 +254,7 @@ protected String getProtoRpcFullMethodName(Service protoService, Method protoMet
255254
return String.format("google.iam.v1.IAMPolicy/%s", protoMethod.name());
256255
}
257256

258-
private AnonymousClassExpr createRequestParamsExtractorAnonClass(Method method) {
257+
private LambdaExpr createRequestParamsExtractorClassInstance(Method method) {
259258
Preconditions.checkState(
260259
method.hasHttpBindings(), String.format("Method %s has no HTTP binding", method.name()));
261260

@@ -339,24 +338,13 @@ private AnonymousClassExpr createRequestParamsExtractorAnonClass(Method method)
339338
.setReturnType(returnType)
340339
.build();
341340

342-
MethodDefinition extractMethod =
343-
MethodDefinition.builder()
344-
.setIsOverride(true)
345-
.setScope(ScopeNode.PUBLIC)
346-
.setReturnType(returnType)
347-
.setName("extract")
348-
.setArguments(requestVarExpr.toBuilder().setIsDecl(true).build())
349-
.setBody(
350-
bodyExprs.stream().map(e -> ExprStatement.withExpr(e)).collect(Collectors.toList()))
351-
.setReturnExpr(returnExpr)
352-
.build();
353-
354-
TypeNode anonClassType =
355-
TypeNode.withReference(
356-
ConcreteReference.builder()
357-
.setClazz(RequestParamsExtractor.class)
358-
.setGenerics(method.inputType().reference())
359-
.build());
360-
return AnonymousClassExpr.builder().setType(anonClassType).setMethods(extractMethod).build();
341+
// Overrides extract().
342+
// https://github.com/googleapis/gax-java/blob/8d45d186e36ae97b789a6f89d80ae5213a773b65/gax/src/main/java/com/google/api/gax/rpc/RequestParamsExtractor.java#L55
343+
return LambdaExpr.builder()
344+
.setArguments(requestVarExpr.toBuilder().setIsDecl(true).build())
345+
.setBody(
346+
bodyExprs.stream().map(e -> ExprStatement.withExpr(e)).collect(Collectors.toList()))
347+
.setReturnExpr(returnExpr)
348+
.build();
361349
}
362350
}

src/main/java/com/google/api/generator/gapic/composer/grpc/MockServiceImplClassComposer.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -354,7 +354,7 @@ private static MethodDefinition createGenericClientStreamingProtoMethodOverride(
354354
AssignmentExpr.builder()
355355
.setVariableExpr(requestObserverVarExpr.toBuilder().setIsDecl(true).build())
356356
.setValueExpr(
357-
createStreamObserverAnonymousClassExpr(
357+
createStreamObserverClassInstance(
358358
protoMethod,
359359
returnType,
360360
responseObserverVarExpr,
@@ -364,7 +364,7 @@ private static MethodDefinition createGenericClientStreamingProtoMethodOverride(
364364
.build();
365365
}
366366

367-
private static AnonymousClassExpr createStreamObserverAnonymousClassExpr(
367+
private static AnonymousClassExpr createStreamObserverClassInstance(
368368
Method protoMethod,
369369
TypeNode classType,
370370
VariableExpr responseObserverVarExpr,

src/main/java/com/google/api/generator/gapic/composer/rest/HttpJsonServiceStubClassComposer.java

Lines changed: 12 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,13 @@
2424
import com.google.api.gax.httpjson.ProtoMessageResponseParser;
2525
import com.google.api.gax.httpjson.ProtoRestSerializer;
2626
import com.google.api.generator.engine.ast.AnnotationNode;
27-
import com.google.api.generator.engine.ast.AnonymousClassExpr;
2827
import com.google.api.generator.engine.ast.AssignmentExpr;
2928
import com.google.api.generator.engine.ast.ConcreteReference;
3029
import com.google.api.generator.engine.ast.EnumRefExpr;
3130
import com.google.api.generator.engine.ast.Expr;
3231
import com.google.api.generator.engine.ast.ExprStatement;
3332
import com.google.api.generator.engine.ast.IfStatement;
33+
import com.google.api.generator.engine.ast.LambdaExpr;
3434
import com.google.api.generator.engine.ast.MethodDefinition;
3535
import com.google.api.generator.engine.ast.MethodInvocationExpr;
3636
import com.google.api.generator.engine.ast.NewObjectExpr;
@@ -277,7 +277,7 @@ private List<Expr> getRequestFormatterExpr(Method protoMethod) {
277277
ValueExpr.withValue(
278278
StringObjectValue.withValue(
279279
protoMethod.httpBindings().patternLowerCamel())),
280-
createFieldsExtractorAnonClass(
280+
createFieldsExtractorClassInstance(
281281
protoMethod,
282282
extractorVarType,
283283
protoMethod.httpBindings().pathParameters(),
@@ -303,7 +303,7 @@ private List<Expr> getRequestFormatterExpr(Method protoMethod) {
303303
.apply(
304304
"setQueryParamsExtractor",
305305
Arrays.asList(
306-
createFieldsExtractorAnonClass(
306+
createFieldsExtractorClassInstance(
307307
protoMethod,
308308
extractorVarType,
309309
protoMethod.httpBindings().queryParameters(),
@@ -316,7 +316,7 @@ private List<Expr> getRequestFormatterExpr(Method protoMethod) {
316316
.apply(
317317
"setRequestBodyExtractor",
318318
Arrays.asList(
319-
createFieldsExtractorAnonClass(
319+
createFieldsExtractorClassInstance(
320320
protoMethod,
321321
extractorVarType,
322322
protoMethod.httpBindings().bodyParameters(),
@@ -356,7 +356,7 @@ private List<Expr> setResponseParserExpr(Method protoMethod) {
356356
return Collections.singletonList(expr);
357357
}
358358

359-
private Expr createFieldsExtractorAnonClass(
359+
private Expr createFieldsExtractorClassInstance(
360360
Method method,
361361
TypeNode extractorReturnType,
362362
Set<HttpBinding> httpBindingFieldNames,
@@ -495,25 +495,13 @@ private Expr createFieldsExtractorAnonClass(
495495
}
496496
}
497497

498-
MethodDefinition extractMethod =
499-
MethodDefinition.builder()
500-
.setIsOverride(true)
501-
.setScope(ScopeNode.PUBLIC)
502-
.setReturnType(extractorReturnType)
503-
.setName("extract")
504-
.setArguments(requestVarExpr.toBuilder().setIsDecl(true).build())
505-
.setBody(bodyStatements)
506-
.setReturnExpr(returnExpr)
507-
.build();
508-
509-
TypeNode anonClassType =
510-
TypeNode.withReference(
511-
ConcreteReference.builder()
512-
.setClazz(FieldsExtractor.class)
513-
.setGenerics(method.inputType().reference(), extractorReturnType.reference())
514-
.build());
515-
516-
return AnonymousClassExpr.builder().setType(anonClassType).setMethods(extractMethod).build();
498+
// Overrides FieldsExtractor
499+
// (https://github.com/googleapis/gax-java/blob/12b18ee255d3fabe13bb3969df40753b29f830d5/gax-httpjson/src/main/java/com/google/api/gax/httpjson/FieldsExtractor.java).
500+
return LambdaExpr.builder()
501+
.setArguments(requestVarExpr.toBuilder().setIsDecl(true).build())
502+
.setBody(bodyStatements)
503+
.setReturnExpr(returnExpr)
504+
.build();
517505
}
518506

519507
private List<Expr> getHttpMethodTypeExpr(Method protoMethod) {

src/test/java/com/google/api/generator/gapic/composer/common/goldens/EchoClient.golden

Lines changed: 2 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package com.google.showcase.v1beta1;
22

3-
import com.google.api.core.ApiFunction;
43
import com.google.api.core.ApiFuture;
54
import com.google.api.core.ApiFutures;
65
import com.google.api.core.BetaApi;
@@ -860,14 +859,7 @@ public class EchoClient implements BackgroundResource {
860859
ApiFuture<PagedExpandPage> futurePage =
861860
PagedExpandPage.createEmptyPage().createPageAsync(context, futureResponse);
862861
return ApiFutures.transform(
863-
futurePage,
864-
new ApiFunction<PagedExpandPage, PagedExpandPagedResponse>() {
865-
@Override
866-
public PagedExpandPagedResponse apply(PagedExpandPage input) {
867-
return new PagedExpandPagedResponse(input);
868-
}
869-
},
870-
MoreExecutors.directExecutor());
862+
futurePage, input -> new PagedExpandPagedResponse(input), MoreExecutors.directExecutor());
871863
}
872864

873865
private PagedExpandPagedResponse(PagedExpandPage page) {
@@ -941,12 +933,7 @@ public class EchoClient implements BackgroundResource {
941933
SimplePagedExpandPage.createEmptyPage().createPageAsync(context, futureResponse);
942934
return ApiFutures.transform(
943935
futurePage,
944-
new ApiFunction<SimplePagedExpandPage, SimplePagedExpandPagedResponse>() {
945-
@Override
946-
public SimplePagedExpandPagedResponse apply(SimplePagedExpandPage input) {
947-
return new SimplePagedExpandPagedResponse(input);
948-
}
949-
},
936+
input -> new SimplePagedExpandPagedResponse(input),
950937
MoreExecutors.directExecutor());
951938
}
952939

src/test/java/com/google/api/generator/gapic/composer/common/goldens/IdentityClient.golden

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package com.google.showcase.v1beta1;
22

3-
import com.google.api.core.ApiFunction;
43
import com.google.api.core.ApiFuture;
54
import com.google.api.core.ApiFutures;
65
import com.google.api.core.BetaApi;
@@ -644,14 +643,7 @@ public class IdentityClient implements BackgroundResource {
644643
ApiFuture<ListUsersPage> futurePage =
645644
ListUsersPage.createEmptyPage().createPageAsync(context, futureResponse);
646645
return ApiFutures.transform(
647-
futurePage,
648-
new ApiFunction<ListUsersPage, ListUsersPagedResponse>() {
649-
@Override
650-
public ListUsersPagedResponse apply(ListUsersPage input) {
651-
return new ListUsersPagedResponse(input);
652-
}
653-
},
654-
MoreExecutors.directExecutor());
646+
futurePage, input -> new ListUsersPagedResponse(input), MoreExecutors.directExecutor());
655647
}
656648

657649
private ListUsersPagedResponse(ListUsersPage page) {

0 commit comments

Comments
 (0)