aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2015-10-10 14:37:38 +0100
committerMichael Williamson <mike@zwobble.org>2015-10-10 14:37:38 +0100
commiteadefe2a6b7c06905f90cb6598d877e15a10b7de (patch)
tree0fe7297b6880951a188ad289692c6c6851c0a47b /src
parent18c923db3dce4d6e59b212e2a19f0d087a899622 (diff)
Add parsing of Java static method calls
Diffstat (limited to 'src')
-rw-r--r--src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java22
-rw-r--r--src/test/java/org/zwobble/couscous/tests/frontends/java/JavaReaderTests.java10
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) {