From 07d4507eca4c950c65fac53fafa3f81d703167d1 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Mon, 12 Oct 2015 20:25:52 +0100 Subject: Support reading Java this expressions --- .../couscous/frontends/java/JavaReader.java | 11 +++++- .../tests/frontends/java/JavaReaderTests.java | 42 ++++++++++++++++++---- 2 files changed, 46 insertions(+), 7 deletions(-) (limited to 'src') 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; @@ -30,6 +32,13 @@ public class JavaReaderTests { assertEquals(literal(42), readExpression("42")); } + @Test + public void canReadThisReference() { + assertEquals( + thisReference(TypeName.of("com.example.Example")), + readExpressionInInstanceMethod("this")); + } + @Test public void canReadInstanceMethodCalls() { assertEquals( @@ -58,14 +67,37 @@ public class JavaReaderTests { readExpression("true ? 1 : 2")); } + @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()); } -- cgit v1.2.3