aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org/zwobble
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2015-10-06 17:31:52 +0100
committerMichael Williamson <mike@zwobble.org>2015-10-06 17:31:52 +0100
commita467e016fb02acb3e6bdb38eefc72e77499e9c74 (patch)
treeab63986fa52854ca59ca8011e9a60570a2350ccc /src/main/java/org/zwobble
parentcf3b2cfd72f61fa3e4fdb13ebcfb70927c052599 (diff)
Put type checking in one place
Diffstat (limited to 'src/main/java/org/zwobble')
-rw-r--r--src/main/java/org/zwobble/couscous/interpreter/Environment.java5
-rw-r--r--src/main/java/org/zwobble/couscous/interpreter/InterpreterTypes.java16
-rw-r--r--src/main/java/org/zwobble/couscous/interpreter/values/ConcreteType.java7
-rw-r--r--src/main/java/org/zwobble/couscous/interpreter/values/ObjectInterpreterValue.java6
4 files changed, 21 insertions, 13 deletions
diff --git a/src/main/java/org/zwobble/couscous/interpreter/Environment.java b/src/main/java/org/zwobble/couscous/interpreter/Environment.java
index 0bbc808..d91664d 100644
--- a/src/main/java/org/zwobble/couscous/interpreter/Environment.java
+++ b/src/main/java/org/zwobble/couscous/interpreter/Environment.java
@@ -72,10 +72,7 @@ public class Environment {
private void checkVariableType(int variableId, InterpreterValue value) {
val variableType = stackFrame.get(variableId).getType();
- val valueType = value.getType().getName();
- if (!variableType.equals(valueType)) {
- throw new UnexpectedValueType(variableType, valueType);
- }
+ InterpreterTypes.checkIsInstance(variableType, value);
}
@AllArgsConstructor(staticName="of")
diff --git a/src/main/java/org/zwobble/couscous/interpreter/InterpreterTypes.java b/src/main/java/org/zwobble/couscous/interpreter/InterpreterTypes.java
new file mode 100644
index 0000000..cc66cb6
--- /dev/null
+++ b/src/main/java/org/zwobble/couscous/interpreter/InterpreterTypes.java
@@ -0,0 +1,16 @@
+package org.zwobble.couscous.interpreter;
+
+import org.zwobble.couscous.ast.TypeName;
+import org.zwobble.couscous.interpreter.values.InterpreterValue;
+
+public class InterpreterTypes {
+ public static void checkIsInstance(TypeName type, InterpreterValue value) {
+ checkIsSubType(type, value.getType().getName());
+ }
+
+ private static void checkIsSubType(TypeName superType, TypeName subType) {
+ if (!superType.equals(subType)) {
+ throw new UnexpectedValueType(superType, subType);
+ }
+ }
+}
diff --git a/src/main/java/org/zwobble/couscous/interpreter/values/ConcreteType.java b/src/main/java/org/zwobble/couscous/interpreter/values/ConcreteType.java
index 93dd651..6332b89 100644
--- a/src/main/java/org/zwobble/couscous/interpreter/values/ConcreteType.java
+++ b/src/main/java/org/zwobble/couscous/interpreter/values/ConcreteType.java
@@ -11,9 +11,9 @@ import org.zwobble.couscous.ast.FormalArgumentNode;
import org.zwobble.couscous.ast.TypeName;
import org.zwobble.couscous.interpreter.Environment;
import org.zwobble.couscous.interpreter.Executor;
+import org.zwobble.couscous.interpreter.InterpreterTypes;
import org.zwobble.couscous.interpreter.NoSuchMethod;
import org.zwobble.couscous.interpreter.PositionalArguments;
-import org.zwobble.couscous.interpreter.UnexpectedValueType;
import org.zwobble.couscous.interpreter.WrongNumberOfArguments;
import org.zwobble.couscous.util.Casts;
@@ -208,10 +208,7 @@ public class ConcreteType {
for (int index = 0; index < arguments.size(); index++) {
val formalArgumentType = method.getArgumentTypes().get(index);
- val actualArgumentType = arguments.get(index).getType();
- if (!formalArgumentType.equals(actualArgumentType.getName())) {
- throw new UnexpectedValueType(formalArgumentType, actualArgumentType.getName());
- }
+ InterpreterTypes.checkIsInstance(formalArgumentType, arguments.get(index));
}
}
diff --git a/src/main/java/org/zwobble/couscous/interpreter/values/ObjectInterpreterValue.java b/src/main/java/org/zwobble/couscous/interpreter/values/ObjectInterpreterValue.java
index f0ecbd1..6e653d2 100644
--- a/src/main/java/org/zwobble/couscous/interpreter/values/ObjectInterpreterValue.java
+++ b/src/main/java/org/zwobble/couscous/interpreter/values/ObjectInterpreterValue.java
@@ -4,8 +4,8 @@ import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
+import org.zwobble.couscous.interpreter.InterpreterTypes;
import org.zwobble.couscous.interpreter.NoSuchField;
-import org.zwobble.couscous.interpreter.UnexpectedValueType;
import org.zwobble.couscous.values.PrimitiveValue;
import lombok.val;
@@ -40,9 +40,7 @@ public class ObjectInterpreterValue implements InterpreterValue {
public void setField(String fieldName, InterpreterValue value) {
val field = type.getField(fieldName).orElseThrow(() -> new NoSuchField(fieldName));
- if (!field.getType().equals(value.getType().getName())) {
- throw new UnexpectedValueType(field.getType(), value.getType().getName());
- }
+ InterpreterTypes.checkIsInstance(field.getType(), value);
fields.put(fieldName, value);
}
}