diff options
| author | Michael Williamson <mike@zwobble.org> | 2015-10-12 20:25:52 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2015-10-12 20:25:52 +0100 |
| commit | 07d4507eca4c950c65fac53fafa3f81d703167d1 (patch) | |
| tree | 9d13e4eccf100acd79c3513d479306ea6345d633 /src | |
| parent | cb97484d4694c94946a109fd6d09252767fa1652 (diff) | |
Support reading Java this expressions
Diffstat (limited to 'src')
| -rw-r--r-- | src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java | 11 | ||||
| -rw-r--r-- | src/test/java/org/zwobble/couscous/tests/frontends/java/JavaReaderTests.java | 42 |
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()); } |
