From c041a56e321bf0370d6b6e01ef7b12cdbe2ab8e5 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Thu, 28 Apr 2016 22:11:11 +0100 Subject: Support method references when return type is void --- .../couscous/frontends/java/JavaMethodReferenceReader.java | 14 ++++++++------ .../tests/frontends/java/InnerTypeReadingTests.java | 9 +++++++++ 2 files changed, 17 insertions(+), 6 deletions(-) (limited to 'src') 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 formalArguments = formalArguments(scope, functionalInterfaceMethod); List 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 body = type.equals(Types.VOID) + ? list(expressionStatement(value)) + : list(returns(coerce(value, type))); + return lambda(formalArguments, body); } private List 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 function = x::toString;"))); } + + @Test + public void expressionMethodReferenceReturningVoidIsReadAsLambda() { + assertEquals( + readTypes(generateMethodSource("void", + "java.util.function.Consumer function = arg0 -> System.out.println(arg0);")), + readTypes(generateMethodSource("void", + "java.util.function.Consumer function = System.out::println;"))); + } } -- cgit v1.2.3