diff options
| author | Michael Williamson <mike@zwobble.org> | 2015-10-12 20:33:23 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2015-10-12 20:33:23 +0100 |
| commit | e8e18d765ec1e47825f23d478583b2041dfe7dfe (patch) | |
| tree | 3a442594b8e634282f018d43928c81faf746aaa8 /src | |
| parent | 07d4507eca4c950c65fac53fafa3f81d703167d1 (diff) | |
Read explicit Java field accesses
Diffstat (limited to 'src')
| -rw-r--r-- | src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java | 28 | ||||
| -rw-r--r-- | src/test/java/org/zwobble/couscous/tests/frontends/java/JavaReaderTests.java | 20 |
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 {" + |
