diff options
Diffstat (limited to 'src')
4 files changed, 102 insertions, 26 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 97474c4..1bdde70 100644 --- a/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java +++ b/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java @@ -16,6 +16,7 @@ import org.zwobble.couscous.values.ObjectValues; import static java.util.Arrays.asList; import static org.zwobble.couscous.ast.ExpressionStatementNode.expressionStatement; +import static org.zwobble.couscous.ast.LiteralNode.literal; import static org.zwobble.couscous.ast.LocalVariableDeclarationNode.localVariableDeclaration; import static org.zwobble.couscous.ast.MethodCallNode.methodCall; import static org.zwobble.couscous.ast.VariableDeclaration.var; @@ -214,6 +215,9 @@ public class JavaReader { case ASTNode.INFIX_EXPRESSION: return readInfixExpression((InfixExpression)expression); + + case ASTNode.PREFIX_EXPRESSION: + return readPrefixExpression((PrefixExpression)expression); case ASTNode.CONDITIONAL_EXPRESSION: return readConditionalExpression((ConditionalExpression)expression); @@ -228,15 +232,15 @@ public class JavaReader { } private static ExpressionNode readBooleanLiteral(BooleanLiteral expression) { - return LiteralNode.literal(expression.booleanValue()); + return literal(expression.booleanValue()); } private static LiteralNode readNumberLiteral(NumberLiteral expression) { - return LiteralNode.literal(Integer.parseInt(expression.getToken())); + return literal(Integer.parseInt(expression.getToken())); } private static ExpressionNode readStringLiteral(StringLiteral expression) { - return LiteralNode.literal(expression.getLiteralValue()); + return literal(expression.getLiteralValue()); } private static ExpressionNode readSimpleName(SimpleName expression) { @@ -336,27 +340,48 @@ public class JavaReader { } } } - - private static JavaOperator readOperator(Operator operator) { - if (operator == Operator.PLUS) { + + private static ExpressionNode readPrefixExpression(PrefixExpression expression) { + JavaOperator operator = readOperator(expression.getOperator()); + return AssignmentNode.assign( + (AssignableExpressionNode) readExpressionWithoutBoxing(expression.getOperand()), + MethodCallNode.methodCall( + readExpression(IntegerValue.REF, expression.getOperand()), + operator.methodName, + asList(literal(1)), + operator.returnValue)); + } + + private static JavaOperator readOperator(PrefixExpression.Operator operator) { + if (operator == PrefixExpression.Operator.INCREMENT) { + return JavaOperator.of("add", IntegerValue.REF); + } else if (operator == PrefixExpression.Operator.DECREMENT) { + return JavaOperator.of("subtract", IntegerValue.REF); + } else { + throw new RuntimeException("Unrecognised operator: " + operator); + } + } + + private static JavaOperator readOperator(InfixExpression.Operator operator) { + if (operator == InfixExpression.Operator.PLUS) { return JavaOperator.of("add", IntegerValue.REF); - } else if (operator == Operator.MINUS) { + } else if (operator == InfixExpression.Operator.MINUS) { return JavaOperator.of("subtract", IntegerValue.REF); - } else if (operator == Operator.TIMES) { + } else if (operator == InfixExpression.Operator.TIMES) { return JavaOperator.of("multiply", IntegerValue.REF); - } else if (operator == Operator.DIVIDE) { + } else if (operator == InfixExpression.Operator.DIVIDE) { return JavaOperator.of("divide", IntegerValue.REF); - } else if (operator == Operator.REMAINDER) { + } else if (operator == InfixExpression.Operator.REMAINDER) { return JavaOperator.of("mod", IntegerValue.REF); - } else if (operator == Operator.EQUALS) { + } else if (operator == InfixExpression.Operator.EQUALS) { return JavaOperator.of("equals", BooleanValue.REF); - } else if (operator == Operator.GREATER) { + } else if (operator == InfixExpression.Operator.GREATER) { return JavaOperator.of("greaterThan", BooleanValue.REF); - } else if (operator == Operator.GREATER_EQUALS) { + } else if (operator == InfixExpression.Operator.GREATER_EQUALS) { return JavaOperator.of("greaterThanOrEqual", BooleanValue.REF); - } else if (operator == Operator.LESS) { + } else if (operator == InfixExpression.Operator.LESS) { return JavaOperator.of("lessThan", BooleanValue.REF); - } else if (operator == Operator.LESS_EQUALS) { + } else if (operator == InfixExpression.Operator.LESS_EQUALS) { return JavaOperator.of("lessThanOrEqual", BooleanValue.REF); } else { throw new RuntimeException("Unrecognised operator: " + operator); diff --git a/src/test/java/org/zwobble/couscous/tests/JavaToPythonTests.java b/src/test/java/org/zwobble/couscous/tests/JavaToPythonTests.java index 271c529..fa6322f 100644 --- a/src/test/java/org/zwobble/couscous/tests/JavaToPythonTests.java +++ b/src/test/java/org/zwobble/couscous/tests/JavaToPythonTests.java @@ -8,6 +8,7 @@ import java.nio.file.Files; import java.nio.file.Path; import java.util.List; +import org.junit.Ignore; import org.junit.Test; import org.zwobble.couscous.CouscousCompiler; import org.zwobble.couscous.ast.TypeName; @@ -57,6 +58,18 @@ public class JavaToPythonTests { "factorial", asList(value(6)))); } + + @Test + @Ignore("WIP") + public void whileFactorial() throws Exception { + assertEquals( + value(720), + execTestProgram( + "while-factorial", + TypeName.of("com.example.WhileFactorial"), + "factorial", + asList(value(6)))); + } private PrimitiveValue execTestProgram( String directoryName, 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 7782fdc..af62c61 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 @@ -6,17 +6,7 @@ import java.util.Collections; import java.util.List; import org.junit.Test; -import org.zwobble.couscous.ast.ClassNode; -import org.zwobble.couscous.ast.ConstructorNode; -import org.zwobble.couscous.ast.ExpressionNode; -import org.zwobble.couscous.ast.FormalArgumentNode; -import org.zwobble.couscous.ast.LocalVariableDeclarationNode; -import org.zwobble.couscous.ast.MethodNode; -import org.zwobble.couscous.ast.ReturnNode; -import org.zwobble.couscous.ast.StatementNode; -import org.zwobble.couscous.ast.StaticMethodCallNode; -import org.zwobble.couscous.ast.ThisReferenceNode; -import org.zwobble.couscous.ast.TypeName; +import org.zwobble.couscous.ast.*; import org.zwobble.couscous.frontends.java.JavaReader; import org.zwobble.couscous.values.BooleanValue; import org.zwobble.couscous.values.IntegerValue; @@ -345,6 +335,42 @@ public class JavaReaderTests { ReturnNode returnNode = (ReturnNode)method.getBody().get(0); assertEquals(reference(argument), returnNode.getValue()); } + + @Test + public void canReadPrefixIncrement() { + ClassNode classNode = readClass( + "public void go(int value) {" + + " ++value;" + + "}"); + + MethodNode method = classNode.getMethods().get(0); + FormalArgumentNode argument = method.getArguments().get(0); + ExpressionStatementNode statement = (ExpressionStatementNode) + classNode.getMethods().get(0).getBody().get(0); + assertEquals( + assign( + reference(argument), + methodCall(reference(argument), "add", asList(literal(1)), IntegerValue.REF)), + statement.getExpression()); + } + + @Test + public void canReadPrefixDecrement() { + ClassNode classNode = readClass( + "public void go(int value) {" + + " --value;" + + "}"); + + MethodNode method = classNode.getMethods().get(0); + FormalArgumentNode argument = method.getArguments().get(0); + ExpressionStatementNode statement = (ExpressionStatementNode) + classNode.getMethods().get(0).getBody().get(0); + assertEquals( + assign( + reference(argument), + methodCall(reference(argument), "subtract", asList(literal(1)), IntegerValue.REF)), + statement.getExpression()); + } @Test public void canReadExpressionStatements() { diff --git a/src/test/resources/java/while-factorial/com/example/WhileFactorial.java b/src/test/resources/java/while-factorial/com/example/WhileFactorial.java new file mode 100644 index 0000000..89e41cc --- /dev/null +++ b/src/test/resources/java/while-factorial/com/example/WhileFactorial.java @@ -0,0 +1,12 @@ +package com.example; + +public class WhileFactorial { + public static int factorial(int n) { + int result = 1; + while (n > 1) { + result *= n; + n--; + } + return result; + } +} |
