Skip to content

Commit ba08a0d

Browse files
committed
Merge remote-tracking branch 'upstream/master' into diregapic
2 parents e299a3c + 44a42a0 commit ba08a0d

59 files changed

Lines changed: 17821 additions & 61 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.

.github/workflows/ci.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ jobs:
4949
run: bazel --batch test $(bazel query "//src/test/..." | grep "Test$") --noshow_progress --test_output=errors
5050

5151
- name: Integration Tests
52-
run: bazel --batch test //test/integration:asset //test/integration:credentials //test/integration:iam //test/integration:kms //test/integration:logging //test/integration:redis //test/integration:library --noshow_progress
52+
run: bazel --batch test //test/integration:asset //test/integration:credentials //test/integration:iam //test/integration:kms //test/integration:logging //test/integration:pubsub //test/integration:redis //test/integration:library --noshow_progress
5353

5454
- uses: actions/upload-artifact@v2
5555
if: ${{ failure() }}

CHANGELOG.md

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,19 @@
11
# Changelog
22

3+
### [1.0.9](https://www.github.com/googleapis/gapic-generator-java/compare/v1.0.8...v1.0.9) (2021-05-26)
4+
5+
6+
### Features
7+
8+
* add AST support for lambdas ([#736](https://www.github.com/googleapis/gapic-generator-java/issues/736)) ([9ced678](https://www.github.com/googleapis/gapic-generator-java/commit/9ced6780c7a6b9934dd548002602618566a539d6))
9+
10+
11+
### Bug Fixes
12+
13+
* Support enums in proto HTTP annotations ([#733](https://www.github.com/googleapis/gapic-generator-java/issues/733)) ([f5c7b86](https://www.github.com/googleapis/gapic-generator-java/commit/f5c7b86b43ad71ffe47d8ba039155db601638e1f))
14+
* Support PubSub's _deleted-topic_ pattern ([#739](https://www.github.com/googleapis/gapic-generator-java/issues/739)) ([7d8c62d](https://www.github.com/googleapis/gapic-generator-java/commit/7d8c62d8e8922a3589e631299ecb0287bc41ba2d))
15+
16+
317
### [1.0.8](https://www.github.com/googleapis/gapic-generator-java/compare/v1.0.7...v1.0.8) (2021-05-24)
418

519

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,8 @@ public interface AstNodeVisitor {
6565

6666
public void visit(AssignmentOperationExpr assignmentOperationExpr);
6767

68+
public void visit(LambdaExpr lambdaExpr);
69+
6870
/** =============================== COMMENT =============================== */
6971
public void visit(LineComment lineComment);
7072

Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
// Copyright 2021 Google LLC
2+
//
3+
// Licensed under the Apache License, Version 2.0 (the "License");
4+
// you may not use this file except in compliance with the License.
5+
// You may obtain a copy of the License at
6+
//
7+
// http://www.apache.org/licenses/LICENSE-2.0
8+
//
9+
// Unless required by applicable law or agreed to in writing, software
10+
// distributed under the License is distributed on an "AS IS" BASIS,
11+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
// See the License for the specific language governing permissions and
13+
// limitations under the License.
14+
15+
package com.google.api.generator.engine.ast;
16+
17+
import com.google.auto.value.AutoValue;
18+
import com.google.common.base.Preconditions;
19+
import com.google.common.collect.ImmutableList;
20+
import java.util.Arrays;
21+
import java.util.Collections;
22+
import java.util.List;
23+
import java.util.Set;
24+
import java.util.stream.Collectors;
25+
26+
@AutoValue
27+
public abstract class LambdaExpr implements Expr {
28+
@Override
29+
public TypeNode type() {
30+
// TODO(v2): Support set of FunctionalInterface parameterized on the args and return type,
31+
// which would enable assignment to an appropriate variable.
32+
return TypeNode.VOID;
33+
}
34+
35+
public abstract ImmutableList<VariableExpr> arguments();
36+
37+
public abstract ReturnExpr returnExpr();
38+
39+
public abstract ImmutableList<Statement> body();
40+
41+
@Override
42+
public void accept(AstNodeVisitor visitor) {
43+
visitor.visit(this);
44+
}
45+
46+
public static Builder builder() {
47+
return new AutoValue_LambdaExpr.Builder()
48+
.setArguments(Collections.emptyList())
49+
.setBody(Collections.emptyList());
50+
}
51+
52+
@AutoValue.Builder
53+
public abstract static class Builder {
54+
public Builder setArguments(VariableExpr... arguments) {
55+
return setArguments(Arrays.asList(arguments));
56+
}
57+
58+
public abstract Builder setArguments(List<VariableExpr> arguments);
59+
60+
public abstract Builder setBody(List<Statement> body);
61+
62+
public abstract Builder setReturnExpr(ReturnExpr returnExpr);
63+
64+
public Builder setReturnExpr(Expr expr) {
65+
return setReturnExpr(ReturnExpr.builder().setExpr(expr).build());
66+
}
67+
68+
public abstract LambdaExpr autoBuild();
69+
70+
public LambdaExpr build() {
71+
LambdaExpr lambdaExpr = autoBuild();
72+
Preconditions.checkState(
73+
!lambdaExpr.returnExpr().expr().type().equals(TypeNode.VOID),
74+
"Lambdas cannot return void-typed expressions.");
75+
// Must be a declaration.
76+
lambdaExpr.arguments().stream()
77+
.forEach(
78+
varExpr ->
79+
Preconditions.checkState(
80+
varExpr.isDecl(),
81+
String.format(
82+
"Argument %s must be a variable declaration",
83+
varExpr.variable().identifier())));
84+
// No modifiers allowed.
85+
lambdaExpr.arguments().stream()
86+
.forEach(
87+
varExpr ->
88+
Preconditions.checkState(
89+
varExpr.scope().equals(ScopeNode.LOCAL)
90+
&& !varExpr.isStatic()
91+
&& !varExpr.isFinal()
92+
&& !varExpr.isVolatile(),
93+
String.format(
94+
"Argument %s must have local scope, and cannot have static, final, or"
95+
+ " volatile modifiers",
96+
varExpr.variable().identifier())));
97+
98+
// Check that there aren't any arguments with duplicate names.
99+
List<String> allArgNames =
100+
lambdaExpr.arguments().stream()
101+
.map(v -> v.variable().identifier().name())
102+
.collect(Collectors.toList());
103+
Set<String> duplicateArgNames =
104+
allArgNames.stream()
105+
.filter(n -> Collections.frequency(allArgNames, n) > 1)
106+
.collect(Collectors.toSet());
107+
Preconditions.checkState(
108+
duplicateArgNames.isEmpty(),
109+
String.format(
110+
"Lambda arguments cannot have duplicate names: %s", duplicateArgNames.toString()));
111+
112+
return lambdaExpr;
113+
}
114+
}
115+
}

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

Lines changed: 59 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import java.util.Collections;
2222
import java.util.LinkedHashSet;
2323
import java.util.List;
24+
import java.util.Set;
2425
import java.util.stream.Collectors;
2526
import javax.annotation.Nullable;
2627

@@ -169,6 +170,8 @@ public Builder setReturnExpr(Expr expr) {
169170
// Private accessors.
170171
abstract String name();
171172

173+
abstract ImmutableList<VariableExpr> arguments();
174+
172175
abstract ImmutableList<CommentStatement> headerCommentStatements();
173176

174177
abstract ImmutableList<AnnotationNode> annotations();
@@ -314,28 +317,66 @@ public MethodDefinition build() {
314317
}
315318
}
316319

317-
for (VariableExpr varExpr : method.arguments()) {
318-
Preconditions.checkState(
319-
varExpr.isDecl(),
320-
String.format(
321-
"Argument %s must be a variable declaration", varExpr.variable().identifier()));
322-
}
323-
324-
for (TypeNode exceptionType : method.throwsExceptions()) {
325-
Preconditions.checkState(
326-
TypeNode.isExceptionType(exceptionType),
327-
String.format("Type %s is not an exception type", exceptionType.reference()));
328-
Preconditions.checkState(
329-
!RUNTIME_EXCEPTION_REFERENCE.isAssignableFrom(exceptionType.reference()),
330-
String.format(
331-
"RuntimeException type %s does not need to be thrown",
332-
exceptionType.reference().name()));
333-
}
320+
performArgumentChecks();
321+
performThrownExceptionChecks();
334322

335323
return method;
336324
}
337325

338-
void performNullChecks() {
326+
private void performArgumentChecks() {
327+
// Must be a declaration.
328+
arguments().stream()
329+
.forEach(
330+
varExpr ->
331+
Preconditions.checkState(
332+
varExpr.isDecl(),
333+
String.format(
334+
"Argument %s must be a variable declaration",
335+
varExpr.variable().identifier())));
336+
// No modifiers allowed.
337+
arguments().stream()
338+
.forEach(
339+
varExpr ->
340+
Preconditions.checkState(
341+
varExpr.scope().equals(ScopeNode.LOCAL)
342+
&& !varExpr.isStatic()
343+
&& !varExpr.isVolatile(),
344+
String.format(
345+
"Argument %s must have local scope, and cannot have \"static\" or"
346+
+ " \"volatile\" modifiers",
347+
varExpr.variable().identifier())));
348+
349+
// Check that there aren't any arguments with duplicate names.
350+
List<String> allArgNames =
351+
arguments().stream()
352+
.map(v -> v.variable().identifier().name())
353+
.collect(Collectors.toList());
354+
Set<String> duplicateArgNames =
355+
allArgNames.stream()
356+
.filter(n -> Collections.frequency(allArgNames, n) > 1)
357+
.collect(Collectors.toSet());
358+
Preconditions.checkState(
359+
duplicateArgNames.isEmpty(),
360+
String.format(
361+
"Lambda arguments cannot have duplicate names: %s", duplicateArgNames.toString()));
362+
}
363+
364+
private void performThrownExceptionChecks() {
365+
throwsExceptions().stream()
366+
.forEach(
367+
exceptionType -> {
368+
Preconditions.checkState(
369+
TypeNode.isExceptionType(exceptionType),
370+
String.format("Type %s is not an exception type", exceptionType.reference()));
371+
Preconditions.checkState(
372+
!RUNTIME_EXCEPTION_REFERENCE.isAssignableFrom(exceptionType.reference()),
373+
String.format(
374+
"RuntimeException type %s does not need to be thrown",
375+
exceptionType.reference().name()));
376+
});
377+
}
378+
379+
private void performNullChecks() {
339380
String contextInfo = String.format("method definition of %s", name());
340381
NodeValidator.checkNoNullElements(headerCommentStatements(), "header comments", contextInfo);
341382
NodeValidator.checkNoNullElements(annotations(), "annotations", contextInfo);

src/main/java/com/google/api/generator/engine/writer/ImportWriterVisitor.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
import com.google.api.generator.engine.ast.IfStatement;
3838
import com.google.api.generator.engine.ast.InstanceofExpr;
3939
import com.google.api.generator.engine.ast.JavaDocComment;
40+
import com.google.api.generator.engine.ast.LambdaExpr;
4041
import com.google.api.generator.engine.ast.LineComment;
4142
import com.google.api.generator.engine.ast.LogicalOperationExpr;
4243
import com.google.api.generator.engine.ast.MethodDefinition;
@@ -292,6 +293,13 @@ public void visit(AssignmentOperationExpr assignmentOperationExpr) {
292293
assignmentOperationExpr.valueExpr().accept(this);
293294
}
294295

296+
@Override
297+
public void visit(LambdaExpr lambdaExpr) {
298+
variableExpressions(lambdaExpr.arguments());
299+
statements(lambdaExpr.body());
300+
lambdaExpr.returnExpr().accept(this);
301+
}
302+
295303
/** =============================== STATEMENTS =============================== */
296304
@Override
297305
public void visit(ExprStatement exprStatement) {

src/main/java/com/google/api/generator/engine/writer/JavaWriterVisitor.java

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
import com.google.api.generator.engine.ast.IfStatement;
3838
import com.google.api.generator.engine.ast.InstanceofExpr;
3939
import com.google.api.generator.engine.ast.JavaDocComment;
40+
import com.google.api.generator.engine.ast.LambdaExpr;
4041
import com.google.api.generator.engine.ast.LineComment;
4142
import com.google.api.generator.engine.ast.LogicalOperationExpr;
4243
import com.google.api.generator.engine.ast.MethodDefinition;
@@ -509,6 +510,45 @@ public void visit(AssignmentOperationExpr assignmentOperationExpr) {
509510
assignmentOperationExpr.valueExpr().accept(this);
510511
}
511512

513+
@Override
514+
public void visit(LambdaExpr lambdaExpr) {
515+
if (lambdaExpr.arguments().isEmpty()) {
516+
leftParen();
517+
rightParen();
518+
} else if (lambdaExpr.arguments().size() == 1) {
519+
// Print just the variable.
520+
lambdaExpr.arguments().get(0).variable().identifier().accept(this);
521+
} else {
522+
// Stylistic choice - print the types and variable names for clarity.
523+
leftParen();
524+
int numArguments = lambdaExpr.arguments().size();
525+
for (int i = 0; i < numArguments; i++) {
526+
lambdaExpr.arguments().get(i).accept(this);
527+
if (i < numArguments - 1) {
528+
buffer.append(COMMA);
529+
space();
530+
}
531+
}
532+
rightParen();
533+
}
534+
535+
space();
536+
buffer.append("->");
537+
space();
538+
539+
if (lambdaExpr.body().isEmpty()) {
540+
// Just the return expression - don't render "return".
541+
lambdaExpr.returnExpr().expr().accept(this);
542+
return;
543+
}
544+
545+
leftBrace();
546+
newline();
547+
statements(lambdaExpr.body());
548+
ExprStatement.withExpr(lambdaExpr.returnExpr()).accept(this);
549+
rightBrace();
550+
}
551+
512552
/** =============================== STATEMENTS =============================== */
513553
@Override
514554
public void visit(ExprStatement exprStatement) {

0 commit comments

Comments
 (0)