aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2015-10-12 20:25:52 +0100
committerMichael Williamson <mike@zwobble.org>2015-10-12 20:25:52 +0100
commit07d4507eca4c950c65fac53fafa3f81d703167d1 (patch)
tree9d13e4eccf100acd79c3513d479306ea6345d633
parentcb97484d4694c94946a109fd6d09252767fa1652 (diff)
Support reading Java this expressions
-rw-r--r--src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java11
-rw-r--r--src/test/java/org/zwobble/couscous/tests/frontends/java/JavaReaderTests.java42
2 files changed, 46 insertions, 7 deletions
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 3306dbf..10d6e10 100644
--- a/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java
+++ b/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java
@@ -14,6 +14,7 @@ import org.eclipse.jdt.core.dom.NumberLiteral;
import org.eclipse.jdt.core.dom.ReturnStatement;
import org.eclipse.jdt.core.dom.Statement;
import org.eclipse.jdt.core.dom.StringLiteral;
+import org.eclipse.jdt.core.dom.ThisExpression;
import org.eclipse.jdt.core.dom.TypeDeclaration;
import org.zwobble.couscous.ast.ClassNode;
import org.zwobble.couscous.ast.ClassNodeBuilder;
@@ -25,6 +26,7 @@ import org.zwobble.couscous.ast.ReturnNode;
import org.zwobble.couscous.ast.StatementNode;
import org.zwobble.couscous.ast.StaticMethodCallNode;
import org.zwobble.couscous.ast.TernaryConditionalNode;
+import org.zwobble.couscous.ast.ThisReferenceNode;
import org.zwobble.couscous.ast.TypeName;
import com.google.common.collect.Lists;
@@ -85,6 +87,8 @@ public class JavaReader {
return readNumberLiteral((NumberLiteral)expression);
case ASTNode.STRING_LITERAL:
return readStringLiteral((StringLiteral)expression);
+ case ASTNode.THIS_EXPRESSION:
+ return readThisExpression((ThisExpression)expression);
case ASTNode.METHOD_INVOCATION:
return readMethodInvocation((MethodInvocation)expression);
case ASTNode.CLASS_INSTANCE_CREATION:
@@ -95,7 +99,7 @@ public class JavaReader {
throw new RuntimeException("Unsupported expression: " + expression.getClass());
}
}
-
+
private static ExpressionNode readBooleanLiteral(BooleanLiteral expression) {
return LiteralNode.literal(expression.booleanValue());
}
@@ -108,6 +112,11 @@ public class JavaReader {
return LiteralNode.literal(expression.getLiteralValue());
}
+ private static ExpressionNode readThisExpression(ThisExpression expression) {
+ return ThisReferenceNode.thisReference(
+ TypeName.of(expression.resolveTypeBinding().getQualifiedName()));
+ }
+
private static ExpressionNode readMethodInvocation(MethodInvocation expression) {
val methodName = expression.getName().getIdentifier();
val arguments = readArguments(expression.arguments());
diff --git a/src/test/java/org/zwobble/couscous/tests/frontends/java/JavaReaderTests.java b/src/test/java/org/zwobble/couscous/tests/frontends/java/JavaReaderTests.java
index cb2a707..ebfe068 100644
--- a/src/test/java/org/zwobble/couscous/tests/frontends/java/JavaReaderTests.java
+++ b/src/test/java/org/zwobble/couscous/tests/frontends/java/JavaReaderTests.java
@@ -3,6 +3,7 @@ package org.zwobble.couscous.tests.frontends.java;
import java.nio.file.Files;
import org.junit.Test;
+import org.zwobble.couscous.ast.ClassNode;
import org.zwobble.couscous.ast.ExpressionNode;
import org.zwobble.couscous.ast.ReturnNode;
import org.zwobble.couscous.ast.TernaryConditionalNode;
@@ -16,6 +17,7 @@ import static org.zwobble.couscous.ast.ConstructorCallNode.constructorCall;
import static org.zwobble.couscous.ast.LiteralNode.literal;
import static org.zwobble.couscous.ast.MethodCallNode.methodCall;
import static org.zwobble.couscous.ast.StaticMethodCallNode.staticMethodCall;
+import static org.zwobble.couscous.ast.ThisReferenceNode.thisReference;
import static org.zwobble.couscous.tests.util.ExtraFiles.deleteRecursively;
import lombok.SneakyThrows;
@@ -31,6 +33,13 @@ public class JavaReaderTests {
}
@Test
+ public void canReadThisReference() {
+ assertEquals(
+ thisReference(TypeName.of("com.example.Example")),
+ readExpressionInInstanceMethod("this"));
+ }
+
+ @Test
public void canReadInstanceMethodCalls() {
assertEquals(
methodCall(literal("hello"), "startsWith", asList(literal("h")), BooleanValue.REF),
@@ -59,13 +68,36 @@ public class JavaReaderTests {
}
@SneakyThrows
+ private ExpressionNode readExpressionInInstanceMethod(String expressionSource) {
+ val javaClass =
+ "public Object main() {" +
+ " return " + expressionSource + ";" +
+ "}";
+
+ val classNode = readClass(javaClass);
+ val returnStatement = (ReturnNode) classNode.getMethods().get(0).getBody().get(0);
+ return returnStatement.getValue();
+ }
+
+ @SneakyThrows
private ExpressionNode readExpression(String expressionSource) {
val javaClass =
+ "public static Object main() {" +
+ " return " + expressionSource + ";" +
+ "}";
+
+ val classNode = readClass(javaClass);
+ val returnStatement = (ReturnNode) classNode.getMethods().get(0).getBody().get(0);
+ return returnStatement.getValue();
+ }
+
+ @SneakyThrows
+ private ClassNode readClass(String classBody) {
+
+ val javaClass =
"package com.example;" +
"public class Example {" +
- " public static Object main() {" +
- " return " + expressionSource + ";" +
- " }" +
+ classBody +
"}";
val directoryPath = Files.createTempDirectory(null);
@@ -75,9 +107,7 @@ public class JavaReaderTests {
Files.write(sourcePath, asList(javaClass));
val reader = new JavaReader();
- val classNode = reader.readClassFromFile(directoryPath, sourcePath);
- val returnStatement = (ReturnNode) classNode.getMethods().get(0).getBody().get(0);
- return returnStatement.getValue();
+ return reader.readClassFromFile(directoryPath, sourcePath);
} finally {
deleteRecursively(directoryPath.toFile());
}