aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java55
-rw-r--r--src/test/java/org/zwobble/couscous/tests/JavaToPythonTests.java13
-rw-r--r--src/test/java/org/zwobble/couscous/tests/frontends/java/JavaReaderTests.java48
-rw-r--r--src/test/resources/java/while-factorial/com/example/WhileFactorial.java12
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;
+ }
+}