diff options
| author | Michael Williamson <mike@zwobble.org> | 2016-01-04 23:28:22 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2016-01-04 23:28:22 +0000 |
| commit | 75b69c7f4e7ed84f82c549e36a3928a48720cc26 (patch) | |
| tree | d400967b67b7e6ec7c922a586ae14c6cda35f6ed /src/main/java/org/zwobble/couscous/frontends | |
| parent | bb0b36b86f841ec6340fe6e727ed2ea9db1c2d64 (diff) | |
Move type coercion decisions into the backends
Diffstat (limited to 'src/main/java/org/zwobble/couscous/frontends')
| -rw-r--r-- | src/main/java/org/zwobble/couscous/frontends/java/JavaExpressionMethodReferenceReader.java | 2 | ||||
| -rw-r--r-- | src/main/java/org/zwobble/couscous/frontends/java/JavaExpressionReader.java | 39 |
2 files changed, 8 insertions, 33 deletions
diff --git a/src/main/java/org/zwobble/couscous/frontends/java/JavaExpressionMethodReferenceReader.java b/src/main/java/org/zwobble/couscous/frontends/java/JavaExpressionMethodReferenceReader.java index 6c49d4e..d9a55e3 100644 --- a/src/main/java/org/zwobble/couscous/frontends/java/JavaExpressionMethodReferenceReader.java +++ b/src/main/java/org/zwobble/couscous/frontends/java/JavaExpressionMethodReferenceReader.java @@ -30,7 +30,7 @@ public class JavaExpressionMethodReferenceReader { return lambda( formalArguments, - ImmutableList.of(returns(JavaExpressionReader.handleBoxing( + ImmutableList.of(returns(JavaExpressionReader.coerceExpression( typeOf(functionalInterfaceMethod.getReturnType()), generateValue(scope, expression, formalArguments))))); } diff --git a/src/main/java/org/zwobble/couscous/frontends/java/JavaExpressionReader.java b/src/main/java/org/zwobble/couscous/frontends/java/JavaExpressionReader.java index 367a34f..0e910a1 100644 --- a/src/main/java/org/zwobble/couscous/frontends/java/JavaExpressionReader.java +++ b/src/main/java/org/zwobble/couscous/frontends/java/JavaExpressionReader.java @@ -14,6 +14,7 @@ import static java.util.Arrays.asList; import static org.zwobble.couscous.ast.ConstructorCallNode.constructorCall; import static org.zwobble.couscous.ast.LiteralNode.literal; import static org.zwobble.couscous.ast.MethodCallNode.not; +import static org.zwobble.couscous.ast.TypeCoercionNode.typeCoercion; import static org.zwobble.couscous.frontends.java.JavaOperators.readOperator; import static org.zwobble.couscous.frontends.java.JavaTypes.typeOf; import static org.zwobble.couscous.util.ExtraLists.concat; @@ -29,20 +30,14 @@ public class JavaExpressionReader { ExpressionNode readExpression(TypeName targetType, Expression expression) { ExpressionNode couscousExpression = readExpressionWithoutBoxing(expression); - return handleBoxing(targetType, couscousExpression); + return coerceExpression(targetType, couscousExpression); } - static ExpressionNode handleBoxing(TypeName targetType, ExpressionNode couscousExpression) { - if (isIntegerBox(targetType, couscousExpression)) { - return StaticMethodCallNode.boxInt(couscousExpression); - } else if (isIntegerUnbox(targetType, couscousExpression)) { - return StaticMethodCallNode.unboxInt(couscousExpression); - } else if (isBooleanBox(targetType, couscousExpression)) { - return StaticMethodCallNode.boxBoolean(couscousExpression); - } else if (isBooleanUnbox(targetType, couscousExpression)) { - return StaticMethodCallNode.unboxBoolean(couscousExpression); - } else { + static ExpressionNode coerceExpression(TypeName targetType, ExpressionNode couscousExpression) { + if (targetType.equals(couscousExpression.getType())) { return couscousExpression; + } else { + return typeCoercion(couscousExpression, targetType); } } @@ -56,26 +51,6 @@ public class JavaExpressionReader { } } - private static boolean isIntegerBox(TypeName targetType, ExpressionNode expression) { - return expression.getType().equals(IntegerValue.REF) && - !targetType.equals(IntegerValue.REF); - } - - private static boolean isIntegerUnbox(TypeName targetType, ExpressionNode expression) { - return !expression.getType().equals(IntegerValue.REF) && - targetType.equals(IntegerValue.REF); - } - - private static boolean isBooleanBox(TypeName targetType, ExpressionNode expression) { - return expression.getType().equals(BooleanValue.REF) && - !targetType.equals(BooleanValue.REF); - } - - private static boolean isBooleanUnbox(TypeName targetType, ExpressionNode expression) { - return !expression.getType().equals(BooleanValue.REF) && - targetType.equals(BooleanValue.REF); - } - ExpressionNode readExpressionWithoutBoxing(Expression expression) { switch (expression.getNodeType()) { case ASTNode.BOOLEAN_LITERAL: @@ -308,7 +283,7 @@ public class JavaExpressionReader { Operator operator = readOperator(expression.getOperator()); return AssignmentNode.assign( left, - handleBoxing( + coerceExpression( left.getType(), readPrimitiveOperation(operator, expression.getLeftHandSide(), expression.getRightHandSide()))); } |
