aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org/zwobble
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/org/zwobble')
-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
2 files changed, 33 insertions, 7 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();