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/JavaExpressionReader.java9
-rw-r--r--src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java49
2 files changed, 50 insertions, 8 deletions
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 e5cbf2d..f1af093 100644
--- a/src/main/java/org/zwobble/couscous/frontends/java/JavaExpressionReader.java
+++ b/src/main/java/org/zwobble/couscous/frontends/java/JavaExpressionReader.java
@@ -6,6 +6,7 @@ import org.zwobble.couscous.values.BooleanValue;
import org.zwobble.couscous.values.IntegerValue;
import org.zwobble.couscous.values.ObjectValues;
+import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
@@ -100,6 +101,9 @@ public class JavaExpressionReader {
case ASTNode.CLASS_INSTANCE_CREATION:
return readClassInstanceCreation((ClassInstanceCreation)expression);
+ case ASTNode.LAMBDA_EXPRESSION:
+ return readLambdaExpression((LambdaExpression)expression);
+
case ASTNode.INFIX_EXPRESSION:
return readInfixExpression((InfixExpression)expression);
@@ -198,6 +202,11 @@ public class JavaExpressionReader {
}
}
+ private ExpressionNode readLambdaExpression(LambdaExpression expression) {
+ TypeName anonymousClassName = javaReader.readLambda(expression);
+ return constructorCall(anonymousClassName, Collections.emptyList());
+ }
+
private List<ExpressionNode> readArguments(IMethodBinding method, List<Expression> javaArguments) {
return IntStream.range(0, javaArguments.size())
.mapToObj(index -> readExpression(
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 2395f38..10cc6ec 100644
--- a/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java
+++ b/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java
@@ -2,16 +2,14 @@ package org.zwobble.couscous.frontends.java;
import com.google.common.collect.ImmutableList;
import org.eclipse.jdt.core.dom.*;
-import org.zwobble.couscous.ast.ClassNode;
-import org.zwobble.couscous.ast.ClassNodeBuilder;
-import org.zwobble.couscous.ast.StatementNode;
-import org.zwobble.couscous.ast.TypeName;
+import org.zwobble.couscous.ast.*;
import java.io.IOException;
import java.nio.file.Path;
import java.util.List;
import java.util.Optional;
+import static org.zwobble.couscous.ast.ReturnNode.returns;
import static org.zwobble.couscous.frontends.java.JavaTypes.typeOf;
import static org.zwobble.couscous.util.ExtraLists.cons;
import static org.zwobble.couscous.util.ExtraLists.ofType;
@@ -36,6 +34,33 @@ public class JavaReader {
return readTypeDeclarationBody(name, type.bodyDeclarations());
}
+ TypeName readLambda(LambdaExpression expression) {
+ IMethodBinding methodBinding = expression.resolveMethodBinding();
+ IMethodBinding functionalInterfaceMethod = expression.resolveTypeBinding().getFunctionalInterfaceMethod();
+ TypeName returnType = typeOf(functionalInterfaceMethod.getReturnType());
+
+ ClassNodeBuilder classBuilder = new ClassNodeBuilder(generateClassName(expression));
+ classBuilder.method(functionalInterfaceMethod.getName(), method -> {
+ ASTNode body = expression.getBody();
+ if ((body instanceof Expression)) {
+ method.statement(returns(expressionReader().readExpression(
+ returnType,
+ (Expression)body)));
+ } else {
+ throw new UnsupportedOperationException();
+ }
+ return method;
+ });
+
+ ClassNode classNode = classBuilder.build();
+ classes.add(classNode);
+ return classNode.getName();
+ }
+
+ private String generateClassName(LambdaExpression expression) {
+ return generateClassName(expression.resolveMethodBinding().getDeclaringClass());
+ }
+
TypeName readAnonymousClass(AnonymousClassDeclaration declaration) {
String name = generateClassName(declaration);
ClassNode classNode = readTypeDeclarationBody(name, declaration.bodyDeclarations());
@@ -45,6 +70,10 @@ public class JavaReader {
private String generateClassName(AnonymousClassDeclaration declaration) {
ITypeBinding type = declaration.resolveBinding();
+ return generateClassName(type);
+ }
+
+ private String generateClassName(ITypeBinding type) {
while (type.isAnonymous()) {
type = type.getDeclaringClass();
}
@@ -63,20 +92,20 @@ public class JavaReader {
readField(field, classBuilder);
}
}
-
+
private void readField(FieldDeclaration field, ClassNodeBuilder classBuilder) {
for (Object fragment : field.fragments()) {
String name = ((VariableDeclarationFragment)fragment).getName().getIdentifier();
classBuilder.field(name, typeOf(field.getType()));
}
}
-
+
private void readMethods(List<MethodDeclaration> methods, ClassNodeBuilder classBuilder) {
for (MethodDeclaration method : methods) {
readMethod(classBuilder, method);
}
}
-
+
private void readMethod(ClassNodeBuilder classBuilder, MethodDeclaration method) {
if (method.isConstructor()) {
classBuilder.constructor(builder -> buildMethod(method, builder));
@@ -99,7 +128,7 @@ public class JavaReader {
Optional<TypeName> returnType = method.getReturnType2() == null
? Optional.empty()
: Optional.of(typeOf(method.getReturnType2()));
- JavaStatementReader statementReader = new JavaStatementReader(new JavaExpressionReader(this), returnType);
+ JavaStatementReader statementReader = new JavaStatementReader(expressionReader(), returnType);
for (Object statement : method.getBody().statements()) {
for (StatementNode intermediateStatement : statementReader.readStatement((Statement)statement)) {
builder.statement(intermediateStatement);
@@ -112,4 +141,8 @@ public class JavaReader {
TypeDeclaration type = (TypeDeclaration)ast.types().get(0);
return ast.getPackage().getName().getFullyQualifiedName() + "." + type.getName().getFullyQualifiedName();
}
+
+ private JavaExpressionReader expressionReader() {
+ return new JavaExpressionReader(this);
+ }
} \ No newline at end of file