aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2015-11-14 17:18:57 +0000
committerMichael Williamson <mike@zwobble.org>2015-11-14 17:18:57 +0000
commit4c9a1c8d062c849e34ce0176e60b5cccca65c127 (patch)
treee7cbbf81554e76db6724ab7c09cfa625f20312a5 /src/main/java
parent196321f77a224909bcda8bed834a9fee4265a8df (diff)
Handle boxing correctly in compound assignments
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java36
1 files changed, 29 insertions, 7 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 bf66092..2bf6048 100644
--- a/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java
+++ b/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java
@@ -152,6 +152,10 @@ public class JavaReader {
private static ExpressionNode readExpression(TypeName targetType, Expression expression) {
ExpressionNode couscousExpression = readExpressionWithoutBoxing(expression);
+ return handleBoxing(targetType, couscousExpression);
+ }
+
+ private static ExpressionNode handleBoxing(TypeName targetType, ExpressionNode couscousExpression) {
if (isIntegerBox(targetType, couscousExpression)) {
return StaticMethodCallNode.boxInt(couscousExpression);
} else if (isIntegerUnbox(targetType, couscousExpression)) {
@@ -165,6 +169,16 @@ public class JavaReader {
}
}
+ private static TypeName unboxedType(TypeName type) {
+ if (type.equals(ObjectValues.BOXED_INT)) {
+ return IntegerValue.REF;
+ } else if (type.equals(ObjectValues.BOXED_BOOLEAN)) {
+ return BooleanValue.REF;
+ } else {
+ return type;
+ }
+ }
+
private static boolean isIntegerBox(TypeName targetType, ExpressionNode expression) {
return expression.getType().equals(IntegerValue.REF) &&
!targetType.equals(IntegerValue.REF);
@@ -396,23 +410,31 @@ public class JavaReader {
}
private static ExpressionNode readAssignment(Assignment expression) {
- // TODO: fix boxing
AssignableExpressionNode left = (AssignableExpressionNode)readExpressionWithoutBoxing(expression.getLeftHandSide());
- ExpressionNode right = readExpression(left.getType(), expression.getRightHandSide());
if (expression.getOperator() == Assignment.Operator.ASSIGN) {
+ ExpressionNode right = readExpression(left.getType(), expression.getRightHandSide());
return AssignmentNode.assign(left, right);
} else {
+ ExpressionNode right = readUnboxedExpression(expression.getRightHandSide());
Operator operator = readOperator(expression.getOperator());
return AssignmentNode.assign(
left,
- MethodCallNode.methodCall(
- left,
- operator.getMethodName(),
- asList(right),
- left.getType()));
+ handleBoxing(
+ left.getType(),
+ MethodCallNode.methodCall(
+ readUnboxedExpression(expression.getLeftHandSide()),
+ operator.getMethodName(),
+ asList(right),
+ unboxedType(left.getType()))));
}
}
+ private static ExpressionNode readUnboxedExpression(Expression expression) {
+ return readExpression(
+ unboxedType(typeOf(expression)),
+ expression);
+ }
+
private static Operator readOperator(Assignment.Operator operator) {
if (operator == Assignment.Operator.PLUS_ASSIGN) {
return Operator.ADD;