diff options
| author | Michael Williamson <mike@zwobble.org> | 2016-04-28 22:11:11 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2016-04-28 22:11:11 +0100 |
| commit | c041a56e321bf0370d6b6e01ef7b12cdbe2ab8e5 (patch) | |
| tree | 77a66d19e3a87e3df1c0ffee6ae68577305cadff | |
| parent | 196b5c251a4a5ff348b2b681e334147765a10b80 (diff) | |
Support method references when return type is void
| -rw-r--r-- | src/main/java/org/zwobble/couscous/frontends/java/JavaMethodReferenceReader.java | 14 | ||||
| -rw-r--r-- | src/test/java/org/zwobble/couscous/tests/frontends/java/InnerTypeReadingTests.java | 9 |
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;"))); + } } |
