diff options
| author | Michael Williamson <mike@zwobble.org> | 2015-10-17 16:23:14 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2015-10-17 16:23:14 +0100 |
| commit | 36b8ac144eed4fa94c8dd559b449604b0255ffb4 (patch) | |
| tree | dbd612219868424b8ac23c33962790d7590a1ac4 | |
| parent | 2353887c3cca9a6f4c4bdf6a0005c2d4bd630601 (diff) | |
Java: read implicit static method calls
| -rw-r--r-- | src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java | 17 | ||||
| -rw-r--r-- | src/test/java/org/zwobble/couscous/tests/frontends/java/JavaReaderTests.java | 16 |
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))), |
