From 4c9a1c8d062c849e34ce0176e60b5cccca65c127 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sat, 14 Nov 2015 17:18:57 +0000 Subject: Handle boxing correctly in compound assignments --- .../couscous/frontends/java/JavaReader.java | 36 +++++++++++++++++----- 1 file changed, 29 insertions(+), 7 deletions(-) (limited to 'src/main') 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; -- cgit v1.2.3