diff options
| author | Michael Williamson <mike@zwobble.org> | 2015-11-14 17:05:04 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2015-11-14 17:05:04 +0000 |
| commit | 196321f77a224909bcda8bed834a9fee4265a8df (patch) | |
| tree | a86fb18b7a4d0a2d66d099f2db5cf1207880b09b /src | |
| parent | 5338a361c6fd8c42e8bd47a637c21c128b122418 (diff) | |
Support assignments with operations
Diffstat (limited to 'src')
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) {" + |
