diff options
| author | Michael Williamson <mike@zwobble.org> | 2015-10-10 14:37:38 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2015-10-10 14:37:38 +0100 |
| commit | eadefe2a6b7c06905f90cb6598d877e15a10b7de (patch) | |
| tree | 0fe7297b6880951a188ad289692c6c6851c0a47b | |
| parent | 18c923db3dce4d6e59b212e2a19f0d087a899622 (diff) | |
Add parsing of Java static method calls
| -rw-r--r-- | src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java | 22 | ||||
| -rw-r--r-- | src/test/java/org/zwobble/couscous/tests/frontends/java/JavaReaderTests.java | 10 |
2 files changed, 25 insertions, 7 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 a9cef4b..77002d9 100644 --- a/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java +++ b/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java @@ -20,6 +20,7 @@ import org.zwobble.couscous.ast.LiteralNode; import org.zwobble.couscous.ast.MethodCallNode; import org.zwobble.couscous.ast.ReturnNode; import org.zwobble.couscous.ast.StatementNode; +import org.zwobble.couscous.ast.StaticMethodCallNode; import org.zwobble.couscous.ast.TypeName; import com.google.common.collect.Lists; @@ -101,13 +102,20 @@ public class JavaReader { @SuppressWarnings("unchecked") private static ExpressionNode readMethodInvocation(MethodInvocation expression) { - return MethodCallNode.methodCall( - readExpression(expression.getExpression()), - expression.getName().getIdentifier(), - Lists.transform( - (List<Expression>)expression.arguments(), - JavaReader::readExpression), - TypeName.of(expression.resolveTypeBinding().getQualifiedName())); + val methodName = expression.getName().getIdentifier(); + val arguments = Lists.transform( + (List<Expression>)expression.arguments(), + JavaReader::readExpression); + if (expression.getExpression().getNodeType() == ASTNode.SIMPLE_NAME) { + val receiver = expression.getExpression().resolveTypeBinding(); + return StaticMethodCallNode.staticMethodCall(receiver.getQualifiedName(), methodName, arguments); + } else { + return MethodCallNode.methodCall( + readExpression(expression.getExpression()), + methodName, + arguments, + TypeName.of(expression.resolveTypeBinding().getQualifiedName())); + } } private static String generateClassName(CompilationUnit ast) { 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 06331aa..341ee5d 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 @@ -5,6 +5,7 @@ import java.nio.file.Files; import org.junit.Test; import org.zwobble.couscous.ast.ExpressionNode; import org.zwobble.couscous.ast.ReturnNode; +import org.zwobble.couscous.ast.TypeName; import org.zwobble.couscous.frontends.java.JavaReader; import org.zwobble.couscous.values.BooleanValue; @@ -12,6 +13,7 @@ import static java.util.Arrays.asList; import static org.junit.Assert.assertEquals; import static org.zwobble.couscous.ast.LiteralNode.literal; import static org.zwobble.couscous.ast.MethodCallNode.methodCall; +import static org.zwobble.couscous.ast.StaticMethodCallNode.staticMethodCall; import static org.zwobble.couscous.tests.util.ExtraFiles.deleteRecursively; import lombok.SneakyThrows; @@ -25,12 +27,20 @@ public class JavaReaderTests { assertEquals(literal(false), readExpression("false")); assertEquals(literal(42), readExpression("42")); } + @Test public void canReadInstanceMethodCalls() { assertEquals( methodCall(literal("hello"), "startsWith", asList(literal("h")), BooleanValue.REF), readExpression("\"hello\".startsWith(\"h\")")); } + + @Test + public void canReadStaticMethodCalls() { + assertEquals( + staticMethodCall(TypeName.of("java.lang.Integer"), "parseInt", asList(literal("42"))), + readExpression("Integer.parseInt(\"42\")")); + } @SneakyThrows private ExpressionNode readExpression(String expressionSource) { |
