aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2015-10-12 20:33:23 +0100
committerMichael Williamson <mike@zwobble.org>2015-10-12 20:33:23 +0100
commite8e18d765ec1e47825f23d478583b2041dfe7dfe (patch)
tree3a442594b8e634282f018d43928c81faf746aaa8
parent07d4507eca4c950c65fac53fafa3f81d703167d1 (diff)
Read explicit Java field accesses
-rw-r--r--src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java28
-rw-r--r--src/test/java/org/zwobble/couscous/tests/frontends/java/JavaReaderTests.java20
2 files changed, 40 insertions, 8 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 10d6e10..fc42fa0 100644
--- a/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java
+++ b/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java
@@ -9,6 +9,7 @@ import org.eclipse.jdt.core.dom.ClassInstanceCreation;
import org.eclipse.jdt.core.dom.CompilationUnit;
import org.eclipse.jdt.core.dom.ConditionalExpression;
import org.eclipse.jdt.core.dom.Expression;
+import org.eclipse.jdt.core.dom.FieldAccess;
import org.eclipse.jdt.core.dom.MethodInvocation;
import org.eclipse.jdt.core.dom.NumberLiteral;
import org.eclipse.jdt.core.dom.ReturnStatement;
@@ -20,6 +21,7 @@ import org.zwobble.couscous.ast.ClassNode;
import org.zwobble.couscous.ast.ClassNodeBuilder;
import org.zwobble.couscous.ast.ConstructorCallNode;
import org.zwobble.couscous.ast.ExpressionNode;
+import org.zwobble.couscous.ast.FieldAccessNode;
import org.zwobble.couscous.ast.LiteralNode;
import org.zwobble.couscous.ast.MethodCallNode;
import org.zwobble.couscous.ast.ReturnNode;
@@ -89,6 +91,8 @@ public class JavaReader {
return readStringLiteral((StringLiteral)expression);
case ASTNode.THIS_EXPRESSION:
return readThisExpression((ThisExpression)expression);
+ case ASTNode.FIELD_ACCESS:
+ return readFieldAccess((FieldAccess)expression);
case ASTNode.METHOD_INVOCATION:
return readMethodInvocation((MethodInvocation)expression);
case ASTNode.CLASS_INSTANCE_CREATION:
@@ -99,7 +103,7 @@ public class JavaReader {
throw new RuntimeException("Unsupported expression: " + expression.getClass());
}
}
-
+
private static ExpressionNode readBooleanLiteral(BooleanLiteral expression) {
return LiteralNode.literal(expression.booleanValue());
}
@@ -113,28 +117,34 @@ public class JavaReader {
}
private static ExpressionNode readThisExpression(ThisExpression expression) {
- return ThisReferenceNode.thisReference(
- TypeName.of(expression.resolveTypeBinding().getQualifiedName()));
+ return ThisReferenceNode.thisReference(typeOf(expression));
+ }
+
+ private static ExpressionNode readFieldAccess(FieldAccess expression) {
+ return FieldAccessNode.fieldAccess(
+ readExpression(expression.getExpression()),
+ expression.getName().getIdentifier(),
+ typeOf(expression));
}
private static ExpressionNode readMethodInvocation(MethodInvocation expression) {
val methodName = expression.getName().getIdentifier();
val arguments = readArguments(expression.arguments());
if (expression.getExpression().getNodeType() == ASTNode.SIMPLE_NAME) {
- val receiver = expression.getExpression().resolveTypeBinding();
- return StaticMethodCallNode.staticMethodCall(receiver.getQualifiedName(), methodName, arguments);
+ val receiver = expression.getExpression();
+ return StaticMethodCallNode.staticMethodCall(typeOf(receiver), methodName, arguments);
} else {
return MethodCallNode.methodCall(
readExpression(expression.getExpression()),
methodName,
arguments,
- TypeName.of(expression.resolveTypeBinding().getQualifiedName()));
+ typeOf(expression));
}
}
private static ExpressionNode readClassInstanceCreation(ClassInstanceCreation expression) {
return ConstructorCallNode.constructorCall(
- TypeName.of(expression.resolveTypeBinding().getQualifiedName()),
+ typeOf(expression),
readArguments(expression.arguments()));
}
@@ -156,4 +166,8 @@ public class JavaReader {
val type = (TypeDeclaration)ast.types().get(0);
return ast.getPackage().getName().getFullyQualifiedName() + "." + type.getName().getFullyQualifiedName();
}
+
+ private static TypeName typeOf(Expression expression) {
+ return TypeName.of(expression.resolveTypeBinding().getQualifiedName());
+ }
}
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 ebfe068..43723c8 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
@@ -10,10 +10,12 @@ import org.zwobble.couscous.ast.TernaryConditionalNode;
import org.zwobble.couscous.ast.TypeName;
import org.zwobble.couscous.frontends.java.JavaReader;
import org.zwobble.couscous.values.BooleanValue;
+import org.zwobble.couscous.values.StringValue;
import static java.util.Arrays.asList;
import static org.junit.Assert.assertEquals;
import static org.zwobble.couscous.ast.ConstructorCallNode.constructorCall;
+import static org.zwobble.couscous.ast.FieldAccessNode.fieldAccess;
import static org.zwobble.couscous.ast.LiteralNode.literal;
import static org.zwobble.couscous.ast.MethodCallNode.methodCall;
import static org.zwobble.couscous.ast.StaticMethodCallNode.staticMethodCall;
@@ -40,6 +42,23 @@ public class JavaReaderTests {
}
@Test
+ public void canReadExplicitFieldReference() {
+ val classNode = readClass(
+ "private String name;" +
+ "public String getName() {" +
+ " return this.name;" +
+ "}");
+
+ val returnNode = (ReturnNode) classNode.getMethods().get(0).getBody().get(0);
+ assertEquals(
+ fieldAccess(
+ thisReference(TypeName.of("com.example.Example")),
+ "name",
+ StringValue.REF),
+ returnNode.getValue());
+ }
+
+ @Test
public void canReadInstanceMethodCalls() {
assertEquals(
methodCall(literal("hello"), "startsWith", asList(literal("h")), BooleanValue.REF),
@@ -93,7 +112,6 @@ public class JavaReaderTests {
@SneakyThrows
private ClassNode readClass(String classBody) {
-
val javaClass =
"package com.example;" +
"public class Example {" +