From cb97484d4694c94946a109fd6d09252767fa1652 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sat, 10 Oct 2015 14:46:18 +0100 Subject: Support Java constructor calls --- .../couscous/frontends/java/JavaReader.java | 22 ++++++++++++++++++---- .../tests/frontends/java/JavaReaderTests.java | 8 ++++++++ 2 files changed, 26 insertions(+), 4 deletions(-) (limited to 'src') 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 1ab6dfb..3306dbf 100644 --- a/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java +++ b/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java @@ -5,6 +5,7 @@ import java.util.List; import org.eclipse.jdt.core.dom.ASTNode; import org.eclipse.jdt.core.dom.BooleanLiteral; +import org.eclipse.jdt.core.dom.ClassInstanceCreation; import org.eclipse.jdt.core.dom.CompilationUnit; import org.eclipse.jdt.core.dom.ConditionalExpression; import org.eclipse.jdt.core.dom.Expression; @@ -16,6 +17,7 @@ import org.eclipse.jdt.core.dom.StringLiteral; import org.eclipse.jdt.core.dom.TypeDeclaration; import org.zwobble.couscous.ast.ClassNode; import org.zwobble.couscous.ast.ClassNodeBuilder; +import org.zwobble.couscous.ast.ConstructorCallNode; import org.zwobble.couscous.ast.ExpressionNode; import org.zwobble.couscous.ast.LiteralNode; import org.zwobble.couscous.ast.MethodCallNode; @@ -85,6 +87,8 @@ public class JavaReader { return readStringLiteral((StringLiteral)expression); case ASTNode.METHOD_INVOCATION: return readMethodInvocation((MethodInvocation)expression); + case ASTNode.CLASS_INSTANCE_CREATION: + return readClassInstanceCreation((ClassInstanceCreation)expression); case ASTNode.CONDITIONAL_EXPRESSION: return readConditionalExpression((ConditionalExpression)expression); default: @@ -104,12 +108,9 @@ public class JavaReader { return LiteralNode.literal(expression.getLiteralValue()); } - @SuppressWarnings("unchecked") private static ExpressionNode readMethodInvocation(MethodInvocation expression) { val methodName = expression.getName().getIdentifier(); - val arguments = Lists.transform( - (List)expression.arguments(), - JavaReader::readExpression); + val arguments = readArguments(expression.arguments()); if (expression.getExpression().getNodeType() == ASTNode.SIMPLE_NAME) { val receiver = expression.getExpression().resolveTypeBinding(); return StaticMethodCallNode.staticMethodCall(receiver.getQualifiedName(), methodName, arguments); @@ -122,6 +123,19 @@ public class JavaReader { } } + private static ExpressionNode readClassInstanceCreation(ClassInstanceCreation expression) { + return ConstructorCallNode.constructorCall( + TypeName.of(expression.resolveTypeBinding().getQualifiedName()), + readArguments(expression.arguments())); + } + + @SuppressWarnings({ "unchecked", "rawtypes" }) + private static List readArguments(final List javaArguments) { + return Lists.transform( + (List)javaArguments, + JavaReader::readExpression); + } + private static ExpressionNode readConditionalExpression(ConditionalExpression expression) { return new TernaryConditionalNode( readExpression(expression.getExpression()), 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 efcd337..cb2a707 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 @@ -12,6 +12,7 @@ import org.zwobble.couscous.values.BooleanValue; import static java.util.Arrays.asList; import static org.junit.Assert.assertEquals; +import static org.zwobble.couscous.ast.ConstructorCallNode.constructorCall; import static org.zwobble.couscous.ast.LiteralNode.literal; import static org.zwobble.couscous.ast.MethodCallNode.methodCall; import static org.zwobble.couscous.ast.StaticMethodCallNode.staticMethodCall; @@ -43,6 +44,13 @@ public class JavaReaderTests { readExpression("Integer.parseInt(\"42\")")); } + @Test + public void canReadConstructorCalls() { + assertEquals( + constructorCall(TypeName.of("java.lang.String"), asList(literal("_"), literal(42))), + readExpression("new String(\"_\", 42)")); + } + @Test public void canReadTernaryConditionals() { assertEquals( -- cgit v1.2.3