aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org/zwobble/couscous/frontends
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2016-01-04 23:28:22 +0000
committerMichael Williamson <mike@zwobble.org>2016-01-04 23:28:22 +0000
commit75b69c7f4e7ed84f82c549e36a3928a48720cc26 (patch)
treed400967b67b7e6ec7c922a586ae14c6cda35f6ed /src/main/java/org/zwobble/couscous/frontends
parentbb0b36b86f841ec6340fe6e727ed2ea9db1c2d64 (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.java2
-rw-r--r--src/main/java/org/zwobble/couscous/frontends/java/JavaExpressionReader.java39
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())));
}