aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org/zwobble/couscous/interpreter/Evaluator.java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2016-01-06 08:16:52 +0000
committerMichael Williamson <mike@zwobble.org>2016-01-06 08:18:18 +0000
commite4229671c4cf6db860fc6cf68bcfb8fdd69fdcb8 (patch)
treeb8f61f97f0e9af47f90f49e0debaf061d07f9229 /src/main/java/org/zwobble/couscous/interpreter/Evaluator.java
parent5eafcf8cb10546916d4b38c3208ebfdfafff93e4 (diff)
Support method overloading in interpreter
Diffstat (limited to 'src/main/java/org/zwobble/couscous/interpreter/Evaluator.java')
-rw-r--r--src/main/java/org/zwobble/couscous/interpreter/Evaluator.java12
1 files changed, 10 insertions, 2 deletions
diff --git a/src/main/java/org/zwobble/couscous/interpreter/Evaluator.java b/src/main/java/org/zwobble/couscous/interpreter/Evaluator.java
index 910cba7..1271d72 100644
--- a/src/main/java/org/zwobble/couscous/interpreter/Evaluator.java
+++ b/src/main/java/org/zwobble/couscous/interpreter/Evaluator.java
@@ -10,6 +10,8 @@ import org.zwobble.couscous.values.IntegerValue;
import java.util.List;
import java.util.stream.Collectors;
+import static org.zwobble.couscous.util.ExtraLists.eagerMap;
+
public class Evaluator implements ExpressionNodeMapper<InterpreterValue> {
public static InterpreterValue eval(Environment environment, ExpressionNode expression) {
return new Evaluator(environment).eval(expression);
@@ -76,14 +78,20 @@ public class Evaluator implements ExpressionNodeMapper<InterpreterValue> {
InterpreterValue receiver = eval(methodCall.getReceiver());
ConcreteType type = receiver.getType();
List<InterpreterValue> arguments = evalArguments(methodCall.getArguments());
- return type.callMethod(environment, receiver, methodCall.getMethodName(), arguments);
+ MethodSignature signature = new MethodSignature(
+ methodCall.getMethodName(),
+ eagerMap(arguments, argument -> argument.getType().getName()));
+ return type.callMethod(environment, receiver, signature, arguments);
}
@Override
public InterpreterValue visit(StaticMethodCallNode staticMethodCall) {
ConcreteType clazz = environment.findClass(staticMethodCall.getClassName());
List<InterpreterValue> arguments = evalArguments(staticMethodCall.getArguments());
- return clazz.callStaticMethod(environment, staticMethodCall.getMethodName(), arguments);
+ MethodSignature signature = new MethodSignature(
+ staticMethodCall.getMethodName(),
+ eagerMap(arguments, argument -> argument.getType().getName()));
+ return clazz.callStaticMethod(environment, signature, arguments);
}
@Override