aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2015-10-17 16:23:14 +0100
committerMichael Williamson <mike@zwobble.org>2015-10-17 16:23:14 +0100
commit36b8ac144eed4fa94c8dd559b449604b0255ffb4 (patch)
treedbd612219868424b8ac23c33962790d7590a1ac4 /src
parent2353887c3cca9a6f4c4bdf6a0005c2d4bd630601 (diff)
Java: read implicit static method calls
Diffstat (limited to 'src')
-rw-r--r--src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java17
-rw-r--r--src/test/java/org/zwobble/couscous/tests/frontends/java/JavaReaderTests.java16
2 files changed, 28 insertions, 5 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 c3898c5..d0b3f17 100644
--- a/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java
+++ b/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java
@@ -15,6 +15,7 @@ import org.eclipse.jdt.core.dom.IBinding;
import org.eclipse.jdt.core.dom.ITypeBinding;
import org.eclipse.jdt.core.dom.IVariableBinding;
import org.eclipse.jdt.core.dom.MethodInvocation;
+import org.eclipse.jdt.core.dom.Modifier;
import org.eclipse.jdt.core.dom.NumberLiteral;
import org.eclipse.jdt.core.dom.ReturnStatement;
import org.eclipse.jdt.core.dom.SimpleName;
@@ -163,11 +164,17 @@ public class JavaReader {
val arguments = readArguments(expression.arguments());
if (expression.getExpression() == null) {
val methodBinding = expression.resolveMethodBinding();
- return MethodCallNode.methodCall(
- ThisReferenceNode.thisReference(typeOf(methodBinding.getDeclaringClass())),
- methodName,
- arguments,
- typeOf(expression));
+ val receiverType = typeOf(methodBinding.getDeclaringClass());
+ if ((methodBinding.getModifiers() & Modifier.STATIC) != 0) {
+ return StaticMethodCallNode.staticMethodCall(
+ receiverType, methodName, arguments);
+ } else {
+ return MethodCallNode.methodCall(
+ ThisReferenceNode.thisReference(receiverType),
+ methodName,
+ arguments,
+ typeOf(expression));
+ }
} else if (expression.getExpression().getNodeType() == ASTNode.SIMPLE_NAME) {
val receiver = expression.getExpression();
return StaticMethodCallNode.staticMethodCall(typeOf(receiver), methodName, 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 0864b74..c62b9a7 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
@@ -101,6 +101,22 @@ public class JavaReaderTests {
}
@Test
+ public void canReadImplicitStaticMethodCalls() {
+ val classNode = readClass(
+ "public static String loop() {" +
+ " return loop();" +
+ "}");
+ val returnNode = (ReturnNode) classNode.getMethods().get(0).getBody().get(0);
+
+ assertEquals(
+ staticMethodCall(
+ TypeName.of("com.example.Example"),
+ "loop",
+ asList()),
+ returnNode.getValue());
+ }
+
+ @Test
public void canReadConstructorCalls() {
assertEquals(
constructorCall(TypeName.of("java.lang.String"), asList(literal("_"), literal(42))),