aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org/zwobble/couscous/ast
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/org/zwobble/couscous/ast')
-rw-r--r--src/main/java/org/zwobble/couscous/ast/LocalVariableDeclarationNode.java3
-rw-r--r--src/main/java/org/zwobble/couscous/ast/TypeCoercionNode.java8
2 files changed, 10 insertions, 1 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);
}