From 796d8c95703742d1a6eccf05b2c2271cf58a1262 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Wed, 30 Mar 2016 15:05:17 +0100 Subject: Remove duplication between toLambda for different method references --- .../java/JavaExpressionMethodReferenceReader.java | 32 +++++++++++++--------- 1 file changed, 19 insertions(+), 13 deletions(-) (limited to 'src/main/java/org') 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 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, ExpressionNode> generateValue) + { IMethodBinding functionalInterfaceMethod = expression.resolveTypeBinding().getFunctionalInterfaceMethod(); List formalArguments = formalArguments(scope, functionalInterfaceMethod); + List 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 formalArguments(Scope scope, IMethodBinding functionalInterfaceMethod) { @@ -63,10 +70,9 @@ public class JavaExpressionMethodReferenceReader { return arguments.build(); } - private ExpressionNode generateValue(Scope scope, ExpressionMethodReference expression, List formalArguments) { + private ExpressionNode generateValue(Scope scope, ExpressionMethodReference expression, List arguments) { IMethodBinding methodBinding = expression.resolveMethodBinding(); String methodName = expression.getName().getIdentifier(); - List arguments = eagerMap(formalArguments, VariableReferenceNode::reference); Type type = typeOf(methodBinding.getReturnType()); if (Modifier.isStatic(methodBinding.getModifiers())) { -- cgit v1.2.3