aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org/zwobble/couscous/interpreter/values/InterpreterFields.java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2016-02-11 21:33:25 +0000
committerMichael Williamson <mike@zwobble.org>2016-02-11 21:33:25 +0000
commita34a00ba19f6ffb61762da4629b53b8a633f9d17 (patch)
tree6ae34a92c0dfe9a24df0b7e90da2da263a61f708 /src/main/java/org/zwobble/couscous/interpreter/values/InterpreterFields.java
parent6d02b3e3e6f8da9837a46efda4733bdd89e38aaf (diff)
Implement static constructor and fields in interpreter
Diffstat (limited to 'src/main/java/org/zwobble/couscous/interpreter/values/InterpreterFields.java')
-rw-r--r--src/main/java/org/zwobble/couscous/interpreter/values/InterpreterFields.java36
1 files changed, 36 insertions, 0 deletions
diff --git a/src/main/java/org/zwobble/couscous/interpreter/values/InterpreterFields.java b/src/main/java/org/zwobble/couscous/interpreter/values/InterpreterFields.java
new file mode 100644
index 0000000..fc082a5
--- /dev/null
+++ b/src/main/java/org/zwobble/couscous/interpreter/values/InterpreterFields.java
@@ -0,0 +1,36 @@
+package org.zwobble.couscous.interpreter.values;
+
+import org.zwobble.couscous.interpreter.InterpreterTypes;
+import org.zwobble.couscous.interpreter.errors.NoSuchField;
+import org.zwobble.couscous.interpreter.errors.UnboundField;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class InterpreterFields {
+ // TODO: distinguish static and non-static fields
+
+ private final ConcreteType type;
+ private final Map<String, InterpreterValue> fields;
+
+ public InterpreterFields(ConcreteType type) {
+ this.type = type;
+ this.fields = new HashMap<>();
+ }
+
+ public InterpreterValue getField(String fieldName) {
+ type.getField(fieldName).orElseThrow(() -> new NoSuchField(fieldName));
+ if (fields.containsKey(fieldName)) {
+ return fields.get(fieldName);
+ } else {
+ throw new UnboundField(fieldName);
+ }
+ }
+
+ public void setField(String fieldName, InterpreterValue value) {
+ FieldValue field = type.getField(fieldName)
+ .orElseThrow(() -> new NoSuchField(fieldName));
+ InterpreterTypes.checkIsInstance(field.getType(), value);
+ fields.put(fieldName, value);
+ }
+}