diff options
| author | Michael Williamson <mike@zwobble.org> | 2015-10-12 20:49:32 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2015-10-12 20:49:32 +0100 |
| commit | c35c7890249860ea38c4f1324c57cde9ae6afe88 (patch) | |
| tree | 8e0c90538f95efa46556289a27d8795026e697ed | |
| parent | 09c19d4c266ee816d6dd85fe6abe6449cc2018f1 (diff) | |
Support implicit instance method calls
| -rw-r--r-- | src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java | 9 | ||||
| -rw-r--r-- | src/test/java/org/zwobble/couscous/tests/frontends/java/JavaReaderTests.java | 18 |
2 files changed, 26 insertions, 1 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 f39428c..9cb6097 100644 --- a/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java +++ b/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java @@ -156,7 +156,14 @@ public class JavaReader { private static ExpressionNode readMethodInvocation(MethodInvocation expression) { val methodName = expression.getName().getIdentifier(); val arguments = readArguments(expression.arguments()); - if (expression.getExpression().getNodeType() == ASTNode.SIMPLE_NAME) { + if (expression.getExpression() == null) { + val methodBinding = expression.resolveMethodBinding(); + return MethodCallNode.methodCall( + ThisReferenceNode.thisReference(typeOf(methodBinding.getDeclaringClass())), + methodName, + arguments, + typeOf(expression)); + } else if (expression.getExpression().getNodeType() == ASTNode.SIMPLE_NAME) { val receiver = expression.getExpression(); return StaticMethodCallNode.staticMethodCall(typeOf(receiver), methodName, arguments); } else { 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 7859268..57bcaeb 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 @@ -7,6 +7,7 @@ import org.zwobble.couscous.ast.ClassNode; import org.zwobble.couscous.ast.ExpressionNode; import org.zwobble.couscous.ast.ReturnNode; import org.zwobble.couscous.ast.TernaryConditionalNode; +import org.zwobble.couscous.ast.ThisReferenceNode; import org.zwobble.couscous.ast.TypeName; import org.zwobble.couscous.frontends.java.JavaReader; import org.zwobble.couscous.values.BooleanValue; @@ -75,6 +76,23 @@ public class JavaReaderTests { } @Test + public void canReadImplicitInstanceMethodCalls() { + val classNode = readClass( + "public String loop() {" + + " return loop();" + + "}"); + val returnNode = (ReturnNode) classNode.getMethods().get(0).getBody().get(0); + + assertEquals( + methodCall( + ThisReferenceNode.thisReference(TypeName.of("com.example.Example")), + "loop", + asList(), + StringValue.REF), + returnNode.getValue()); + } + + @Test public void canReadStaticMethodCalls() { assertEquals( staticMethodCall(TypeName.of("java.lang.Integer"), "parseInt", asList(literal("42"))), |
