aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org/zwobble/couscous/interpreter/values
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2016-02-28 19:18:28 +0000
committerMichael Williamson <mike@zwobble.org>2016-02-29 08:04:42 +0000
commitb7e0010d6e8e5413fcd66eae158111db509eb27b (patch)
tree35fafacd7819788b185f803a0c3797a2f54a1dca /src/main/java/org/zwobble/couscous/interpreter/values
parentd3e9fb5ce2a13bdb0ee39e9625494e8c5d2a9383 (diff)
Split ConcreteType up into specialised type implementations
Diffstat (limited to 'src/main/java/org/zwobble/couscous/interpreter/values')
-rw-r--r--src/main/java/org/zwobble/couscous/interpreter/values/BooleanInterpreterValue.java6
-rw-r--r--src/main/java/org/zwobble/couscous/interpreter/values/BoxedIntegerInterpreterValue.java4
-rw-r--r--src/main/java/org/zwobble/couscous/interpreter/values/ConcreteType.java240
-rw-r--r--src/main/java/org/zwobble/couscous/interpreter/values/InstanceReceiverValue.java3
-rw-r--r--src/main/java/org/zwobble/couscous/interpreter/values/IntegerInterpreterValue.java6
-rw-r--r--src/main/java/org/zwobble/couscous/interpreter/values/InternalCouscousInterpreterValue.java4
-rw-r--r--src/main/java/org/zwobble/couscous/interpreter/values/InterpreterFields.java12
-rw-r--r--src/main/java/org/zwobble/couscous/interpreter/values/InterpreterValue.java7
-rw-r--r--src/main/java/org/zwobble/couscous/interpreter/values/ObjectInterpreterValue.java7
-rw-r--r--src/main/java/org/zwobble/couscous/interpreter/values/StaticReceiverValue.java5
-rw-r--r--src/main/java/org/zwobble/couscous/interpreter/values/StringInterpreterValue.java6
-rw-r--r--src/main/java/org/zwobble/couscous/interpreter/values/TypeInterpreterValue.java7
-rw-r--r--src/main/java/org/zwobble/couscous/interpreter/values/UnitInterpreterValue.java9
13 files changed, 49 insertions, 267 deletions
diff --git a/src/main/java/org/zwobble/couscous/interpreter/values/BooleanInterpreterValue.java b/src/main/java/org/zwobble/couscous/interpreter/values/BooleanInterpreterValue.java
index 2ac6e3a..a183206 100644
--- a/src/main/java/org/zwobble/couscous/interpreter/values/BooleanInterpreterValue.java
+++ b/src/main/java/org/zwobble/couscous/interpreter/values/BooleanInterpreterValue.java
@@ -2,6 +2,8 @@ package org.zwobble.couscous.interpreter.values;
import org.zwobble.couscous.ast.Operator;
import org.zwobble.couscous.interpreter.errors.NoSuchField;
+import org.zwobble.couscous.interpreter.types.InterpreterType;
+import org.zwobble.couscous.interpreter.types.IntrinsicInterpreterType;
import org.zwobble.couscous.values.BooleanValue;
import org.zwobble.couscous.values.PrimitiveValue;
import org.zwobble.couscous.values.PrimitiveValues;
@@ -18,7 +20,7 @@ public final class BooleanInterpreterValue implements InterpreterValue {
return value ? TRUE : FALSE;
}
- private static final ConcreteType TYPE = ConcreteType.builder(BooleanInterpreterValue.class, "boolean")
+ private static final InterpreterType TYPE = IntrinsicInterpreterType.builder(BooleanInterpreterValue.class, "boolean")
.method(Operator.BOOLEAN_NOT.getSymbol(), list(), BooleanValue.REF, (environment, arguments) ->
of(!arguments.getReceiver().getValue()))
@@ -46,7 +48,7 @@ public final class BooleanInterpreterValue implements InterpreterValue {
}
@Override
- public ConcreteType getType() {
+ public InterpreterType getType() {
return TYPE;
}
diff --git a/src/main/java/org/zwobble/couscous/interpreter/values/BoxedIntegerInterpreterValue.java b/src/main/java/org/zwobble/couscous/interpreter/values/BoxedIntegerInterpreterValue.java
index 951d57d..5c477af 100644
--- a/src/main/java/org/zwobble/couscous/interpreter/values/BoxedIntegerInterpreterValue.java
+++ b/src/main/java/org/zwobble/couscous/interpreter/values/BoxedIntegerInterpreterValue.java
@@ -1,5 +1,7 @@
package org.zwobble.couscous.interpreter.values;
+import org.zwobble.couscous.interpreter.types.InterpreterType;
+import org.zwobble.couscous.interpreter.types.IntrinsicInterpreterType;
import org.zwobble.couscous.values.BooleanValue;
import org.zwobble.couscous.values.IntegerValue;
import org.zwobble.couscous.values.ObjectValues;
@@ -18,7 +20,7 @@ public class BoxedIntegerInterpreterValue {
return obj;
}
- public static final ConcreteType TYPE = ConcreteType.classBuilder("java.lang.Integer")
+ public static final InterpreterType TYPE = IntrinsicInterpreterType.classBuilder("java.lang.Integer")
.field("value", IntegerValue.REF)
.staticMethod("parseInt", list(StringValue.REF), IntegerValue.REF,
diff --git a/src/main/java/org/zwobble/couscous/interpreter/values/ConcreteType.java b/src/main/java/org/zwobble/couscous/interpreter/values/ConcreteType.java
deleted file mode 100644
index ed01d59..0000000
--- a/src/main/java/org/zwobble/couscous/interpreter/values/ConcreteType.java
+++ /dev/null
@@ -1,240 +0,0 @@
-package org.zwobble.couscous.interpreter.values;
-
-import com.google.common.collect.ImmutableMap;
-import org.zwobble.couscous.ast.*;
-import org.zwobble.couscous.interpreter.Environment;
-import org.zwobble.couscous.interpreter.Executor;
-import org.zwobble.couscous.interpreter.InterpreterTypes;
-import org.zwobble.couscous.interpreter.PositionalArguments;
-import org.zwobble.couscous.interpreter.errors.NoSuchMethod;
-import org.zwobble.couscous.interpreter.errors.WrongNumberOfArguments;
-
-import java.util.*;
-import java.util.function.BiFunction;
-import java.util.stream.Collectors;
-
-import static java.util.stream.Collectors.toMap;
-import static org.zwobble.couscous.util.Casts.tryCast;
-import static org.zwobble.couscous.util.ExtraLists.list;
-import static org.zwobble.couscous.util.ExtraMaps.map;
-import static org.zwobble.couscous.util.ExtraSets.set;
-
-public class ConcreteType {
- public static <T> ConcreteType.Builder<T> builder(Class<T> interpreterValueType, TypeName reference) {
- return new Builder<>(interpreterValueType, reference);
- }
-
- public static <T> ConcreteType.Builder<T> builder(Class<T> interpreterValueType, String name) {
- return builder(interpreterValueType, TypeName.of(name));
- }
-
- public static ConcreteType.Builder<ObjectInterpreterValue> classBuilder(String name) {
- return builder(ObjectInterpreterValue.class, name);
- }
-
- public static class Builder<T> {
- private final ImmutableMap.Builder<String, FieldDeclarationNode> fields = ImmutableMap.builder();
- private MethodValue constructor = new MethodValue(list(), (environment, arguments) -> InterpreterValues.UNIT);
- private final ImmutableMap.Builder<MethodSignature, MethodValue> methods = ImmutableMap.builder();
- private final ImmutableMap.Builder<MethodSignature, StaticMethodValue> staticMethods = ImmutableMap.builder();
- private final Class<T> interpreterValueType;
- private final TypeName name;
-
- public Builder(Class<T> interpreterValueType, TypeName name) {
- this.interpreterValueType = interpreterValueType;
- this.name = name;
- }
-
- public Builder<T> field(String name, TypeName type) {
- fields.put(name, FieldDeclarationNode.field(name, type));
- return this;
- }
-
- public Builder<T> constructor(List<TypeName> argumentsTypes, BiFunction<Environment, MethodCallArguments<T>, InterpreterValue> method) {
- constructor = toMethodValue(argumentsTypes, method);
- return this;
- }
-
- public Builder<T> method(
- String name,
- List<TypeName> argumentsTypes,
- TypeName returnType,
- BiFunction<Environment, MethodCallArguments<T>, InterpreterValue> method)
- {
- methods.put(new MethodSignature(name, argumentsTypes, returnType), toMethodValue(argumentsTypes, method));
- return this;
- }
-
- private MethodValue toMethodValue(List<TypeName> argumentsTypes, BiFunction<Environment, MethodCallArguments<T>, InterpreterValue> method) {
- return new MethodValue(
- argumentsTypes,
- (environment, arguments) ->
- tryCast(interpreterValueType, arguments.getReceiver())
- .map(typedReceiver -> method.apply(environment, MethodCallArguments.of(typedReceiver, arguments.getPositionalArguments())))
- .orElseThrow(() -> new RuntimeException("receiver is of wrong type")));
- }
-
- public Builder<T> staticMethod(
- String name,
- List<TypeName> argumentsTypes,
- TypeName returnType,
- BiFunction<Environment, PositionalArguments, InterpreterValue> method)
- {
- staticMethods.put(new MethodSignature(name, argumentsTypes, returnType), new StaticMethodValue(argumentsTypes, method));
- return this;
- }
-
- public ConcreteType build() {
- return new ConcreteType(
- name,
- Collections.emptySet(),
- fields.build(),
- list(),
- constructor,
- methods.build(),
- staticMethods.build());
- }
- }
-
- public static ConcreteType fromNode(TypeNode typeNode) {
- return tryCast(ClassNode.class, typeNode)
- .map(ConcreteType::fromNode)
- // TODO: tidy this up -- type hierarchy instead of one ConcreteType?
- .orElseGet(() -> new ConcreteType(
- typeNode.getName(),
- set(),
- map(),
- list(),
- null,
- map(),
- map()));
- }
-
- private static ConcreteType fromNode(ClassNode classNode) {
- Map<String, FieldDeclarationNode> fields = classNode.getFields().stream()
- .collect(toMap(
- field -> field.getName(),
- field -> field));
- MethodValue constructor = new MethodValue(
- getArgumentTypes(classNode.getConstructor().getArguments()),
- (environment, arguments) -> Executor.callConstructor(
- environment,
- classNode.getConstructor(),
- Optional.of(arguments.getReceiver()),
- arguments.getPositionalArguments()));
-
- Map<MethodSignature, MethodValue> methods = classNode.getMethods()
- .stream()
- .filter(method -> !method.isStatic())
- .collect(toMap(method -> method.signature(), method -> {
- List<TypeName> argumentTypes = getArgumentTypes(method.getArguments());
- return new MethodValue(argumentTypes, (environment, arguments) -> {
- return Executor.callMethod(environment, method, Optional.of(arguments.getReceiver()), arguments.getPositionalArguments());
- });
- }));
- Map<MethodSignature, StaticMethodValue> staticMethods = classNode.getMethods()
- .stream()
- .filter(method -> method.isStatic())
- .collect(toMap(method -> method.signature(), method -> {
- List<TypeName> argumentTypes = getArgumentTypes(method.getArguments());
- return new StaticMethodValue(argumentTypes, (environment, arguments) -> {
- return Executor.callMethod(environment, method, Optional.empty(), arguments);
- });
- }));
- return new ConcreteType(
- classNode.getName(),
- classNode.getSuperTypes(),
- fields,
- classNode.getStaticConstructor(),
- constructor,
- methods,
- staticMethods);
- }
-
- private static List<TypeName> getArgumentTypes(List<FormalArgumentNode> arguments) {
- return arguments.stream().map(arg -> arg.getType()).collect(Collectors.toList());
- }
- private final TypeName name;
- private final Set<TypeName> superTypes;
- private final Map<String, FieldDeclarationNode> fields;
- private final List<StatementNode> staticConstructor;
- private final MethodValue constructor;
- private final Map<MethodSignature, MethodValue> methods;
- private final Map<MethodSignature, StaticMethodValue> staticMethods;
-
- private ConcreteType(
- TypeName name,
- Set<TypeName> superTypes,
- Map<String, FieldDeclarationNode> fields,
- List<StatementNode> staticConstructor,
- MethodValue constructor,
- Map<MethodSignature, MethodValue> methods,
- Map<MethodSignature, StaticMethodValue> staticMethods)
- {
- this.name = name;
- this.superTypes = superTypes;
- this.fields = fields;
- this.staticConstructor = staticConstructor;
- this.constructor = constructor;
- this.methods = methods;
- this.staticMethods = staticMethods;
- }
-
- public TypeName getName() {
- return name;
- }
-
- public Set<TypeName> getSuperTypes() {
- return superTypes;
- }
-
- public Optional<FieldDeclarationNode> getField(boolean isStatic, String fieldName) {
- return Optional.ofNullable(fields.get(fieldName))
- .filter(field -> field.isStatic() == isStatic);
- }
-
- public List<StatementNode> getStaticConstructor() {
- return staticConstructor;
- }
-
- public InterpreterValue callMethod(Environment environment, InterpreterValue receiver, MethodSignature signature, List<InterpreterValue> arguments) {
- MethodValue method = findMethod(methods, signature, arguments);
- return method.apply(environment, MethodCallArguments.of(receiver, new PositionalArguments(arguments)));
- }
-
- public InterpreterValue callStaticMethod(Environment environment, MethodSignature signature, List<InterpreterValue> arguments) {
- StaticMethodValue method = findMethod(staticMethods, signature, arguments);
- return method.apply(environment, new PositionalArguments(arguments));
- }
-
- public InterpreterValue callConstructor(Environment environment, List<InterpreterValue> arguments) {
- final org.zwobble.couscous.interpreter.values.ObjectInterpreterValue object = new ObjectInterpreterValue(this);
- checkMethodArguments(constructor, arguments);
- constructor.apply(environment, MethodCallArguments.of(object, new PositionalArguments(arguments)));
- return object;
- }
-
- private static <T extends Callable> T findMethod(Map<MethodSignature, T> methods, MethodSignature signature, List<InterpreterValue> arguments) {
- if (!methods.containsKey(signature)) {
- throw new NoSuchMethod(signature);
- }
- final T method = methods.get(signature);
- checkMethodArguments(method, arguments);
- return method;
- }
-
- private static void checkMethodArguments(final Callable method, List<InterpreterValue> arguments) {
- if (method.getArgumentTypes().size() != arguments.size()) {
- throw new WrongNumberOfArguments(method.getArgumentTypes().size(), arguments.size());
- }
- for (int index = 0; index < arguments.size(); index++) {
- final org.zwobble.couscous.ast.TypeName formalArgumentType = method.getArgumentTypes().get(index);
- InterpreterTypes.checkIsInstance(formalArgumentType, arguments.get(index));
- }
- }
-
- @Override
- public String toString() {
- return "ConcreteType<" + name + ">";
- }
-} \ No newline at end of file
diff --git a/src/main/java/org/zwobble/couscous/interpreter/values/InstanceReceiverValue.java b/src/main/java/org/zwobble/couscous/interpreter/values/InstanceReceiverValue.java
index 8179394..cdc2167 100644
--- a/src/main/java/org/zwobble/couscous/interpreter/values/InstanceReceiverValue.java
+++ b/src/main/java/org/zwobble/couscous/interpreter/values/InstanceReceiverValue.java
@@ -2,6 +2,7 @@ package org.zwobble.couscous.interpreter.values;
import org.zwobble.couscous.ast.MethodSignature;
import org.zwobble.couscous.interpreter.Environment;
+import org.zwobble.couscous.interpreter.types.InterpreterType;
import java.util.List;
@@ -14,7 +15,7 @@ public class InstanceReceiverValue implements ReceiverValue {
@Override
public InterpreterValue callMethod(Environment environment, MethodSignature signature, List<InterpreterValue> arguments) {
- ConcreteType type = value.getType();
+ InterpreterType type = value.getType();
return type.callMethod(environment, value, signature, arguments);
}
diff --git a/src/main/java/org/zwobble/couscous/interpreter/values/IntegerInterpreterValue.java b/src/main/java/org/zwobble/couscous/interpreter/values/IntegerInterpreterValue.java
index 78da460..f0ce783 100644
--- a/src/main/java/org/zwobble/couscous/interpreter/values/IntegerInterpreterValue.java
+++ b/src/main/java/org/zwobble/couscous/interpreter/values/IntegerInterpreterValue.java
@@ -3,6 +3,8 @@ package org.zwobble.couscous.interpreter.values;
import org.zwobble.couscous.ast.Operator;
import org.zwobble.couscous.interpreter.Environment;
import org.zwobble.couscous.interpreter.errors.NoSuchField;
+import org.zwobble.couscous.interpreter.types.InterpreterType;
+import org.zwobble.couscous.interpreter.types.IntrinsicInterpreterType;
import org.zwobble.couscous.values.BooleanValue;
import org.zwobble.couscous.values.IntegerValue;
import org.zwobble.couscous.values.PrimitiveValue;
@@ -14,7 +16,7 @@ import java.util.function.BiFunction;
import static org.zwobble.couscous.util.ExtraLists.list;
public final class IntegerInterpreterValue implements InterpreterValue {
- public static final ConcreteType TYPE = ConcreteType.builder(IntegerInterpreterValue.class, IntegerValue.REF)
+ public static final InterpreterType TYPE = IntrinsicInterpreterType.builder(IntegerInterpreterValue.class, IntegerValue.REF)
.method(Operator.ADD.getSymbol(), list(IntegerValue.REF), IntegerValue.REF,
infixReturningInteger((left, right) -> left + right))
.method(Operator.SUBTRACT.getSymbol(), list(IntegerValue.REF), IntegerValue.REF,
@@ -71,7 +73,7 @@ public final class IntegerInterpreterValue implements InterpreterValue {
private final int value;
@Override
- public ConcreteType getType() {
+ public InterpreterType getType() {
return TYPE;
}
diff --git a/src/main/java/org/zwobble/couscous/interpreter/values/InternalCouscousInterpreterValue.java b/src/main/java/org/zwobble/couscous/interpreter/values/InternalCouscousInterpreterValue.java
index e39f576..faab2a8 100644
--- a/src/main/java/org/zwobble/couscous/interpreter/values/InternalCouscousInterpreterValue.java
+++ b/src/main/java/org/zwobble/couscous/interpreter/values/InternalCouscousInterpreterValue.java
@@ -1,12 +1,14 @@
package org.zwobble.couscous.interpreter.values;
+import org.zwobble.couscous.interpreter.types.InterpreterType;
+import org.zwobble.couscous.interpreter.types.IntrinsicInterpreterType;
import org.zwobble.couscous.values.BooleanValue;
import org.zwobble.couscous.values.ObjectValues;
import static org.zwobble.couscous.util.ExtraLists.list;
public class InternalCouscousInterpreterValue {
- public static final ConcreteType TYPE = ConcreteType.classBuilder("_couscous")
+ public static final InterpreterType TYPE = IntrinsicInterpreterType.classBuilder("_couscous")
.staticMethod("same", list(ObjectValues.OBJECT, ObjectValues.OBJECT), BooleanValue.REF,
(environment, arguments) ->
BooleanInterpreterValue.of(arguments.get(0) == arguments.get(1)))
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 1661ee7..50ed24f 100644
--- a/src/main/java/org/zwobble/couscous/interpreter/values/InterpreterFields.java
+++ b/src/main/java/org/zwobble/couscous/interpreter/values/InterpreterFields.java
@@ -4,24 +4,25 @@ import org.zwobble.couscous.ast.FieldDeclarationNode;
import org.zwobble.couscous.interpreter.InterpreterTypes;
import org.zwobble.couscous.interpreter.errors.NoSuchField;
import org.zwobble.couscous.interpreter.errors.UnboundField;
+import org.zwobble.couscous.interpreter.types.InterpreterType;
import java.util.HashMap;
import java.util.Map;
public class InterpreterFields {
- public static InterpreterFields forClass(ConcreteType type) {
+ public static InterpreterFields forClass(InterpreterType type) {
return new InterpreterFields(true, type);
}
- public static InterpreterFields forInstanceOf(ConcreteType type) {
+ public static InterpreterFields forInstanceOf(InterpreterType type) {
return new InterpreterFields(false, type);
}
private final boolean isStatic;
- private final ConcreteType type;
+ private final InterpreterType type;
private final Map<String, InterpreterValue> fields;
- private InterpreterFields(boolean isStatic, ConcreteType type) {
+ private InterpreterFields(boolean isStatic, InterpreterType type) {
this.isStatic = isStatic;
this.type = type;
this.fields = new HashMap<>();
@@ -43,7 +44,8 @@ public class InterpreterFields {
}
private FieldDeclarationNode getFieldDefinition(String fieldName) {
- return type.getField(isStatic, fieldName)
+ return type.getField(fieldName)
+ .filter(field -> field.isStatic() == isStatic)
.orElseThrow(() -> new NoSuchField(fieldName));
}
}
diff --git a/src/main/java/org/zwobble/couscous/interpreter/values/InterpreterValue.java b/src/main/java/org/zwobble/couscous/interpreter/values/InterpreterValue.java
index e02387b..831ba2c 100644
--- a/src/main/java/org/zwobble/couscous/interpreter/values/InterpreterValue.java
+++ b/src/main/java/org/zwobble/couscous/interpreter/values/InterpreterValue.java
@@ -1,11 +1,12 @@
package org.zwobble.couscous.interpreter.values;
-import java.util.Optional;
-
+import org.zwobble.couscous.interpreter.types.InterpreterType;
import org.zwobble.couscous.values.PrimitiveValue;
+import java.util.Optional;
+
public interface InterpreterValue {
- ConcreteType getType();
+ InterpreterType getType();
Optional<PrimitiveValue> toPrimitiveValue();
InterpreterValue getField(String fieldName);
void setField(String fieldName, InterpreterValue value);
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 e15c01d..aadf44b 100644
--- a/src/main/java/org/zwobble/couscous/interpreter/values/ObjectInterpreterValue.java
+++ b/src/main/java/org/zwobble/couscous/interpreter/values/ObjectInterpreterValue.java
@@ -1,20 +1,21 @@
package org.zwobble.couscous.interpreter.values;
+import org.zwobble.couscous.interpreter.types.InterpreterType;
import org.zwobble.couscous.values.PrimitiveValue;
import java.util.Optional;
public class ObjectInterpreterValue implements InterpreterValue {
- private final ConcreteType type;
+ private final InterpreterType type;
private final InterpreterFields fields;
- public ObjectInterpreterValue(ConcreteType type) {
+ public ObjectInterpreterValue(InterpreterType type) {
this.type = type;
this.fields = InterpreterFields.forInstanceOf(type);
}
@Override
- public ConcreteType getType() {
+ public InterpreterType getType() {
return type;
}
diff --git a/src/main/java/org/zwobble/couscous/interpreter/values/StaticReceiverValue.java b/src/main/java/org/zwobble/couscous/interpreter/values/StaticReceiverValue.java
index 2595623..cf2c9b7 100644
--- a/src/main/java/org/zwobble/couscous/interpreter/values/StaticReceiverValue.java
+++ b/src/main/java/org/zwobble/couscous/interpreter/values/StaticReceiverValue.java
@@ -3,14 +3,15 @@ package org.zwobble.couscous.interpreter.values;
import org.zwobble.couscous.ast.MethodSignature;
import org.zwobble.couscous.interpreter.Environment;
import org.zwobble.couscous.interpreter.Executor;
+import org.zwobble.couscous.interpreter.types.InterpreterType;
import java.util.List;
public class StaticReceiverValue implements ReceiverValue {
- private final ConcreteType type;
+ private final InterpreterType type;
private final InterpreterFields fields;
- public StaticReceiverValue(ConcreteType type) {
+ public StaticReceiverValue(InterpreterType type) {
this.type = type;
this.fields = InterpreterFields.forClass(type);
}
diff --git a/src/main/java/org/zwobble/couscous/interpreter/values/StringInterpreterValue.java b/src/main/java/org/zwobble/couscous/interpreter/values/StringInterpreterValue.java
index ae7d141..2fe72d7 100644
--- a/src/main/java/org/zwobble/couscous/interpreter/values/StringInterpreterValue.java
+++ b/src/main/java/org/zwobble/couscous/interpreter/values/StringInterpreterValue.java
@@ -2,6 +2,8 @@ package org.zwobble.couscous.interpreter.values;
import org.zwobble.couscous.ast.Operator;
import org.zwobble.couscous.interpreter.errors.NoSuchField;
+import org.zwobble.couscous.interpreter.types.InterpreterType;
+import org.zwobble.couscous.interpreter.types.IntrinsicInterpreterType;
import org.zwobble.couscous.values.*;
import java.util.Optional;
@@ -9,7 +11,7 @@ import java.util.Optional;
import static org.zwobble.couscous.util.ExtraLists.list;
public final class StringInterpreterValue implements InterpreterValue {
- public static final ConcreteType TYPE = ConcreteType.builder(StringInterpreterValue.class, StringValue.REF)
+ public static final InterpreterType TYPE = IntrinsicInterpreterType.builder(StringInterpreterValue.class, StringValue.REF)
.method("length", list(), IntegerValue.REF, (environment, arguments) ->
new IntegerInterpreterValue(arguments.getReceiver().value.length()))
@@ -49,7 +51,7 @@ public final class StringInterpreterValue implements InterpreterValue {
}
@Override
- public ConcreteType getType() {
+ public InterpreterType getType() {
return TYPE;
}
diff --git a/src/main/java/org/zwobble/couscous/interpreter/values/TypeInterpreterValue.java b/src/main/java/org/zwobble/couscous/interpreter/values/TypeInterpreterValue.java
index 5938ce3..f221ea0 100644
--- a/src/main/java/org/zwobble/couscous/interpreter/values/TypeInterpreterValue.java
+++ b/src/main/java/org/zwobble/couscous/interpreter/values/TypeInterpreterValue.java
@@ -2,6 +2,8 @@ package org.zwobble.couscous.interpreter.values;
import org.zwobble.couscous.ast.TypeName;
import org.zwobble.couscous.interpreter.errors.NoSuchField;
+import org.zwobble.couscous.interpreter.types.InterpreterType;
+import org.zwobble.couscous.interpreter.types.IntrinsicInterpreterType;
import org.zwobble.couscous.values.ObjectValues;
import org.zwobble.couscous.values.PrimitiveValue;
import org.zwobble.couscous.values.PrimitiveValues;
@@ -9,7 +11,8 @@ import org.zwobble.couscous.values.PrimitiveValues;
import java.util.Optional;
public class TypeInterpreterValue implements InterpreterValue {
- public static final ConcreteType TYPE = ConcreteType.builder(TypeInterpreterValue.class, ObjectValues.CLASS)
+ public static final InterpreterType TYPE = IntrinsicInterpreterType
+ .builder(TypeInterpreterValue.class, ObjectValues.CLASS)
.build();
public static InterpreterValue of(TypeName type) {
@@ -23,7 +26,7 @@ public class TypeInterpreterValue implements InterpreterValue {
}
@Override
- public ConcreteType getType() {
+ public InterpreterType getType() {
return TYPE;
}
diff --git a/src/main/java/org/zwobble/couscous/interpreter/values/UnitInterpreterValue.java b/src/main/java/org/zwobble/couscous/interpreter/values/UnitInterpreterValue.java
index 54f5605..59792c6 100644
--- a/src/main/java/org/zwobble/couscous/interpreter/values/UnitInterpreterValue.java
+++ b/src/main/java/org/zwobble/couscous/interpreter/values/UnitInterpreterValue.java
@@ -1,19 +1,22 @@
package org.zwobble.couscous.interpreter.values;
-import java.util.Optional;
import org.zwobble.couscous.interpreter.errors.NoSuchField;
+import org.zwobble.couscous.interpreter.types.InterpreterType;
+import org.zwobble.couscous.interpreter.types.IntrinsicInterpreterType;
import org.zwobble.couscous.values.PrimitiveValue;
import org.zwobble.couscous.values.PrimitiveValues;
+import java.util.Optional;
+
public class UnitInterpreterValue implements InterpreterValue {
- private static final ConcreteType TYPE = ConcreteType.builder(UnitInterpreterValue.class, "Unit").build();
+ private static final InterpreterType TYPE = IntrinsicInterpreterType.builder(UnitInterpreterValue.class, "Unit").build();
public static final UnitInterpreterValue UNIT = new UnitInterpreterValue();
private UnitInterpreterValue() {
}
@Override
- public ConcreteType getType() {
+ public InterpreterType getType() {
return TYPE;
}