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-13 14:53:32 +0000
committerMichael Williamson <mike@zwobble.org>2016-02-13 14:53:32 +0000
commitbac463d6b411c2108d56190b5766c9c92eade69d (patch)
tree1fc35105e655846cb8ead1e96781d4b9e65e4726 /src/main/java/org/zwobble/couscous/interpreter/values/InterpreterFields.java
parentd5c90f5ff00b3ccfb6c2c95bf2176e133c5102fa (diff)
Distinguish static and instance fields when checking field exists
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.java22
1 files changed, 17 insertions, 5 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
index fc082a5..df33d60 100644
--- a/src/main/java/org/zwobble/couscous/interpreter/values/InterpreterFields.java
+++ b/src/main/java/org/zwobble/couscous/interpreter/values/InterpreterFields.java
@@ -8,18 +8,26 @@ import java.util.HashMap;
import java.util.Map;
public class InterpreterFields {
- // TODO: distinguish static and non-static fields
+ public static InterpreterFields forClass(ConcreteType type) {
+ return new InterpreterFields(true, type);
+ }
+
+ public static InterpreterFields forInstanceOf(ConcreteType type) {
+ return new InterpreterFields(false, type);
+ }
+ private final boolean isStatic;
private final ConcreteType type;
private final Map<String, InterpreterValue> fields;
- public InterpreterFields(ConcreteType type) {
+ private InterpreterFields(boolean isStatic, ConcreteType type) {
+ this.isStatic = isStatic;
this.type = type;
this.fields = new HashMap<>();
}
public InterpreterValue getField(String fieldName) {
- type.getField(fieldName).orElseThrow(() -> new NoSuchField(fieldName));
+ getFieldDefinition(fieldName);
if (fields.containsKey(fieldName)) {
return fields.get(fieldName);
} else {
@@ -28,9 +36,13 @@ public class InterpreterFields {
}
public void setField(String fieldName, InterpreterValue value) {
- FieldValue field = type.getField(fieldName)
- .orElseThrow(() -> new NoSuchField(fieldName));
+ FieldValue field = getFieldDefinition(fieldName);
InterpreterTypes.checkIsInstance(field.getType(), value);
fields.put(fieldName, value);
}
+
+ private FieldValue getFieldDefinition(String fieldName) {
+ return type.getField(isStatic, fieldName)
+ .orElseThrow(() -> new NoSuchField(fieldName));
+ }
}