aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2016-03-31 21:25:22 +0100
committerMichael Williamson <mike@zwobble.org>2016-03-31 21:25:22 +0100
commitbb107372f059eadf3c2f0f576d464e4232f2ca33 (patch)
tree6053bb15fd3747d1ffb6f9eda916faaa2f334a2e /src
parentc0f18f14d6dd7d8f8ec890fe6d8fd67c4fba7ea3 (diff)
Pass around Arguments instead of List<InterpreterValue>
Diffstat (limited to 'src')
-rw-r--r--src/main/java/org/zwobble/couscous/interpreter/Evaluator.java4
-rw-r--r--src/main/java/org/zwobble/couscous/interpreter/Interpreter.java2
-rw-r--r--src/main/java/org/zwobble/couscous/interpreter/types/InterpreterType.java7
-rw-r--r--src/main/java/org/zwobble/couscous/interpreter/types/IntrinsicInterpreterType.java12
-rw-r--r--src/main/java/org/zwobble/couscous/interpreter/types/ParameterizedInterpreterType.java7
-rw-r--r--src/main/java/org/zwobble/couscous/interpreter/types/UserDefinedInterpreterType.java14
-rw-r--r--src/main/java/org/zwobble/couscous/interpreter/values/InstanceReceiverValue.java5
-rw-r--r--src/main/java/org/zwobble/couscous/interpreter/values/ReceiverValue.java5
-rw-r--r--src/main/java/org/zwobble/couscous/interpreter/values/StaticReceiverValue.java5
9 files changed, 31 insertions, 30 deletions
diff --git a/src/main/java/org/zwobble/couscous/interpreter/Evaluator.java b/src/main/java/org/zwobble/couscous/interpreter/Evaluator.java
index 64f28ad..5488506 100644
--- a/src/main/java/org/zwobble/couscous/interpreter/Evaluator.java
+++ b/src/main/java/org/zwobble/couscous/interpreter/Evaluator.java
@@ -102,7 +102,7 @@ public class Evaluator implements ExpressionNodeMapper<InterpreterValue> {
MethodSignature signature = methodCall.signature();
return evalReceiver(methodCall.getReceiver())
- .callMethod(environment, signature, arguments);
+ .callMethod(environment, signature, new Arguments(arguments));
}
@Override
@@ -111,7 +111,7 @@ public class Evaluator implements ExpressionNodeMapper<InterpreterValue> {
List<InterpreterValue> arguments = evalArguments(call.getArguments());
Optional<List<Type>> typeParameters = tryCast(ParameterizedType.class, call.getType())
.map(type -> type.getParameters());
- return clazz.callConstructor(environment, typeParameters, arguments);
+ return clazz.callConstructor(environment, typeParameters, new Arguments(arguments));
}
@Override
diff --git a/src/main/java/org/zwobble/couscous/interpreter/Interpreter.java b/src/main/java/org/zwobble/couscous/interpreter/Interpreter.java
index 1d8f1b0..b447367 100644
--- a/src/main/java/org/zwobble/couscous/interpreter/Interpreter.java
+++ b/src/main/java/org/zwobble/couscous/interpreter/Interpreter.java
@@ -30,6 +30,6 @@ public class Interpreter {
methodName,
eagerMap(arguments, argument -> argument.getType().getType()),
returnType);
- return clazz.callMethod(environment, signature, arguments);
+ return clazz.callMethod(environment, signature, new Arguments(arguments));
}
} \ No newline at end of file
diff --git a/src/main/java/org/zwobble/couscous/interpreter/types/InterpreterType.java b/src/main/java/org/zwobble/couscous/interpreter/types/InterpreterType.java
index 7ffe5d5..37d5c12 100644
--- a/src/main/java/org/zwobble/couscous/interpreter/types/InterpreterType.java
+++ b/src/main/java/org/zwobble/couscous/interpreter/types/InterpreterType.java
@@ -3,6 +3,7 @@ package org.zwobble.couscous.interpreter.types;
import org.zwobble.couscous.ast.FieldDeclarationNode;
import org.zwobble.couscous.ast.MethodSignature;
import org.zwobble.couscous.ast.StatementNode;
+import org.zwobble.couscous.interpreter.Arguments;
import org.zwobble.couscous.types.Type;
import org.zwobble.couscous.interpreter.Environment;
import org.zwobble.couscous.interpreter.values.InterpreterValue;
@@ -16,7 +17,7 @@ public interface InterpreterType {
Set<Type> getSuperTypes();
Optional<FieldDeclarationNode> getField(String fieldName);
List<StatementNode> getStaticConstructor();
- void callConstructor(Environment environment, InterpreterValue thisValue, List<InterpreterValue> arguments);
- InterpreterValue callMethod(Environment environment, InterpreterValue value, MethodSignature signature, List<InterpreterValue> arguments);
- InterpreterValue callStaticMethod(Environment environment, MethodSignature signature, List<InterpreterValue> arguments);
+ void callConstructor(Environment environment, InterpreterValue thisValue, Arguments arguments);
+ InterpreterValue callMethod(Environment environment, InterpreterValue value, MethodSignature signature, Arguments arguments);
+ InterpreterValue callStaticMethod(Environment environment, MethodSignature signature, Arguments arguments);
}
diff --git a/src/main/java/org/zwobble/couscous/interpreter/types/IntrinsicInterpreterType.java b/src/main/java/org/zwobble/couscous/interpreter/types/IntrinsicInterpreterType.java
index 050516d..01418fa 100644
--- a/src/main/java/org/zwobble/couscous/interpreter/types/IntrinsicInterpreterType.java
+++ b/src/main/java/org/zwobble/couscous/interpreter/types/IntrinsicInterpreterType.java
@@ -137,15 +137,15 @@ public class IntrinsicInterpreterType implements InterpreterType {
}
@Override
- public InterpreterValue callMethod(Environment environment, InterpreterValue receiver, MethodSignature signature, List<InterpreterValue> arguments) {
+ public InterpreterValue callMethod(Environment environment, InterpreterValue receiver, MethodSignature signature, Arguments arguments) {
MethodValue method = findMethod(methods, signature);
- return method.apply(environment, MethodCallArguments.of(receiver, new Arguments(arguments)));
+ return method.apply(environment, MethodCallArguments.of(receiver, arguments));
}
@Override
- public InterpreterValue callStaticMethod(Environment environment, MethodSignature signature, List<InterpreterValue> arguments) {
+ public InterpreterValue callStaticMethod(Environment environment, MethodSignature signature, Arguments arguments) {
StaticMethodValue method = findMethod(staticMethods, signature);
- return method.apply(environment, new Arguments(arguments));
+ return method.apply(environment, arguments);
}
private static <T extends Callable> T findMethod(Map<MethodSignature, T> methods, MethodSignature signature) {
@@ -156,8 +156,8 @@ public class IntrinsicInterpreterType implements InterpreterType {
}
@Override
- public void callConstructor(Environment environment, InterpreterValue thisValue, List<InterpreterValue> arguments) {
- constructor.apply(environment, MethodCallArguments.of(thisValue, new Arguments(arguments)));
+ public void callConstructor(Environment environment, InterpreterValue thisValue, Arguments arguments) {
+ constructor.apply(environment, MethodCallArguments.of(thisValue, 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 f890fb1..52ec6e1 100644
--- a/src/main/java/org/zwobble/couscous/interpreter/types/ParameterizedInterpreterType.java
+++ b/src/main/java/org/zwobble/couscous/interpreter/types/ParameterizedInterpreterType.java
@@ -3,6 +3,7 @@ package org.zwobble.couscous.interpreter.types;
import org.zwobble.couscous.ast.FieldDeclarationNode;
import org.zwobble.couscous.ast.MethodSignature;
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;
@@ -49,17 +50,17 @@ public class ParameterizedInterpreterType implements InterpreterType {
}
@Override
- public void callConstructor(Environment environment, InterpreterValue thisValue, List<InterpreterValue> arguments) {
+ public void callConstructor(Environment environment, InterpreterValue thisValue, Arguments arguments) {
throw new UnsupportedOperationException();
}
@Override
- public InterpreterValue callMethod(Environment environment, InterpreterValue value, MethodSignature signature, List<InterpreterValue> arguments) {
+ public InterpreterValue callMethod(Environment environment, InterpreterValue value, MethodSignature signature, Arguments arguments) {
throw new UnsupportedOperationException();
}
@Override
- public InterpreterValue callStaticMethod(Environment environment, MethodSignature signature, List<InterpreterValue> arguments) {
+ public InterpreterValue callStaticMethod(Environment environment, MethodSignature signature, Arguments arguments) {
throw new UnsupportedOperationException();
}
}
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 b701bd0..3b056f1 100644
--- a/src/main/java/org/zwobble/couscous/interpreter/types/UserDefinedInterpreterType.java
+++ b/src/main/java/org/zwobble/couscous/interpreter/types/UserDefinedInterpreterType.java
@@ -61,7 +61,7 @@ public class UserDefinedInterpreterType implements InterpreterType {
}
@Override
- public void callConstructor(Environment environment, InterpreterValue thisValue, List<InterpreterValue> arguments) {
+ public void callConstructor(Environment environment, InterpreterValue thisValue, Arguments arguments) {
ConstructorNode constructor = tryCast(ClassNode.class, type)
// TODO: add test for this case
.orElseThrow(() -> new RuntimeException("Cannot instantiate non-class types"))
@@ -69,12 +69,12 @@ public class UserDefinedInterpreterType implements InterpreterType {
List<Type> formalArgumentTypes = eagerMap(
constructor.getArguments(),
FormalArgumentNode::getType);
- checkMethodArguments(formalArgumentTypes, arguments);
+ checkMethodArguments(formalArgumentTypes, arguments.getValues());
Executor.callConstructor(
environment,
constructor,
thisValue,
- new Arguments(arguments));
+ arguments);
}
private static void checkMethodArguments(final List<Type> argumentTypes, List<InterpreterValue> arguments) {
@@ -88,21 +88,21 @@ public class UserDefinedInterpreterType implements InterpreterType {
}
@Override
- public InterpreterValue callMethod(Environment environment, InterpreterValue value, MethodSignature signature, List<InterpreterValue> arguments) {
+ public InterpreterValue callMethod(Environment environment, InterpreterValue value, MethodSignature signature, Arguments arguments) {
return Executor.callMethod(
environment,
findMethod(signature, false),
Optional.of(value),
- new Arguments(arguments));
+ arguments);
}
@Override
- public InterpreterValue callStaticMethod(Environment environment, MethodSignature signature, List<InterpreterValue> arguments) {
+ public InterpreterValue callStaticMethod(Environment environment, MethodSignature signature, Arguments arguments) {
return Executor.callMethod(
environment,
findMethod(signature, true),
Optional.empty(),
- new Arguments(arguments));
+ arguments);
}
private MethodNode findMethod(MethodSignature signature, boolean isStatic) {
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 cdc2167..77effc9 100644
--- a/src/main/java/org/zwobble/couscous/interpreter/values/InstanceReceiverValue.java
+++ b/src/main/java/org/zwobble/couscous/interpreter/values/InstanceReceiverValue.java
@@ -1,11 +1,10 @@
package org.zwobble.couscous.interpreter.values;
import org.zwobble.couscous.ast.MethodSignature;
+import org.zwobble.couscous.interpreter.Arguments;
import org.zwobble.couscous.interpreter.Environment;
import org.zwobble.couscous.interpreter.types.InterpreterType;
-import java.util.List;
-
public class InstanceReceiverValue implements ReceiverValue {
private final InterpreterValue value;
@@ -14,7 +13,7 @@ public class InstanceReceiverValue implements ReceiverValue {
}
@Override
- public InterpreterValue callMethod(Environment environment, MethodSignature signature, List<InterpreterValue> arguments) {
+ public InterpreterValue callMethod(Environment environment, MethodSignature signature, Arguments arguments) {
InterpreterType type = value.getType();
return type.callMethod(environment, value, signature, arguments);
}
diff --git a/src/main/java/org/zwobble/couscous/interpreter/values/ReceiverValue.java b/src/main/java/org/zwobble/couscous/interpreter/values/ReceiverValue.java
index 5d6d804..b4c0dbc 100644
--- a/src/main/java/org/zwobble/couscous/interpreter/values/ReceiverValue.java
+++ b/src/main/java/org/zwobble/couscous/interpreter/values/ReceiverValue.java
@@ -1,12 +1,11 @@
package org.zwobble.couscous.interpreter.values;
import org.zwobble.couscous.ast.MethodSignature;
+import org.zwobble.couscous.interpreter.Arguments;
import org.zwobble.couscous.interpreter.Environment;
-import java.util.List;
-
public interface ReceiverValue {
- InterpreterValue callMethod(Environment environment, MethodSignature signature, List<InterpreterValue> arguments);
+ InterpreterValue callMethod(Environment environment, MethodSignature signature, Arguments arguments);
InterpreterValue getField(String fieldName);
void setField(String fieldName, InterpreterValue value);
}
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 deca938..51a1736 100644
--- a/src/main/java/org/zwobble/couscous/interpreter/values/StaticReceiverValue.java
+++ b/src/main/java/org/zwobble/couscous/interpreter/values/StaticReceiverValue.java
@@ -1,6 +1,7 @@
package org.zwobble.couscous.interpreter.values;
import org.zwobble.couscous.ast.MethodSignature;
+import org.zwobble.couscous.interpreter.Arguments;
import org.zwobble.couscous.interpreter.Environment;
import org.zwobble.couscous.interpreter.Executor;
import org.zwobble.couscous.interpreter.types.InterpreterType;
@@ -20,7 +21,7 @@ public class StaticReceiverValue implements ReceiverValue {
}
@Override
- public InterpreterValue callMethod(Environment environment, MethodSignature signature, List<InterpreterValue> arguments) {
+ public InterpreterValue callMethod(Environment environment, MethodSignature signature, Arguments arguments) {
return type.callStaticMethod(environment, signature, arguments);
}
@@ -38,7 +39,7 @@ public class StaticReceiverValue implements ReceiverValue {
Executor.exec(environment, type.getStaticConstructor());
}
- public InterpreterValue callConstructor(Environment environment, Optional<List<Type>> typeParameters, List<InterpreterValue> arguments) {
+ public InterpreterValue callConstructor(Environment environment, Optional<List<Type>> typeParameters, Arguments arguments) {
InterpreterType objectType = typeParameters
.<InterpreterType>map(parameters -> new ParameterizedInterpreterType(type, parameters))
.orElse(type);