From bac463d6b411c2108d56190b5766c9c92eade69d Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sat, 13 Feb 2016 14:53:32 +0000 Subject: Distinguish static and instance fields when checking field exists --- .../interpreter/values/InterpreterFields.java | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) (limited to 'src/main/java/org/zwobble/couscous/interpreter/values/InterpreterFields.java') 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 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)); + } } -- cgit v1.2.3