From 63956680fa5f6e61210e090036c797d94e4a340c Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sun, 15 Nov 2015 13:40:21 +0000 Subject: Handle boxing in infix expressions more accurately --- .../couscous/frontends/java/JavaReader.java | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) (limited to 'src/main/java') 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 dee5430..32662a6 100644 --- a/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java +++ b/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java @@ -327,10 +327,9 @@ public class JavaReader { } private static ExpressionNode readInfixExpression(InfixExpression expression) { - TypeName operandType = typeOf(expression.getLeftOperand()); - if (operandType.equals(IntegerValue.REF)) { + if (isPrimitiveOperation(expression)) { Operator operator = readOperator(expression.getOperator()); - return readOperation( + return readPrimitiveOperation( operator, expression.getLeftOperand(), expression.getRightOperand()); @@ -347,6 +346,19 @@ public class JavaReader { } } + private static boolean isPrimitiveOperation(InfixExpression expression) { + TypeName leftOperandType = typeOf(expression.getLeftOperand()); + TypeName rightOperandType = typeOf(expression.getRightOperand()); + return isPrimitive(leftOperandType) + || isPrimitive(rightOperandType) + || (expression.getOperator() != InfixExpression.Operator.NOT_EQUALS + && expression.getOperator() != InfixExpression.Operator.EQUALS); + } + + private static boolean isPrimitive(TypeName type) { + return type.equals(BooleanValue.REF) || type.equals(IntegerValue.REF); + } + private static ExpressionNode readPrefixExpression(PrefixExpression expression) { Operator operator = readOperator(expression.getOperator()); return AssignmentNode.assign( @@ -378,11 +390,11 @@ public class JavaReader { left, handleBoxing( left.getType(), - readOperation(operator, expression.getLeftHandSide(), expression.getRightHandSide()))); + readPrimitiveOperation(operator, expression.getLeftHandSide(), expression.getRightHandSide()))); } } - private static ExpressionNode readOperation(Operator operator, Expression leftJava, Expression rightJava) { + private static ExpressionNode readPrimitiveOperation(Operator operator, Expression leftJava, Expression rightJava) { ExpressionNode left = readUnboxedExpression(leftJava); ExpressionNode right = readUnboxedExpression(rightJava); return MethodCallNode.methodCall( -- cgit v1.2.3