From 6605f4e645526061fb6a8552c6288a0244abf05c Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Fri, 1 Jan 2016 17:13:15 +0000 Subject: Split lambda expression reading out --- .../frontends/java/JavaLambdaExpressionReader.java | 58 ++++++++++++++++++++++ .../couscous/frontends/java/JavaReader.java | 53 +++----------------- .../java/JavaVariableDeclarationReader.java | 17 +++++++ 3 files changed, 83 insertions(+), 45 deletions(-) create mode 100644 src/main/java/org/zwobble/couscous/frontends/java/JavaLambdaExpressionReader.java create mode 100644 src/main/java/org/zwobble/couscous/frontends/java/JavaVariableDeclarationReader.java (limited to 'src/main/java/org') diff --git a/src/main/java/org/zwobble/couscous/frontends/java/JavaLambdaExpressionReader.java b/src/main/java/org/zwobble/couscous/frontends/java/JavaLambdaExpressionReader.java new file mode 100644 index 0000000..44a0f2d --- /dev/null +++ b/src/main/java/org/zwobble/couscous/frontends/java/JavaLambdaExpressionReader.java @@ -0,0 +1,58 @@ +package org.zwobble.couscous.frontends.java; + +import org.eclipse.jdt.core.dom.*; +import org.zwobble.couscous.ast.FormalArgumentNode; +import org.zwobble.couscous.ast.StatementNode; +import org.zwobble.couscous.ast.TypeName; +import org.zwobble.couscous.ast.sugar.Lambda; + +import java.util.List; +import java.util.Optional; + +import static java.util.Arrays.asList; +import static org.zwobble.couscous.ast.FormalArgumentNode.formalArg; +import static org.zwobble.couscous.ast.ReturnNode.returns; +import static org.zwobble.couscous.ast.VariableDeclaration.var; +import static org.zwobble.couscous.ast.sugar.Lambda.lambda; +import static org.zwobble.couscous.frontends.java.JavaTypes.typeOf; +import static org.zwobble.couscous.util.ExtraLists.eagerMap; + +public class JavaLambdaExpressionReader { + private final JavaReader reader; + + public JavaLambdaExpressionReader(JavaReader reader) { + this.reader = reader; + } + + public Lambda javaLambdaToLambda(LambdaExpression expression) { + List formalArguments = eagerMap( + (List)expression.parameters(), + this::readLambdaExpressionParameter); + + return lambda(formalArguments, readLambdaExpressionBody(expression)); + } + + private FormalArgumentNode readLambdaExpressionParameter(Object parameter) { + if (parameter instanceof SingleVariableDeclaration) { + return JavaVariableDeclarationReader.read((SingleVariableDeclaration) parameter); + } else { + VariableDeclarationFragment fragment = (VariableDeclarationFragment)parameter; + return formalArg(var( + fragment.resolveBinding().getKey(), + fragment.getName().getIdentifier(), + typeOf(fragment.resolveBinding().getType()))); + } + } + + private List readLambdaExpressionBody(LambdaExpression expression) { + TypeName returnType = typeOf(expression.resolveTypeBinding().getFunctionalInterfaceMethod().getReturnType()); + if (expression.getBody() instanceof Block) { + @SuppressWarnings("unchecked") + List statements = ((Block) expression.getBody()).statements(); + return reader.readStatements(statements, Optional.of(returnType)); + } else { + Expression body = (Expression) expression.getBody(); + return asList(returns(reader.readExpression(returnType, body))); + } + } +} 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 b36ece3..d3c285a 100644 --- a/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java +++ b/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java @@ -26,13 +26,11 @@ import static org.zwobble.couscous.ast.ConstructorNode.constructor; import static org.zwobble.couscous.ast.FieldAccessNode.fieldAccess; import static org.zwobble.couscous.ast.FieldDeclarationNode.field; import static org.zwobble.couscous.ast.FormalArgumentNode.formalArg; -import static org.zwobble.couscous.ast.ReturnNode.returns; import static org.zwobble.couscous.ast.ThisReferenceNode.thisReference; import static org.zwobble.couscous.ast.VariableDeclaration.var; import static org.zwobble.couscous.ast.VariableReferenceNode.reference; -import static org.zwobble.couscous.ast.sugar.Lambda.lambda; -import static org.zwobble.couscous.frontends.java.JavaExpressionMethodReferenceReader.javaExpressionmethodReferenceToLambda; import static org.zwobble.couscous.frontends.java.FreeVariables.findFreeVariables; +import static org.zwobble.couscous.frontends.java.JavaExpressionMethodReferenceReader.javaExpressionmethodReferenceToLambda; import static org.zwobble.couscous.frontends.java.JavaTypes.*; import static org.zwobble.couscous.util.Casts.tryCast; import static org.zwobble.couscous.util.ExtraLists.*; @@ -86,7 +84,7 @@ public class JavaReader { return generateClosure( expression, expression.resolveTypeBinding().getFunctionalInterfaceMethod(), - javaLambdaToLambda(expression)); + new JavaLambdaExpressionReader(this).javaLambdaToLambda(expression)); } GeneratedClosure generateClosure(ASTNode node, IMethodBinding functionalInterfaceMethod, Lambda lambda) { @@ -274,7 +272,7 @@ public class JavaReader { private FunctionDeclaration functionDeclaration(MethodDeclaration method) { @SuppressWarnings("unchecked") List parameters = method.parameters(); - List formalArguments = eagerMap(parameters, this::readSingleVariableDeclaration); + List formalArguments = eagerMap(parameters, JavaVariableDeclarationReader::read); @SuppressWarnings("unchecked") List statements = method.getBody().statements(); Optional returnType = Optional.ofNullable(method.getReturnType2()) @@ -287,42 +285,10 @@ public class JavaReader { readStatements(statements, returnType)); } - private Lambda javaLambdaToLambda(LambdaExpression expression) { - List formalArguments = eagerMap( - (List)expression.parameters(), - this::readLambdaExpressionParameter); - - return lambda(formalArguments, readLambdaExpressionBody(expression)); - } - private AnnotationNode readAnnotation(IAnnotationBinding annotationBinding) { return annotation(typeOf(annotationBinding.getAnnotationType())); } - private FormalArgumentNode readLambdaExpressionParameter(Object parameter) { - if (parameter instanceof SingleVariableDeclaration) { - return readSingleVariableDeclaration((SingleVariableDeclaration) parameter); - } else { - VariableDeclarationFragment fragment = (VariableDeclarationFragment)parameter; - return formalArg(var( - fragment.resolveBinding().getKey(), - fragment.getName().getIdentifier(), - typeOf(fragment.resolveBinding().getType()))); - } - } - - private List readLambdaExpressionBody(LambdaExpression expression) { - TypeName returnType = typeOf(expression.resolveTypeBinding().getFunctionalInterfaceMethod().getReturnType()); - if (expression.getBody() instanceof Block) { - @SuppressWarnings("unchecked") - List statements = ((Block) expression.getBody()).statements(); - return readStatements(statements, Optional.of(returnType)); - } else { - Expression body = (Expression) expression.getBody(); - return asList(returns(expressionReader().readExpression(returnType, body))); - } - } - private class FunctionDeclaration { private final List annotations; private final List formalArguments; @@ -351,11 +317,15 @@ public class JavaReader { } } - private List readStatements(List body, Optional returnType) { + List readStatements(List body, Optional returnType) { JavaStatementReader statementReader = new JavaStatementReader(expressionReader(), returnType); return eagerFlatMap(body, statementReader::readStatement); } + ExpressionNode readExpression(TypeName targetType, Expression body) { + return expressionReader().readExpression(targetType, body); + } + private TypeName generateClassName(CompilationUnit ast) { TypeDeclaration type = (TypeDeclaration)ast.types().get(0); String packageName = ast.getPackage().getName().getFullyQualifiedName(); @@ -363,13 +333,6 @@ public class JavaReader { return TypeName.of(packageName + "." + className); } - private FormalArgumentNode readSingleVariableDeclaration(SingleVariableDeclaration parameter) { - return formalArg(var( - parameter.resolveBinding().getKey(), - parameter.getName().getIdentifier(), - typeOf(parameter.resolveBinding()))); - } - private JavaExpressionReader expressionReader() { return new JavaExpressionReader(this); } diff --git a/src/main/java/org/zwobble/couscous/frontends/java/JavaVariableDeclarationReader.java b/src/main/java/org/zwobble/couscous/frontends/java/JavaVariableDeclarationReader.java new file mode 100644 index 0000000..992475d --- /dev/null +++ b/src/main/java/org/zwobble/couscous/frontends/java/JavaVariableDeclarationReader.java @@ -0,0 +1,17 @@ +package org.zwobble.couscous.frontends.java; + +import org.eclipse.jdt.core.dom.SingleVariableDeclaration; +import org.zwobble.couscous.ast.FormalArgumentNode; + +import static org.zwobble.couscous.ast.FormalArgumentNode.formalArg; +import static org.zwobble.couscous.ast.VariableDeclaration.var; +import static org.zwobble.couscous.frontends.java.JavaTypes.typeOf; + +class JavaVariableDeclarationReader { + static FormalArgumentNode read(SingleVariableDeclaration parameter) { + return formalArg(var( + parameter.resolveBinding().getKey(), + parameter.getName().getIdentifier(), + typeOf(parameter.resolveBinding()))); + } +} -- cgit v1.2.3