From 1d0a3733d2b311e3b9547a9952d2b4362cdb43a8 Mon Sep 17 00:00:00 2001 From: Min Zhu Date: Fri, 1 Jul 2022 18:10:39 +0000 Subject: [PATCH 1/5] infer type from return expr, which would enable assignment to an appropriate variable. --- .../api/generator/engine/ast/LambdaExpr.java | 20 +++++++++++-------- .../generator/engine/ast/LambdaExprTest.java | 10 ++++++++++ 2 files changed, 22 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/google/api/generator/engine/ast/LambdaExpr.java b/src/main/java/com/google/api/generator/engine/ast/LambdaExpr.java index bb1bc1a397..cf930ced46 100644 --- a/src/main/java/com/google/api/generator/engine/ast/LambdaExpr.java +++ b/src/main/java/com/google/api/generator/engine/ast/LambdaExpr.java @@ -26,11 +26,7 @@ @AutoValue public abstract class LambdaExpr implements Expr { @Override - public TypeNode type() { - // TODO(v2): Support set of FunctionalInterface parameterized on the args and return type, - // which would enable assignment to an appropriate variable. - return TypeNode.VOID; - } + public abstract TypeNode type(); public abstract ImmutableList arguments(); @@ -46,17 +42,22 @@ public void accept(AstNodeVisitor visitor) { public static Builder builder() { return new AutoValue_LambdaExpr.Builder() .setArguments(Collections.emptyList()) - .setBody(Collections.emptyList()); + .setBody(Collections.emptyList()) + .setType(TypeNode.VOID); } @AutoValue.Builder public abstract static class Builder { + abstract Builder setType(TypeNode type); + public Builder setArguments(VariableExpr... arguments) { return setArguments(Arrays.asList(arguments)); } public abstract Builder setArguments(List arguments); + abstract ReturnExpr returnExpr(); + public abstract Builder setBody(List body); public abstract Builder setReturnExpr(ReturnExpr returnExpr); @@ -68,10 +69,13 @@ public Builder setReturnExpr(Expr expr) { public abstract LambdaExpr autoBuild(); public LambdaExpr build() { - LambdaExpr lambdaExpr = autoBuild(); Preconditions.checkState( - !lambdaExpr.returnExpr().expr().type().equals(TypeNode.VOID), + !returnExpr().expr().type().equals(TypeNode.VOID), "Lambdas cannot return void-typed expressions."); + + setType(returnExpr().expr().type()); + + LambdaExpr lambdaExpr = autoBuild(); // Must be a declaration. lambdaExpr.arguments().stream() .forEach( diff --git a/src/test/java/com/google/api/generator/engine/ast/LambdaExprTest.java b/src/test/java/com/google/api/generator/engine/ast/LambdaExprTest.java index e4ead3cc87..8011d1a89e 100644 --- a/src/test/java/com/google/api/generator/engine/ast/LambdaExprTest.java +++ b/src/test/java/com/google/api/generator/engine/ast/LambdaExprTest.java @@ -14,6 +14,7 @@ package com.google.api.generator.engine.ast; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertThrows; import java.util.Arrays; @@ -27,6 +28,15 @@ public void validLambdaExpr_noArguments() { .build(); } + @Test + public void validLambdaExpr_inferTypeFromReturnExpr() { + LambdaExpr lambdaExpr = + LambdaExpr.builder() + .setReturnExpr(ValueExpr.withValue(StringObjectValue.withValue("foo"))) + .build(); + assertEquals(TypeNode.STRING, lambdaExpr.type()); + } + @Test public void validLambdaExpr_severalArguments() { VariableExpr argOneVarExpr = From 24f05f6d6aa0e9080955640c56e70a7c2fd09ac7 Mon Sep 17 00:00:00 2001 From: Min Zhu Date: Wed, 6 Jul 2022 20:26:38 +0000 Subject: [PATCH 2/5] add test. --- .../engine/writer/JavaWriterVisitorTest.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/test/java/com/google/api/generator/engine/writer/JavaWriterVisitorTest.java b/src/test/java/com/google/api/generator/engine/writer/JavaWriterVisitorTest.java index 39e448a263..75f25c5b94 100644 --- a/src/test/java/com/google/api/generator/engine/writer/JavaWriterVisitorTest.java +++ b/src/test/java/com/google/api/generator/engine/writer/JavaWriterVisitorTest.java @@ -2345,6 +2345,23 @@ public void writeLambdaExpr_noParameters() { assertEquals("() -> \"foo\"", writerVisitor.write()); } + @Test + public void writeLambdaExpr_assignToVariable() { + LambdaExpr lambdaExpr = + LambdaExpr.builder() + .setReturnExpr(ValueExpr.withValue(StringObjectValue.withValue("foo"))) + .build(); + AssignmentExpr assignmentExpr = + AssignmentExpr.builder() + .setVariableExpr( + VariableExpr.withVariable( + Variable.builder().setName("word").setType(TypeNode.STRING).build())) + .setValueExpr(lambdaExpr) + .build(); + assignmentExpr.accept(writerVisitor); + assertEquals("word = () -> \"foo\"", writerVisitor.write()); + } + @Test public void writeLambdaExpr_oneParameter() { VariableExpr argVarExpr = From 1de792f26a329edd20680778035155dafe2b948f Mon Sep 17 00:00:00 2001 From: Min Zhu Date: Wed, 6 Jul 2022 21:01:00 +0000 Subject: [PATCH 3/5] removed as already defined in Expr interface. --- .../java/com/google/api/generator/engine/ast/LambdaExpr.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/com/google/api/generator/engine/ast/LambdaExpr.java b/src/main/java/com/google/api/generator/engine/ast/LambdaExpr.java index cf930ced46..2020fdcdca 100644 --- a/src/main/java/com/google/api/generator/engine/ast/LambdaExpr.java +++ b/src/main/java/com/google/api/generator/engine/ast/LambdaExpr.java @@ -25,8 +25,6 @@ @AutoValue public abstract class LambdaExpr implements Expr { - @Override - public abstract TypeNode type(); public abstract ImmutableList arguments(); From 5f360a71278203c1553572e04b85b9a617e55123 Mon Sep 17 00:00:00 2001 From: Min Zhu Date: Fri, 8 Jul 2022 15:10:21 +0000 Subject: [PATCH 4/5] revert removal of type() override. --- .../java/com/google/api/generator/engine/ast/LambdaExpr.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/com/google/api/generator/engine/ast/LambdaExpr.java b/src/main/java/com/google/api/generator/engine/ast/LambdaExpr.java index 2020fdcdca..cf930ced46 100644 --- a/src/main/java/com/google/api/generator/engine/ast/LambdaExpr.java +++ b/src/main/java/com/google/api/generator/engine/ast/LambdaExpr.java @@ -25,6 +25,8 @@ @AutoValue public abstract class LambdaExpr implements Expr { + @Override + public abstract TypeNode type(); public abstract ImmutableList arguments(); From 6a898d5bfc89ddc710ecda94dbe56e48b002c23d Mon Sep 17 00:00:00 2001 From: Min Zhu Date: Fri, 8 Jul 2022 16:43:38 +0000 Subject: [PATCH 5/5] instead of modifying type in builder, set directly to concrete method type(). --- .../api/generator/engine/ast/LambdaExpr.java | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/google/api/generator/engine/ast/LambdaExpr.java b/src/main/java/com/google/api/generator/engine/ast/LambdaExpr.java index cf930ced46..dde9989825 100644 --- a/src/main/java/com/google/api/generator/engine/ast/LambdaExpr.java +++ b/src/main/java/com/google/api/generator/engine/ast/LambdaExpr.java @@ -26,7 +26,9 @@ @AutoValue public abstract class LambdaExpr implements Expr { @Override - public abstract TypeNode type(); + public TypeNode type() { + return returnExpr().expr().type(); + } public abstract ImmutableList arguments(); @@ -42,22 +44,17 @@ public void accept(AstNodeVisitor visitor) { public static Builder builder() { return new AutoValue_LambdaExpr.Builder() .setArguments(Collections.emptyList()) - .setBody(Collections.emptyList()) - .setType(TypeNode.VOID); + .setBody(Collections.emptyList()); } @AutoValue.Builder public abstract static class Builder { - abstract Builder setType(TypeNode type); - public Builder setArguments(VariableExpr... arguments) { return setArguments(Arrays.asList(arguments)); } public abstract Builder setArguments(List arguments); - abstract ReturnExpr returnExpr(); - public abstract Builder setBody(List body); public abstract Builder setReturnExpr(ReturnExpr returnExpr); @@ -69,13 +66,10 @@ public Builder setReturnExpr(Expr expr) { public abstract LambdaExpr autoBuild(); public LambdaExpr build() { + LambdaExpr lambdaExpr = autoBuild(); Preconditions.checkState( - !returnExpr().expr().type().equals(TypeNode.VOID), + !lambdaExpr.returnExpr().expr().type().equals(TypeNode.VOID), "Lambdas cannot return void-typed expressions."); - - setType(returnExpr().expr().type()); - - LambdaExpr lambdaExpr = autoBuild(); // Must be a declaration. lambdaExpr.arguments().stream() .forEach(