aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org/zwobble
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/org/zwobble')
-rw-r--r--src/main/java/org/zwobble/couscous/interpreter/UnexpectedValueType.java15
-rw-r--r--src/main/java/org/zwobble/couscous/values/ConcreteType.java10
-rw-r--r--src/main/java/org/zwobble/couscous/values/StringValue.java2
3 files changed, 26 insertions, 1 deletions
diff --git a/src/main/java/org/zwobble/couscous/interpreter/UnexpectedValueType.java b/src/main/java/org/zwobble/couscous/interpreter/UnexpectedValueType.java
new file mode 100644
index 0000000..59ea2d0
--- /dev/null
+++ b/src/main/java/org/zwobble/couscous/interpreter/UnexpectedValueType.java
@@ -0,0 +1,15 @@
+package org.zwobble.couscous.interpreter;
+
+import org.zwobble.couscous.values.ConcreteType;
+
+import lombok.EqualsAndHashCode;
+import lombok.Value;
+
+@Value
+@EqualsAndHashCode(callSuper=false)
+public class UnexpectedValueType extends InterpreterException {
+ private static final long serialVersionUID = 1L;
+
+ ConcreteType<?> expected;
+ ConcreteType<?> actual;
+}
diff --git a/src/main/java/org/zwobble/couscous/values/ConcreteType.java b/src/main/java/org/zwobble/couscous/values/ConcreteType.java
index d45222b..38b1b6e 100644
--- a/src/main/java/org/zwobble/couscous/values/ConcreteType.java
+++ b/src/main/java/org/zwobble/couscous/values/ConcreteType.java
@@ -6,6 +6,7 @@ import java.util.function.BiFunction;
import org.zwobble.couscous.interpreter.Arguments;
import org.zwobble.couscous.interpreter.NoSuchMethod;
+import org.zwobble.couscous.interpreter.UnexpectedValueType;
import org.zwobble.couscous.interpreter.WrongNumberOfArguments;
import com.google.common.collect.ImmutableMap;
@@ -49,6 +50,15 @@ public class ConcreteType<T> {
if (method.getArgumentTypes().size() != arguments.size()) {
throw new WrongNumberOfArguments(method.getArgumentTypes().size(), arguments.size());
}
+
+ for (int index = 0; index < arguments.size(); index++) {
+ val formalArgumentType = method.getArgumentTypes().get(index);
+ val actualArgumentType = arguments.get(index).getType();
+ if (formalArgumentType != actualArgumentType) {
+ throw new UnexpectedValueType(formalArgumentType, actualArgumentType);
+ }
+ }
+
return method.apply((T)receiver, new Arguments(arguments));
}
}
diff --git a/src/main/java/org/zwobble/couscous/values/StringValue.java b/src/main/java/org/zwobble/couscous/values/StringValue.java
index 2d4bf17..0ade0e1 100644
--- a/src/main/java/org/zwobble/couscous/values/StringValue.java
+++ b/src/main/java/org/zwobble/couscous/values/StringValue.java
@@ -7,7 +7,7 @@ import lombok.val;
@Value
public class StringValue implements InterpreterValue {
- private static final ConcreteType<?> TYPE = ConcreteType.<StringValue>builder()
+ public static final ConcreteType<?> TYPE = ConcreteType.<StringValue>builder()
.method("length", asList(), (receiver, arguments) -> new IntegerValue(receiver.value.length()))
.method("substring", asList(IntegerValue.TYPE, IntegerValue.TYPE),