aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2016-03-30 15:05:17 +0100
committerMichael Williamson <mike@zwobble.org>2016-03-30 15:05:17 +0100
commit796d8c95703742d1a6eccf05b2c2271cf58a1262 (patch)
treefc5ece13254675c632fc199804a5261b2182747f /src
parentf33b218de3ff1c3647c7cb76e642dac1e5ff225c (diff)
Remove duplication between toLambda for different method references
Diffstat (limited to 'src')
-rw-r--r--src/main/java/org/zwobble/couscous/frontends/java/JavaExpressionMethodReferenceReader.java32
1 files changed, 19 insertions, 13 deletions
diff --git a/src/main/java/org/zwobble/couscous/frontends/java/JavaExpressionMethodReferenceReader.java b/src/main/java/org/zwobble/couscous/frontends/java/JavaExpressionMethodReferenceReader.java
index 970daa7..c95e84b 100644
--- a/src/main/java/org/zwobble/couscous/frontends/java/JavaExpressionMethodReferenceReader.java
+++ b/src/main/java/org/zwobble/couscous/frontends/java/JavaExpressionMethodReferenceReader.java
@@ -10,6 +10,7 @@ import org.zwobble.couscous.types.Type;
import org.zwobble.couscous.types.Types;
import java.util.List;
+import java.util.function.Function;
import static org.zwobble.couscous.ast.ConstructorCallNode.constructorCall;
import static org.zwobble.couscous.ast.MethodCallNode.methodCall;
@@ -28,27 +29,33 @@ public class JavaExpressionMethodReferenceReader {
}
public Lambda toLambda(Scope scope, ExpressionMethodReference expression) {
- IMethodBinding functionalInterfaceMethod = expression.resolveTypeBinding().getFunctionalInterfaceMethod();
- List<FormalArgumentNode> formalArguments = formalArguments(scope, functionalInterfaceMethod);
-
- return lambda(
- formalArguments,
- list(returns(JavaExpressionReader.coerceExpression(
- typeOf(functionalInterfaceMethod.getReturnType()),
- generateValue(scope, expression, formalArguments)))));
+ return toLambda(
+ scope,
+ expression,
+ arguments -> generateValue(scope, expression, arguments));
}
public Lambda toLambda(Scope scope, CreationReference expression) {
+ return toLambda(
+ scope,
+ expression,
+ arguments -> constructorCall(typeOf(expression.getType()), arguments));
+ }
+
+ private Lambda toLambda(
+ Scope scope,
+ MethodReference expression,
+ Function<List<ExpressionNode>, ExpressionNode> generateValue)
+ {
IMethodBinding functionalInterfaceMethod = expression.resolveTypeBinding().getFunctionalInterfaceMethod();
List<FormalArgumentNode> formalArguments = formalArguments(scope, functionalInterfaceMethod);
+ List<ExpressionNode> arguments = eagerMap(formalArguments, VariableReferenceNode::reference);
return lambda(
formalArguments,
list(returns(JavaExpressionReader.coerceExpression(
typeOf(functionalInterfaceMethod.getReturnType()),
- constructorCall(
- typeOf(functionalInterfaceMethod.getReturnType()),
- eagerMap(formalArguments, VariableReferenceNode::reference))))));
+ generateValue.apply(arguments)))));
}
private List<FormalArgumentNode> formalArguments(Scope scope, IMethodBinding functionalInterfaceMethod) {
@@ -63,10 +70,9 @@ public class JavaExpressionMethodReferenceReader {
return arguments.build();
}
- private ExpressionNode generateValue(Scope scope, ExpressionMethodReference expression, List<FormalArgumentNode> formalArguments) {
+ private ExpressionNode generateValue(Scope scope, ExpressionMethodReference expression, List<ExpressionNode> arguments) {
IMethodBinding methodBinding = expression.resolveMethodBinding();
String methodName = expression.getName().getIdentifier();
- List<ExpressionNode> arguments = eagerMap(formalArguments, VariableReferenceNode::reference);
Type type = typeOf(methodBinding.getReturnType());
if (Modifier.isStatic(methodBinding.getModifiers())) {