diff options
| author | Michael Williamson <mike@zwobble.org> | 2016-02-11 21:33:25 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2016-02-11 21:33:25 +0000 |
| commit | a34a00ba19f6ffb61762da4629b53b8a633f9d17 (patch) | |
| tree | 6ae34a92c0dfe9a24df0b7e90da2da263a61f708 /src/main/java/org/zwobble/couscous/interpreter/values/InterpreterFields.java | |
| parent | 6d02b3e3e6f8da9837a46efda4733bdd89e38aaf (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.java | 36 |
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); + } +} |
