aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java9
-rw-r--r--src/test/java/org/zwobble/couscous/tests/frontends/java/JavaReaderTests.java18
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"))),