aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2016-04-28 22:11:11 +0100
committerMichael Williamson <mike@zwobble.org>2016-04-28 22:11:11 +0100
commitc041a56e321bf0370d6b6e01ef7b12cdbe2ab8e5 (patch)
tree77a66d19e3a87e3df1c0ffee6ae68577305cadff /src/main/java
parent196b5c251a4a5ff348b2b681e334147765a10b80 (diff)
Support method references when return type is void
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/zwobble/couscous/frontends/java/JavaMethodReferenceReader.java14
1 files changed, 8 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) {