diff options
| author | Michael Williamson <mike@zwobble.org> | 2016-01-01 20:15:54 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2016-01-01 20:15:54 +0000 |
| commit | f7f5c1926a664da5e449d3dedbcae8f76213c8f9 (patch) | |
| tree | ada9f00eb9ff37665f2f713fc879f768eff593a6 /src/main/java | |
| parent | d5a4fb60e3b62f4dc1b67c83cd62c1a264bb4a12 (diff) | |
Support expression method references with non-static receiver
Diffstat (limited to 'src/main/java')
| -rw-r--r-- | src/main/java/org/zwobble/couscous/frontends/java/JavaExpressionMethodReferenceReader.java | 42 | ||||
| -rw-r--r-- | src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java | 7 |
2 files changed, 38 insertions, 11 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 8780082..6c49d4e 100644 --- a/src/main/java/org/zwobble/couscous/frontends/java/JavaExpressionMethodReferenceReader.java +++ b/src/main/java/org/zwobble/couscous/frontends/java/JavaExpressionMethodReferenceReader.java @@ -4,12 +4,13 @@ import com.google.common.collect.ImmutableList; import org.eclipse.jdt.core.dom.ExpressionMethodReference; import org.eclipse.jdt.core.dom.IMethodBinding; import org.eclipse.jdt.core.dom.ITypeBinding; -import org.zwobble.couscous.ast.FormalArgumentNode; -import org.zwobble.couscous.ast.VariableReferenceNode; +import org.eclipse.jdt.core.dom.Modifier; +import org.zwobble.couscous.ast.*; import org.zwobble.couscous.ast.sugar.Lambda; import java.util.List; +import static org.zwobble.couscous.ast.MethodCallNode.methodCall; import static org.zwobble.couscous.ast.ReturnNode.returns; import static org.zwobble.couscous.ast.StaticMethodCallNode.staticMethodCall; import static org.zwobble.couscous.ast.sugar.Lambda.lambda; @@ -17,7 +18,13 @@ import static org.zwobble.couscous.frontends.java.JavaTypes.typeOf; import static org.zwobble.couscous.util.ExtraLists.eagerMap; public class JavaExpressionMethodReferenceReader { - public static Lambda expressionMethodReferenceToLambda(Scope scope, ExpressionMethodReference expression) { + private final JavaReader javaReader; + + public JavaExpressionMethodReferenceReader(JavaReader javaReader) { + this.javaReader = javaReader; + } + + public Lambda toLambda(Scope scope, ExpressionMethodReference expression) { IMethodBinding functionalInterfaceMethod = expression.resolveTypeBinding().getFunctionalInterfaceMethod(); List<FormalArgumentNode> formalArguments = formalArguments(scope, functionalInterfaceMethod); @@ -25,14 +32,10 @@ public class JavaExpressionMethodReferenceReader { formalArguments, ImmutableList.of(returns(JavaExpressionReader.handleBoxing( typeOf(functionalInterfaceMethod.getReturnType()), - staticMethodCall( - typeOf(expression.resolveMethodBinding().getDeclaringClass()), - expression.getName().getIdentifier(), - eagerMap(formalArguments, VariableReferenceNode::reference), - typeOf(expression.resolveMethodBinding().getReturnType())))))); + generateValue(scope, expression, formalArguments))))); } - private static List<FormalArgumentNode> formalArguments(Scope scope, IMethodBinding functionalInterfaceMethod) { + private List<FormalArgumentNode> formalArguments(Scope scope, IMethodBinding functionalInterfaceMethod) { ImmutableList.Builder<FormalArgumentNode> arguments = ImmutableList.builder(); ITypeBinding[] parameterTypes = functionalInterfaceMethod.getParameterTypes(); @@ -43,4 +46,25 @@ public class JavaExpressionMethodReferenceReader { return arguments.build(); } + + private ExpressionNode generateValue(Scope scope, ExpressionMethodReference expression, List<FormalArgumentNode> formalArguments) { + IMethodBinding methodBinding = expression.resolveMethodBinding(); + String methodName = expression.getName().getIdentifier(); + List<ExpressionNode> arguments = eagerMap(formalArguments, VariableReferenceNode::reference); + TypeName type = typeOf(methodBinding.getReturnType()); + + if (Modifier.isStatic(methodBinding.getModifiers())) { + return staticMethodCall( + typeOf(methodBinding.getDeclaringClass()), + methodName, + arguments, + type); + } else { + return methodCall( + javaReader.readExpressionWithoutBoxing(scope, expression.getExpression()), + methodName, + arguments, + type); + } + } } diff --git a/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java b/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java index 86ad12d..1c53a44 100644 --- a/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java +++ b/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java @@ -31,7 +31,6 @@ import static org.zwobble.couscous.ast.FormalArgumentNode.formalArg; import static org.zwobble.couscous.ast.ThisReferenceNode.thisReference; import static org.zwobble.couscous.ast.VariableReferenceNode.reference; import static org.zwobble.couscous.frontends.java.FreeVariables.findFreeVariables; -import static org.zwobble.couscous.frontends.java.JavaExpressionMethodReferenceReader.expressionMethodReferenceToLambda; import static org.zwobble.couscous.frontends.java.JavaTypes.*; import static org.zwobble.couscous.util.Casts.tryCast; import static org.zwobble.couscous.util.ExtraLists.*; @@ -75,7 +74,7 @@ public class JavaReader { scope, name, expression.resolveTypeBinding().getFunctionalInterfaceMethod(), - expressionMethodReferenceToLambda(scope, expression)); + new JavaExpressionMethodReferenceReader(this).toLambda(scope, expression)); } GeneratedClosure readLambda(Scope outerScope, LambdaExpression expression) { @@ -320,6 +319,10 @@ public class JavaReader { return expressionReader(scope).readExpression(targetType, body); } + ExpressionNode readExpressionWithoutBoxing(Scope scope, Expression body) { + return expressionReader(scope).readExpressionWithoutBoxing(body); + } + private TypeName generateClassName(CompilationUnit ast) { TypeDeclaration type = (TypeDeclaration)ast.types().get(0); String packageName = ast.getPackage().getName().getFullyQualifiedName(); |
