diff options
| author | Michael Williamson <mike@zwobble.org> | 2016-03-30 15:00:45 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2016-03-30 15:00:45 +0100 |
| commit | f33b218de3ff1c3647c7cb76e642dac1e5ff225c (patch) | |
| tree | 3d3d18ad3e929908a7374d2f03a2098e754afebd /src/main | |
| parent | 63dc7ca2d4576c9ba3887abb5d858d6fd1d93957 (diff) | |
Read constructor references
Diffstat (limited to 'src/main')
3 files changed, 32 insertions, 4 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 9f30467..970daa7 100644 --- a/src/main/java/org/zwobble/couscous/frontends/java/JavaExpressionMethodReferenceReader.java +++ b/src/main/java/org/zwobble/couscous/frontends/java/JavaExpressionMethodReferenceReader.java @@ -1,10 +1,7 @@ package org.zwobble.couscous.frontends.java; 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.eclipse.jdt.core.dom.Modifier; +import org.eclipse.jdt.core.dom.*; import org.zwobble.couscous.ast.ExpressionNode; import org.zwobble.couscous.ast.FormalArgumentNode; import org.zwobble.couscous.ast.VariableReferenceNode; @@ -14,6 +11,7 @@ import org.zwobble.couscous.types.Types; import java.util.List; +import static org.zwobble.couscous.ast.ConstructorCallNode.constructorCall; import static org.zwobble.couscous.ast.MethodCallNode.methodCall; import static org.zwobble.couscous.ast.MethodCallNode.staticMethodCall; import static org.zwobble.couscous.ast.ReturnNode.returns; @@ -40,6 +38,19 @@ public class JavaExpressionMethodReferenceReader { generateValue(scope, expression, formalArguments))))); } + public Lambda toLambda(Scope scope, CreationReference expression) { + IMethodBinding functionalInterfaceMethod = expression.resolveTypeBinding().getFunctionalInterfaceMethod(); + List<FormalArgumentNode> formalArguments = formalArguments(scope, functionalInterfaceMethod); + + return lambda( + formalArguments, + list(returns(JavaExpressionReader.coerceExpression( + typeOf(functionalInterfaceMethod.getReturnType()), + constructorCall( + typeOf(functionalInterfaceMethod.getReturnType()), + eagerMap(formalArguments, VariableReferenceNode::reference)))))); + } + private List<FormalArgumentNode> formalArguments(Scope scope, IMethodBinding functionalInterfaceMethod) { ImmutableList.Builder<FormalArgumentNode> arguments = ImmutableList.builder(); diff --git a/src/main/java/org/zwobble/couscous/frontends/java/JavaExpressionReader.java b/src/main/java/org/zwobble/couscous/frontends/java/JavaExpressionReader.java index 8020174..4cb4c5c 100644 --- a/src/main/java/org/zwobble/couscous/frontends/java/JavaExpressionReader.java +++ b/src/main/java/org/zwobble/couscous/frontends/java/JavaExpressionReader.java @@ -98,6 +98,9 @@ public class JavaExpressionReader { case ASTNode.EXPRESSION_METHOD_REFERENCE: return readExpressionMethodReference((ExpressionMethodReference)expression); + case ASTNode.CREATION_REFERENCE: + return readCreationReference((CreationReference)expression); + case ASTNode.INFIX_EXPRESSION: return readInfixExpression((InfixExpression)expression); @@ -251,6 +254,13 @@ public class JavaExpressionReader { captureArguments(closure).asList()); } + private ExpressionNode readCreationReference(CreationReference expression) { + GeneratedClosure closure = javaReader.readCreationReference(scope, expression); + return constructorCall( + closure.getType(), + captureArguments(closure).asList()); + } + private InsertionOrderSet<? extends ExpressionNode> captureArguments(GeneratedClosure closure) { return closure.getCaptures(); } 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 b145b65..037d1d2 100644 --- a/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java +++ b/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java @@ -123,6 +123,13 @@ public class JavaReader { scope -> new JavaExpressionMethodReferenceReader(this).toLambda(scope, expression)); } + GeneratedClosure readCreationReference(Scope outerScope, CreationReference expression) { + return readLambda( + outerScope, + expression, + scope -> new JavaExpressionMethodReferenceReader(this).toLambda(scope, expression)); + } + GeneratedClosure readLambda(Scope outerScope, LambdaExpression expression) { return readLambda( outerScope, |
