aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org/zwobble
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/org/zwobble')
-rw-r--r--src/main/java/org/zwobble/couscous/frontends/java/GeneratedClosure.java20
-rw-r--r--src/main/java/org/zwobble/couscous/frontends/java/JavaExpressionReader.java20
-rw-r--r--src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java6
3 files changed, 21 insertions, 25 deletions
diff --git a/src/main/java/org/zwobble/couscous/frontends/java/GeneratedClosure.java b/src/main/java/org/zwobble/couscous/frontends/java/GeneratedClosure.java
index 4629fa5..b7059e2 100644
--- a/src/main/java/org/zwobble/couscous/frontends/java/GeneratedClosure.java
+++ b/src/main/java/org/zwobble/couscous/frontends/java/GeneratedClosure.java
@@ -1,10 +1,16 @@
package org.zwobble.couscous.frontends.java;
import org.zwobble.couscous.ast.ClassNode;
+import org.zwobble.couscous.ast.ConstructorCallNode;
+import org.zwobble.couscous.ast.ExpressionNode;
import org.zwobble.couscous.ast.ReferenceNode;
import org.zwobble.couscous.types.ScalarType;
import org.zwobble.couscous.util.InsertionOrderSet;
+import static org.zwobble.couscous.ast.ConstructorCallNode.constructorCall;
+import static org.zwobble.couscous.util.ExtraLists.concat;
+import static org.zwobble.couscous.util.ExtraLists.list;
+
public class GeneratedClosure {
private final ClassNode classNode;
private final InsertionOrderSet<ReferenceNode> captures;
@@ -18,11 +24,17 @@ public class GeneratedClosure {
return classNode;
}
- public ScalarType getType() {
- return classNode.getName();
+ public ConstructorCallNode generateConstructor() {
+ return generateConstructor(list());
}
- public InsertionOrderSet<ReferenceNode> getCaptures() {
- return captures;
+ public ConstructorCallNode generateConstructor(Iterable<ExpressionNode> arguments) {
+ return constructorCall(
+ getType(),
+ concat(captures, arguments));
+ }
+
+ private ScalarType getType() {
+ return classNode.getName();
}
}
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 bb0f64d..290b6d7 100644
--- a/src/main/java/org/zwobble/couscous/frontends/java/JavaExpressionReader.java
+++ b/src/main/java/org/zwobble/couscous/frontends/java/JavaExpressionReader.java
@@ -260,9 +260,7 @@ public class JavaExpressionReader {
if (declaringClass.isAnonymous()) {
GeneratedClosure closure =
javaReader.readAnonymousClass(scope, expression.getAnonymousClassDeclaration());
- return constructorCall(
- closure.getType(),
- concat(captureArguments(closure), arguments));
+ return closure.generateConstructor(arguments);
} else if (declaringClass.isNested() && !Modifier.isStatic(declaringClass.getModifiers())) {
if (expression.getExpression() == null) {
Type type = typeOf(declaringClass);
@@ -282,27 +280,17 @@ public class JavaExpressionReader {
private ExpressionNode readLambdaExpression(LambdaExpression expression) {
GeneratedClosure closure = javaReader.readLambda(scope, expression);
- return constructorCall(
- closure.getType(),
- captureArguments(closure).asList());
+ return closure.generateConstructor();
}
private ExpressionNode readExpressionMethodReference(ExpressionMethodReference expression) {
GeneratedClosure closure = javaReader.readExpressionMethodReference(scope, expression);
- return constructorCall(
- closure.getType(),
- captureArguments(closure).asList());
+ return closure.generateConstructor();
}
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();
+ return closure.generateConstructor();
}
private List<ExpressionNode> readArguments(IMethodBinding method, List<Expression> javaArguments) {
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 fe7646b..8353dac 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 java.util.Arrays.asList;
import static java.util.Collections.emptyList;
import static org.zwobble.couscous.ast.AnnotationNode.annotation;
import static org.zwobble.couscous.ast.AssignmentNode.assignStatement;
-import static org.zwobble.couscous.ast.ConstructorCallNode.constructorCall;
import static org.zwobble.couscous.ast.ConstructorNode.constructor;
import static org.zwobble.couscous.ast.FieldAccessNode.fieldAccess;
import static org.zwobble.couscous.ast.FieldDeclarationNode.field;
@@ -379,13 +378,10 @@ public class JavaReader {
node.getConstructor().getArguments(),
// TODO: use scope of outer class
argument -> scope.formalArgument(argument.getName(), argument.getType()));
- List<ExpressionNode> constructorArguments = ExtraLists.concat(
- closure.getCaptures(),
- lazyMap(methodArguments, argument -> reference(argument)));
MethodNode method = MethodNode.builder("create_" + typeDeclaration.getName().getIdentifier())
.arguments(methodArguments)
.returns(type)
- .statement(returns(constructorCall(type, constructorArguments)))
+ .statement(returns(closure.generateConstructor(lazyMap(methodArguments, argument -> reference(argument)))))
.build();
body.addMethod(method);
return closure.getClassNode();