diff options
Diffstat (limited to 'src/main/java/org/zwobble/couscous/values')
| -rw-r--r-- | src/main/java/org/zwobble/couscous/values/ConcreteType.java | 10 | ||||
| -rw-r--r-- | src/main/java/org/zwobble/couscous/values/StringValue.java | 2 |
2 files changed, 11 insertions, 1 deletions
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), |
