aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main/java/org/zwobble/couscous/frontends/java/JavaMethodReferenceReader.java14
-rw-r--r--src/test/java/org/zwobble/couscous/tests/frontends/java/InnerTypeReadingTests.java9
2 files changed, 17 insertions, 6 deletions
diff --git a/src/main/java/org/zwobble/couscous/frontends/java/JavaMethodReferenceReader.java b/src/main/java/org/zwobble/couscous/frontends/java/JavaMethodReferenceReader.java
index c0c98c4..54ab16a 100644
--- a/src/main/java/org/zwobble/couscous/frontends/java/JavaMethodReferenceReader.java
+++ b/src/main/java/org/zwobble/couscous/frontends/java/JavaMethodReferenceReader.java
@@ -2,9 +2,7 @@ package org.zwobble.couscous.frontends.java;
import com.google.common.collect.ImmutableList;
import org.eclipse.jdt.core.dom.*;
-import org.zwobble.couscous.ast.ExpressionNode;
-import org.zwobble.couscous.ast.FormalArgumentNode;
-import org.zwobble.couscous.ast.VariableReferenceNode;
+import org.zwobble.couscous.ast.*;
import org.zwobble.couscous.ast.sugar.Lambda;
import org.zwobble.couscous.types.Type;
import org.zwobble.couscous.types.Types;
@@ -13,6 +11,7 @@ import java.util.List;
import java.util.function.Function;
import static org.zwobble.couscous.ast.ConstructorCallNode.constructorCall;
+import static org.zwobble.couscous.ast.ExpressionStatementNode.expressionStatement;
import static org.zwobble.couscous.ast.MethodCallNode.methodCall;
import static org.zwobble.couscous.ast.MethodCallNode.staticMethodCall;
import static org.zwobble.couscous.ast.ReturnNode.returns;
@@ -52,9 +51,12 @@ public class JavaMethodReferenceReader {
List<FormalArgumentNode> formalArguments = formalArguments(scope, functionalInterfaceMethod);
List<ExpressionNode> arguments = eagerMap(formalArguments, VariableReferenceNode::reference);
- return lambda(
- formalArguments,
- list(returns(coerce(generateValue.apply(arguments), typeOf(functionalInterfaceMethod.getReturnType())))));
+ ExpressionNode value = generateValue.apply(arguments);
+ Type type = typeOf(functionalInterfaceMethod.getReturnType());
+ List<StatementNode> body = type.equals(Types.VOID)
+ ? list(expressionStatement(value))
+ : list(returns(coerce(value, type)));
+ return lambda(formalArguments, body);
}
private List<FormalArgumentNode> formalArguments(Scope scope, IMethodBinding functionalInterfaceMethod) {
diff --git a/src/test/java/org/zwobble/couscous/tests/frontends/java/InnerTypeReadingTests.java b/src/test/java/org/zwobble/couscous/tests/frontends/java/InnerTypeReadingTests.java
index 0c6245c..d2cfa0e 100644
--- a/src/test/java/org/zwobble/couscous/tests/frontends/java/InnerTypeReadingTests.java
+++ b/src/test/java/org/zwobble/couscous/tests/frontends/java/InnerTypeReadingTests.java
@@ -94,4 +94,13 @@ public class InnerTypeReadingTests {
readTypes(generateMethodSource("void",
"Integer x = 0; java.util.function.Supplier<String> function = x::toString;")));
}
+
+ @Test
+ public void expressionMethodReferenceReturningVoidIsReadAsLambda() {
+ assertEquals(
+ readTypes(generateMethodSource("void",
+ "java.util.function.Consumer<String> function = arg0 -> System.out.println(arg0);")),
+ readTypes(generateMethodSource("void",
+ "java.util.function.Consumer<String> function = System.out::println;")));
+ }
}