aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main/java/org/zwobble/couscous/interpreter/values/ObjectInterpreterValue.java8
-rw-r--r--src/test/java/org/zwobble/couscous/tests/interpreter/EvaluatorTests.java20
2 files changed, 27 insertions, 1 deletions
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 7ff8bb1..f0ecbd1 100644
--- a/src/main/java/org/zwobble/couscous/interpreter/values/ObjectInterpreterValue.java
+++ b/src/main/java/org/zwobble/couscous/interpreter/values/ObjectInterpreterValue.java
@@ -5,8 +5,11 @@ import java.util.Map;
import java.util.Optional;
import org.zwobble.couscous.interpreter.NoSuchField;
+import org.zwobble.couscous.interpreter.UnexpectedValueType;
import org.zwobble.couscous.values.PrimitiveValue;
+import lombok.val;
+
public class ObjectInterpreterValue implements InterpreterValue {
private final ConcreteType type;
private final Map<String, InterpreterValue> fields;
@@ -36,7 +39,10 @@ public class ObjectInterpreterValue implements InterpreterValue {
}
public void setField(String fieldName, InterpreterValue value) {
- type.getField(fieldName).orElseThrow(() -> new NoSuchField(fieldName));
+ val field = type.getField(fieldName).orElseThrow(() -> new NoSuchField(fieldName));
+ if (!field.getType().equals(value.getType().getName())) {
+ throw new UnexpectedValueType(field.getType(), value.getType().getName());
+ }
fields.put(fieldName, value);
}
}
diff --git a/src/test/java/org/zwobble/couscous/tests/interpreter/EvaluatorTests.java b/src/test/java/org/zwobble/couscous/tests/interpreter/EvaluatorTests.java
index 7c5594a..808c2a7 100644
--- a/src/test/java/org/zwobble/couscous/tests/interpreter/EvaluatorTests.java
+++ b/src/test/java/org/zwobble/couscous/tests/interpreter/EvaluatorTests.java
@@ -134,6 +134,26 @@ public class EvaluatorTests extends BackendEvalTests {
assertEquals(new NoSuchField("value"), exception);
}
+ @Test
+ public void cannotSetValueOfFieldWithWrongType() {
+ val classNode = ClassNode.builder("com.example.Example")
+ .field("value", IntegerValue.REF)
+ .constructor(constructor -> constructor
+ .statement(assignStatement(
+ fieldAccess(constructor.thisReference(), "value", IntegerValue.REF),
+ literal(""))))
+ .build();
+
+ val exception = assertThrows(UnexpectedValueType.class,
+ () -> evalExpression(
+ asList(classNode),
+ constructorCall(
+ classNode.getName(),
+ asList())));
+
+ assertEquals(new UnexpectedValueType(IntegerValue.REF, StringValue.REF), exception);
+ }
+
private static Environment emptyEnvironment() {
return new Environment(
JavaProject.builder().build(),