diff options
| author | Michael Williamson <mike@zwobble.org> | 2016-01-10 20:10:54 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2016-01-10 20:10:54 +0000 |
| commit | e1d8a9727e1a84ddfa5b38e8f8a433b7105bc6bd (patch) | |
| tree | 698286dde058e0cbdfdf75da9a04c97e2a7f278e /src/main/java | |
| parent | d0e09b193e96f573231254ca60d5a62c65b6d232 (diff) | |
Implements casts in the interpreter
Diffstat (limited to 'src/main/java')
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; + } +} |
