diff options
Diffstat (limited to 'src/main')
5 files changed, 31 insertions, 2 deletions
diff --git a/src/main/java/org/zwobble/couscous/ast/ClassNode.java b/src/main/java/org/zwobble/couscous/ast/ClassNode.java index 674e347..d0598d8 100644 --- a/src/main/java/org/zwobble/couscous/ast/ClassNode.java +++ b/src/main/java/org/zwobble/couscous/ast/ClassNode.java @@ -13,6 +13,7 @@ public class ClassNode implements Node { } TypeName name; + List<FieldDeclarationNode> fields; ConstructorNode constructor; List<MethodNode> methods; diff --git a/src/main/java/org/zwobble/couscous/ast/ClassNodeBuilder.java b/src/main/java/org/zwobble/couscous/ast/ClassNodeBuilder.java index 2a0d967..b4ddad9 100644 --- a/src/main/java/org/zwobble/couscous/ast/ClassNodeBuilder.java +++ b/src/main/java/org/zwobble/couscous/ast/ClassNodeBuilder.java @@ -65,6 +65,7 @@ public class ClassNodeBuilder { public ClassNode build() { return new ClassNode( name, + fields.build(), constructor.orElse(constructorBuilder().build()), methods.build()); } diff --git a/src/main/java/org/zwobble/couscous/interpreter/values/ConcreteType.java b/src/main/java/org/zwobble/couscous/interpreter/values/ConcreteType.java index 6d0f3e5..93dd651 100644 --- a/src/main/java/org/zwobble/couscous/interpreter/values/ConcreteType.java +++ b/src/main/java/org/zwobble/couscous/interpreter/values/ConcreteType.java @@ -9,10 +9,10 @@ import java.util.stream.Collectors; import org.zwobble.couscous.ast.ClassNode; import org.zwobble.couscous.ast.FormalArgumentNode; import org.zwobble.couscous.ast.TypeName; -import org.zwobble.couscous.interpreter.PositionalArguments; import org.zwobble.couscous.interpreter.Environment; import org.zwobble.couscous.interpreter.Executor; import org.zwobble.couscous.interpreter.NoSuchMethod; +import org.zwobble.couscous.interpreter.PositionalArguments; import org.zwobble.couscous.interpreter.UnexpectedValueType; import org.zwobble.couscous.interpreter.WrongNumberOfArguments; import org.zwobble.couscous.util.Casts; @@ -62,6 +62,7 @@ public class ConcreteType { public ConcreteType build() { return new ConcreteType( name, + ImmutableMap.of(), new MethodValue( ImmutableList.of(), (environment, arguments) -> InterpreterValues.UNIT), @@ -71,6 +72,11 @@ public class ConcreteType { } public static ConcreteType fromNode(ClassNode classNode) { + val fields = classNode.getFields().stream() + .collect(toMap( + field -> field.getName(), + field -> new FieldValue(field.getName(), field.getType()))); + val constructor = new MethodValue( getArgumentTypes(classNode.getConstructor().getArguments()), (environment, arguments) -> Executor.callMethod( @@ -113,6 +119,7 @@ public class ConcreteType { })); return new ConcreteType( classNode.getName(), + fields, constructor, methods, staticMethods); @@ -126,16 +133,19 @@ public class ConcreteType { } private final TypeName name; + private final Map<String, FieldValue> fields; private final MethodValue constructor; private final Map<String, MethodValue> methods; private final Map<String, StaticMethodValue> staticMethods; public ConcreteType( TypeName name, + Map<String, FieldValue> fields, MethodValue constructor, Map<String, MethodValue> methods, Map<String, StaticMethodValue> staticMethods) { this.name = name; + this.fields = fields; this.constructor = constructor; this.methods = methods; this.staticMethods = staticMethods; @@ -144,6 +154,10 @@ public class ConcreteType { public TypeName getName() { return name; } + + public Optional<FieldValue> getField(String fieldName) { + return Optional.ofNullable(fields.get(fieldName)); + } public static <T> ConcreteType.Builder<T> builder(Class<T> interpreterValueType, TypeName reference) { return new Builder<>(interpreterValueType, reference); diff --git a/src/main/java/org/zwobble/couscous/interpreter/values/FieldValue.java b/src/main/java/org/zwobble/couscous/interpreter/values/FieldValue.java new file mode 100644 index 0000000..d778144 --- /dev/null +++ b/src/main/java/org/zwobble/couscous/interpreter/values/FieldValue.java @@ -0,0 +1,11 @@ +package org.zwobble.couscous.interpreter.values; + +import org.zwobble.couscous.ast.TypeName; + +import lombok.Value; + +@Value +public class FieldValue { + String name; + TypeName type; +} 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 acb6ef7..7ff8bb1 100644 --- a/src/main/java/org/zwobble/couscous/interpreter/values/ObjectInterpreterValue.java +++ b/src/main/java/org/zwobble/couscous/interpreter/values/ObjectInterpreterValue.java @@ -4,6 +4,7 @@ import java.util.HashMap; import java.util.Map; import java.util.Optional; +import org.zwobble.couscous.interpreter.NoSuchField; import org.zwobble.couscous.values.PrimitiveValue; public class ObjectInterpreterValue implements InterpreterValue { @@ -35,6 +36,7 @@ public class ObjectInterpreterValue implements InterpreterValue { } public void setField(String fieldName, InterpreterValue value) { - fields.put(fieldName, value); + type.getField(fieldName).orElseThrow(() -> new NoSuchField(fieldName)); + fields.put(fieldName, value); } } |
