aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/org')
-rw-r--r--src/main/java/org/zwobble/couscous/ast/LocalVariableDeclarationNode.java3
-rw-r--r--src/main/java/org/zwobble/couscous/ast/TypeCoercionNode.java8
-rw-r--r--src/main/java/org/zwobble/couscous/frontends/java/JavaExpressionReader.java16
-rw-r--r--src/main/java/org/zwobble/couscous/frontends/java/JavaMethodReferenceReader.java5
-rw-r--r--src/main/java/org/zwobble/couscous/frontends/java/JavaStatementReader.java4
5 files changed, 17 insertions, 19 deletions
diff --git a/src/main/java/org/zwobble/couscous/ast/LocalVariableDeclarationNode.java b/src/main/java/org/zwobble/couscous/ast/LocalVariableDeclarationNode.java
index 286e8bc..4078adb 100644
--- a/src/main/java/org/zwobble/couscous/ast/LocalVariableDeclarationNode.java
+++ b/src/main/java/org/zwobble/couscous/ast/LocalVariableDeclarationNode.java
@@ -5,6 +5,7 @@ import org.zwobble.couscous.types.Type;
import org.zwobble.couscous.ast.visitors.NodeTransformer;
import org.zwobble.couscous.ast.visitors.StatementNodeMapper;
+import static org.zwobble.couscous.ast.TypeCoercionNode.coerce;
import static org.zwobble.couscous.ast.VariableDeclaration.var;
public class LocalVariableDeclarationNode implements VariableNode, StatementNode {
@@ -19,7 +20,7 @@ public class LocalVariableDeclarationNode implements VariableNode, StatementNode
public static LocalVariableDeclarationNode localVariableDeclaration(
VariableDeclaration declaration,
ExpressionNode initialValue) {
- return new LocalVariableDeclarationNode(declaration, initialValue);
+ return new LocalVariableDeclarationNode(declaration, coerce(initialValue, declaration.getType()));
}
private final VariableDeclaration declaration;
diff --git a/src/main/java/org/zwobble/couscous/ast/TypeCoercionNode.java b/src/main/java/org/zwobble/couscous/ast/TypeCoercionNode.java
index 266b927..721027f 100644
--- a/src/main/java/org/zwobble/couscous/ast/TypeCoercionNode.java
+++ b/src/main/java/org/zwobble/couscous/ast/TypeCoercionNode.java
@@ -5,6 +5,14 @@ import org.zwobble.couscous.ast.visitors.ExpressionNodeMapper;
import org.zwobble.couscous.ast.visitors.NodeTransformer;
public class TypeCoercionNode implements ExpressionNode {
+ public static ExpressionNode coerce(ExpressionNode expression, Type type) {
+ if (type.equals(expression.getType())) {
+ return expression;
+ } else {
+ return new TypeCoercionNode(expression, type);
+ }
+ }
+
public static TypeCoercionNode typeCoercion(ExpressionNode expression, Type type) {
return new TypeCoercionNode(expression, type);
}
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 e9d6195..4c27a75 100644
--- a/src/main/java/org/zwobble/couscous/frontends/java/JavaExpressionReader.java
+++ b/src/main/java/org/zwobble/couscous/frontends/java/JavaExpressionReader.java
@@ -23,7 +23,7 @@ import static org.zwobble.couscous.ast.OperationNode.operation;
import static org.zwobble.couscous.ast.Operations.not;
import static org.zwobble.couscous.ast.StaticReceiver.staticReceiver;
import static org.zwobble.couscous.ast.ThisReferenceNode.thisReference;
-import static org.zwobble.couscous.ast.TypeCoercionNode.typeCoercion;
+import static org.zwobble.couscous.ast.TypeCoercionNode.coerce;
import static org.zwobble.couscous.frontends.java.JavaOperators.readOperator;
import static org.zwobble.couscous.frontends.java.JavaTypes.typeOf;
import static org.zwobble.couscous.types.Types.erasure;
@@ -41,15 +41,7 @@ public class JavaExpressionReader {
ExpressionNode readExpression(Type targetType, Expression expression) {
ExpressionNode couscousExpression = readExpressionWithoutBoxing(expression);
- return coerceExpression(targetType, couscousExpression);
- }
-
- static ExpressionNode coerceExpression(Type targetType, ExpressionNode couscousExpression) {
- if (targetType.equals(couscousExpression.getType())) {
- return couscousExpression;
- } else {
- return typeCoercion(couscousExpression, targetType);
- }
+ return coerce(couscousExpression, targetType);
}
private static Type unboxedType(Type type) {
@@ -387,9 +379,7 @@ public class JavaExpressionReader {
Operator operator = readOperator(expression.getOperator());
return AssignmentNode.assign(
left,
- coerceExpression(
- left.getType(),
- readPrimitiveOperation(operator, list(expression.getLeftHandSide(), expression.getRightHandSide()))));
+ coerce(readPrimitiveOperation(operator, list(expression.getLeftHandSide(), expression.getRightHandSide())), left.getType()));
}
}
diff --git a/src/main/java/org/zwobble/couscous/frontends/java/JavaMethodReferenceReader.java b/src/main/java/org/zwobble/couscous/frontends/java/JavaMethodReferenceReader.java
index d2d5666..db88310 100644
--- a/src/main/java/org/zwobble/couscous/frontends/java/JavaMethodReferenceReader.java
+++ b/src/main/java/org/zwobble/couscous/frontends/java/JavaMethodReferenceReader.java
@@ -16,6 +16,7 @@ import static org.zwobble.couscous.ast.ConstructorCallNode.constructorCall;
import static org.zwobble.couscous.ast.MethodCallNode.methodCall;
import static org.zwobble.couscous.ast.MethodCallNode.staticMethodCall;
import static org.zwobble.couscous.ast.ReturnNode.returns;
+import static org.zwobble.couscous.ast.TypeCoercionNode.coerce;
import static org.zwobble.couscous.ast.sugar.Lambda.lambda;
import static org.zwobble.couscous.frontends.java.JavaTypes.typeOf;
import static org.zwobble.couscous.util.ExtraLists.eagerMap;
@@ -53,9 +54,7 @@ public class JavaMethodReferenceReader {
return lambda(
formalArguments,
- list(returns(JavaExpressionReader.coerceExpression(
- typeOf(functionalInterfaceMethod.getReturnType()),
- generateValue.apply(arguments)))));
+ list(returns(coerce(generateValue.apply(arguments), typeOf(functionalInterfaceMethod.getReturnType())))));
}
private List<FormalArgumentNode> formalArguments(Scope scope, IMethodBinding functionalInterfaceMethod) {
diff --git a/src/main/java/org/zwobble/couscous/frontends/java/JavaStatementReader.java b/src/main/java/org/zwobble/couscous/frontends/java/JavaStatementReader.java
index c668774..4185f88 100644
--- a/src/main/java/org/zwobble/couscous/frontends/java/JavaStatementReader.java
+++ b/src/main/java/org/zwobble/couscous/frontends/java/JavaStatementReader.java
@@ -15,10 +15,10 @@ import static com.google.common.collect.Iterables.tryFind;
import static org.zwobble.couscous.ast.ExpressionStatementNode.expressionStatement;
import static org.zwobble.couscous.ast.IfStatementNode.ifStatement;
import static org.zwobble.couscous.ast.MethodCallNode.methodCall;
+import static org.zwobble.couscous.ast.TypeCoercionNode.coerce;
import static org.zwobble.couscous.ast.VariableReferenceNode.reference;
import static org.zwobble.couscous.ast.WhileNode.whileLoop;
import static org.zwobble.couscous.ast.sugar.SwitchCaseNode.switchCase;
-import static org.zwobble.couscous.frontends.java.JavaExpressionReader.coerceExpression;
import static org.zwobble.couscous.frontends.java.JavaTypes.typeOf;
import static org.zwobble.couscous.util.ExtraLists.*;
import static org.zwobble.couscous.util.Fold.foldRight;
@@ -127,7 +127,7 @@ class JavaStatementReader {
methodCall(
reference(switchValueAssignment),
"equals",
- list(coerceExpression(Types.OBJECT, value)),
+ list(coerce(value, Types.OBJECT)),
Types.BOOLEAN),
currentCase.getStatements(), handle)))
.orElse(handle)));