diff options
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(); |
