aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main/java/org/zwobble/couscous/ast/MethodCallNode.java2
-rw-r--r--src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java38
-rw-r--r--src/test/java/org/zwobble/couscous/tests/JavaToPythonTests.java1
-rw-r--r--src/test/java/org/zwobble/couscous/tests/frontends/java/JavaReaderTests.java26
4 files changed, 59 insertions, 8 deletions
diff --git a/src/main/java/org/zwobble/couscous/ast/MethodCallNode.java b/src/main/java/org/zwobble/couscous/ast/MethodCallNode.java
index 9ad750b..371ec2d 100644
--- a/src/main/java/org/zwobble/couscous/ast/MethodCallNode.java
+++ b/src/main/java/org/zwobble/couscous/ast/MethodCallNode.java
@@ -39,7 +39,7 @@ public class MethodCallNode implements ExpressionNode {
return integerOperation(Operator.MOD.getMethodName(), left, right);
}
- private static MethodCallNode integerOperation(String methodName, ExpressionNode left, ExpressionNode right) {
+ public static MethodCallNode integerOperation(String methodName, ExpressionNode left, ExpressionNode right) {
return methodCall(left, methodName, asList(right), IntegerValue.REF);
}
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 941c50e..bf66092 100644
--- a/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java
+++ b/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java
@@ -17,7 +17,6 @@ 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;
import static org.zwobble.couscous.ast.VariableReferenceNode.reference;
import static org.zwobble.couscous.ast.WhileNode.whileLoop;
@@ -397,12 +396,39 @@ public class JavaReader {
}
private static ExpressionNode readAssignment(Assignment expression) {
- ExpressionNode left = readExpressionWithoutBoxing(expression.getLeftHandSide());
- return AssignmentNode.assign(
- (AssignableExpressionNode)left,
- readExpression(left.getType(), expression.getRightHandSide()));
+ // TODO: fix boxing
+ AssignableExpressionNode left = (AssignableExpressionNode)readExpressionWithoutBoxing(expression.getLeftHandSide());
+ ExpressionNode right = readExpression(left.getType(), expression.getRightHandSide());
+ if (expression.getOperator() == Assignment.Operator.ASSIGN) {
+ return AssignmentNode.assign(left, right);
+ } else {
+ Operator operator = readOperator(expression.getOperator());
+ return AssignmentNode.assign(
+ left,
+ MethodCallNode.methodCall(
+ left,
+ operator.getMethodName(),
+ asList(right),
+ left.getType()));
+ }
}
-
+
+ private static Operator readOperator(Assignment.Operator operator) {
+ if (operator == Assignment.Operator.PLUS_ASSIGN) {
+ return Operator.ADD;
+ } else if (operator == Assignment.Operator.MINUS_ASSIGN) {
+ return Operator.SUBTRACT;
+ } else if (operator == Assignment.Operator.TIMES_ASSIGN) {
+ return Operator.MULTIPLY;
+ } else if (operator == Assignment.Operator.DIVIDE_ASSIGN) {
+ return Operator.DIVIDE;
+ } else if (operator == Assignment.Operator.REMAINDER_ASSIGN) {
+ return Operator.MOD;
+ } else {
+ throw new RuntimeException("Unrecognised operator: " + operator);
+ }
+ }
+
private static String generateClassName(CompilationUnit ast) {
TypeDeclaration type = (TypeDeclaration)ast.types().get(0);
return ast.getPackage().getName().getFullyQualifiedName() + "." + type.getName().getFullyQualifiedName();
diff --git a/src/test/java/org/zwobble/couscous/tests/JavaToPythonTests.java b/src/test/java/org/zwobble/couscous/tests/JavaToPythonTests.java
index fa6322f..f17f42b 100644
--- a/src/test/java/org/zwobble/couscous/tests/JavaToPythonTests.java
+++ b/src/test/java/org/zwobble/couscous/tests/JavaToPythonTests.java
@@ -60,7 +60,6 @@ public class JavaToPythonTests {
}
@Test
- @Ignore("WIP")
public void whileFactorial() throws Exception {
assertEquals(
value(720),
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 3f06f49..6f116cc 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
@@ -354,6 +354,32 @@ public class JavaReaderTests {
}
@Test
+ public void canReadCompoundAssignmentOperations() {
+ canReadCompoundAssignmentOperation("+=", Operator.ADD);
+ canReadCompoundAssignmentOperation("-=", Operator.SUBTRACT);
+ canReadCompoundAssignmentOperation("*=", Operator.MULTIPLY);
+ canReadCompoundAssignmentOperation("/=", Operator.DIVIDE);
+ canReadCompoundAssignmentOperation("%=", Operator.MOD);
+ }
+
+ private void canReadCompoundAssignmentOperation(String symbol, Operator operator) {
+ ClassNode classNode = readClass(
+ "public void go(int value) {" +
+ " value " + symbol + " 2;" +
+ "}");
+
+ 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),
+ integerOperation(operator.getMethodName(), reference(argument), literal(2))),
+ statement.getExpression());
+ }
+
+ @Test
public void canReadPrefixDecrement() {
ClassNode classNode = readClass(
"public void go(int value) {" +