aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org/zwobble/couscous/interpreter
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2016-03-31 22:19:02 +0100
committerMichael Williamson <mike@zwobble.org>2016-03-31 22:19:02 +0100
commit9ff78407129e7a1fbc96848ca09a5f28cf7080ed (patch)
treef33e3a5c8f8972c756fb980a60ac03f4a98424d3 /src/main/java/org/zwobble/couscous/interpreter
parent63186372abb41771c7a78c34ad3d17c458fa25e1 (diff)
Improve generic support in the interpreter
Diffstat (limited to 'src/main/java/org/zwobble/couscous/interpreter')
-rw-r--r--src/main/java/org/zwobble/couscous/interpreter/Evaluator.java4
-rw-r--r--src/main/java/org/zwobble/couscous/interpreter/types/ParameterizedInterpreterType.java28
-rw-r--r--src/main/java/org/zwobble/couscous/interpreter/types/UserDefinedInterpreterType.java16
-rw-r--r--src/main/java/org/zwobble/couscous/interpreter/values/InterpreterFields.java4
4 files changed, 35 insertions, 17 deletions
diff --git a/src/main/java/org/zwobble/couscous/interpreter/Evaluator.java b/src/main/java/org/zwobble/couscous/interpreter/Evaluator.java
index bbc41d1..4c2a8c3 100644
--- a/src/main/java/org/zwobble/couscous/interpreter/Evaluator.java
+++ b/src/main/java/org/zwobble/couscous/interpreter/Evaluator.java
@@ -52,7 +52,7 @@ public class Evaluator implements ExpressionNodeMapper<InterpreterValue> {
public InterpreterValue visit(ThisReferenceNode reference) {
InterpreterValue thisValue = environment.getThis().get();
// TODO: add a test for this
- InterpreterTypes.checkIsInstance(reference.getType(), thisValue);
+ //InterpreterTypes.checkIsInstance(reference.getType(), thisValue);
return thisValue;
}
@@ -102,7 +102,7 @@ public class Evaluator implements ExpressionNodeMapper<InterpreterValue> {
MethodSignature signature = methodCall.signature();
return evalReceiver(methodCall.getReceiver())
- .callMethod(environment, signature, new Arguments(list(), arguments));
+ .callMethod(environment, signature.generic(), new Arguments(list(), arguments));
}
@Override
diff --git a/src/main/java/org/zwobble/couscous/interpreter/types/ParameterizedInterpreterType.java b/src/main/java/org/zwobble/couscous/interpreter/types/ParameterizedInterpreterType.java
index 52ec6e1..0d82e6c 100644
--- a/src/main/java/org/zwobble/couscous/interpreter/types/ParameterizedInterpreterType.java
+++ b/src/main/java/org/zwobble/couscous/interpreter/types/ParameterizedInterpreterType.java
@@ -6,27 +6,33 @@ import org.zwobble.couscous.ast.StatementNode;
import org.zwobble.couscous.interpreter.Arguments;
import org.zwobble.couscous.interpreter.Environment;
import org.zwobble.couscous.interpreter.values.InterpreterValue;
-import org.zwobble.couscous.types.ScalarType;
+import org.zwobble.couscous.types.ParameterizedType;
import org.zwobble.couscous.types.Type;
+import org.zwobble.couscous.types.TypeParameter;
+import org.zwobble.couscous.types.Types;
+import org.zwobble.couscous.util.ExtraIterables;
import java.util.List;
+import java.util.Map;
import java.util.Optional;
import java.util.Set;
+import java.util.stream.Collectors;
import static org.zwobble.couscous.types.ParameterizedType.parameterizedType;
+import static org.zwobble.couscous.util.ExtraMaps.toMap;
public class ParameterizedInterpreterType implements InterpreterType {
- private final InterpreterType rawType;
+ private final InterpreterType genericType;
private final List<Type> parameters;
- public ParameterizedInterpreterType(InterpreterType rawType, List<Type> parameters) {
- this.rawType = rawType;
+ public ParameterizedInterpreterType(InterpreterType genericType, List<Type> parameters) {
+ this.genericType = genericType;
this.parameters = parameters;
}
@Override
public Type getType() {
- return parameterizedType((ScalarType) rawType.getType(), parameters);
+ return parameterizedType(((ParameterizedType) genericType.getType()).getRawType(), parameters);
}
// TODO: implement the other methods properly.
@@ -36,12 +42,18 @@ public class ParameterizedInterpreterType implements InterpreterType {
@Override
public Set<Type> getSuperTypes() {
- throw new UnsupportedOperationException();
+ Map<TypeParameter, Type> replacements = toMap(
+ ExtraIterables.cast(TypeParameter.class, ((ParameterizedType) genericType.getType()).getParameters()),
+ parameters);
+ return genericType.getSuperTypes()
+ .stream()
+ .map(type -> Types.substitute(type, replacements))
+ .collect(Collectors.toSet());
}
@Override
public Optional<FieldDeclarationNode> getField(String fieldName) {
- throw new UnsupportedOperationException();
+ return genericType.getField(fieldName);
}
@Override
@@ -56,7 +68,7 @@ public class ParameterizedInterpreterType implements InterpreterType {
@Override
public InterpreterValue callMethod(Environment environment, InterpreterValue value, MethodSignature signature, Arguments arguments) {
- throw new UnsupportedOperationException();
+ return genericType.callMethod(environment, value, signature.generic(), arguments);
}
@Override
diff --git a/src/main/java/org/zwobble/couscous/interpreter/types/UserDefinedInterpreterType.java b/src/main/java/org/zwobble/couscous/interpreter/types/UserDefinedInterpreterType.java
index 3b056f1..c26fb32 100644
--- a/src/main/java/org/zwobble/couscous/interpreter/types/UserDefinedInterpreterType.java
+++ b/src/main/java/org/zwobble/couscous/interpreter/types/UserDefinedInterpreterType.java
@@ -1,15 +1,15 @@
package org.zwobble.couscous.interpreter.types;
import org.zwobble.couscous.ast.*;
+import org.zwobble.couscous.interpreter.Arguments;
import org.zwobble.couscous.interpreter.Environment;
import org.zwobble.couscous.interpreter.Executor;
import org.zwobble.couscous.interpreter.InterpreterTypes;
-import org.zwobble.couscous.interpreter.Arguments;
import org.zwobble.couscous.interpreter.errors.NoSuchMethod;
import org.zwobble.couscous.interpreter.errors.WrongNumberOfArguments;
import org.zwobble.couscous.interpreter.values.InterpreterValue;
-import org.zwobble.couscous.types.ScalarType;
import org.zwobble.couscous.types.Type;
+import org.zwobble.couscous.types.TypeParameter;
import java.util.List;
import java.util.Map;
@@ -17,6 +17,7 @@ import java.util.Optional;
import java.util.Set;
import static com.google.common.collect.Iterables.filter;
+import static org.zwobble.couscous.types.ParameterizedType.parameterizedType;
import static org.zwobble.couscous.util.Casts.tryCast;
import static org.zwobble.couscous.util.ExtraLists.eagerMap;
import static org.zwobble.couscous.util.ExtraLists.list;
@@ -35,12 +36,17 @@ public class UserDefinedInterpreterType implements InterpreterType {
.orElse(map());
this.methods = toMapWithKeys(
filter(type.getMethods(), method -> !method.isAbstract()),
- method -> method.signature());
+ method -> method.signature().generic());
}
@Override
- public ScalarType getType() {
- return type.getName();
+ public Type getType() {
+ List<Type> parameters = eagerMap(
+ type.getTypeParameters(),
+ parameter -> new TypeParameter(type.getName(), parameter.getName()));
+ return parameters.isEmpty()
+ ? type.getName()
+ : parameterizedType(type.getName(), parameters);
}
@Override
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 50ed24f..b0b7992 100644
--- a/src/main/java/org/zwobble/couscous/interpreter/values/InterpreterFields.java
+++ b/src/main/java/org/zwobble/couscous/interpreter/values/InterpreterFields.java
@@ -1,7 +1,6 @@
package org.zwobble.couscous.interpreter.values;
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;
@@ -39,7 +38,8 @@ public class InterpreterFields {
public void setField(String fieldName, InterpreterValue value) {
FieldDeclarationNode field = getFieldDefinition(fieldName);
- InterpreterTypes.checkIsInstance(field.getType(), value);
+ // TODO: re-enable this
+ //InterpreterTypes.checkIsInstance(field.getType(), value);
fields.put(fieldName, value);
}