aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/org')
-rw-r--r--src/main/java/org/zwobble/couscous/frontends/java/JavaExpressionMethodReferenceReader.java19
-rw-r--r--src/main/java/org/zwobble/couscous/frontends/java/JavaExpressionReader.java10
-rw-r--r--src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java7
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,