aboutsummaryrefslogtreecommitdiff
path: root/src/main
diff options
context:
space:
mode:
Diffstat (limited to 'src/main')
-rw-r--r--src/main/java/org/zwobble/couscous/interpreter/Evaluator.java6
-rw-r--r--src/main/java/org/zwobble/couscous/interpreter/InterpreterTypes.java2
-rw-r--r--src/main/java/org/zwobble/couscous/interpreter/InvalidCast.java22
3 files changed, 28 insertions, 2 deletions
diff --git a/src/main/java/org/zwobble/couscous/interpreter/Evaluator.java b/src/main/java/org/zwobble/couscous/interpreter/Evaluator.java
index d90b78b..56ccca7 100644
--- a/src/main/java/org/zwobble/couscous/interpreter/Evaluator.java
+++ b/src/main/java/org/zwobble/couscous/interpreter/Evaluator.java
@@ -125,7 +125,11 @@ public class Evaluator implements ExpressionNodeMapper<InterpreterValue> {
@Override
public InterpreterValue visit(CastNode cast) {
- throw new UnsupportedOperationException();
+ InterpreterValue value = eval(cast.getExpression());
+ if (!InterpreterTypes.isSubType(cast.getType(), value.getType())) {
+ throw new InvalidCast(cast.getType(), value.getType().getName());
+ }
+ return value;
}
private static boolean isIntegerBox(TypeCoercionNode typeCoercion) {
diff --git a/src/main/java/org/zwobble/couscous/interpreter/InterpreterTypes.java b/src/main/java/org/zwobble/couscous/interpreter/InterpreterTypes.java
index 1e644c8..71f875d 100644
--- a/src/main/java/org/zwobble/couscous/interpreter/InterpreterTypes.java
+++ b/src/main/java/org/zwobble/couscous/interpreter/InterpreterTypes.java
@@ -16,7 +16,7 @@ public class InterpreterTypes {
}
}
- private static boolean isSubType(TypeName superTypeName, ConcreteType subType) {
+ public static boolean isSubType(TypeName superTypeName, ConcreteType subType) {
return
superTypeName.equals(subType.getName()) ||
superTypeName.equals(ObjectValues.OBJECT) ||
diff --git a/src/main/java/org/zwobble/couscous/interpreter/InvalidCast.java b/src/main/java/org/zwobble/couscous/interpreter/InvalidCast.java
new file mode 100644
index 0000000..1d89ad1
--- /dev/null
+++ b/src/main/java/org/zwobble/couscous/interpreter/InvalidCast.java
@@ -0,0 +1,22 @@
+package org.zwobble.couscous.interpreter;
+
+import org.zwobble.couscous.ast.TypeName;
+
+public class InvalidCast extends RuntimeException {
+ private final TypeName expected;
+ private final TypeName actual;
+
+ public InvalidCast(TypeName expected, TypeName actual) {
+
+ this.expected = expected;
+ this.actual = actual;
+ }
+
+ public TypeName getExpected() {
+ return expected;
+ }
+
+ public TypeName getActual() {
+ return actual;
+ }
+}