aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org/zwobble/couscous/interpreter/Evaluator.java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2016-01-10 16:12:32 +0000
committerMichael Williamson <mike@zwobble.org>2016-01-10 16:12:32 +0000
commit1cca01d385e68aefe2131319c53c4811101f15f7 (patch)
tree08fbdf98f3e0d53ce1c64925bef8ad576c52ae64 /src/main/java/org/zwobble/couscous/interpreter/Evaluator.java
parent29c9a38a112b53e4ca193af27818442493c876cb (diff)
Handle both static and instance method calls in one node
Diffstat (limited to 'src/main/java/org/zwobble/couscous/interpreter/Evaluator.java')
-rw-r--r--src/main/java/org/zwobble/couscous/interpreter/Evaluator.java28
1 files changed, 15 insertions, 13 deletions
diff --git a/src/main/java/org/zwobble/couscous/interpreter/Evaluator.java b/src/main/java/org/zwobble/couscous/interpreter/Evaluator.java
index 059f2ad..e319353 100644
--- a/src/main/java/org/zwobble/couscous/interpreter/Evaluator.java
+++ b/src/main/java/org/zwobble/couscous/interpreter/Evaluator.java
@@ -75,23 +75,25 @@ public class Evaluator implements ExpressionNodeMapper<InterpreterValue> {
@Override
public InterpreterValue visit(MethodCallNode methodCall) {
- InterpreterValue receiver = eval(methodCall.getReceiver());
- ConcreteType type = receiver.getType();
List<InterpreterValue> arguments = evalArguments(methodCall.getArguments());
MethodSignature signature = new MethodSignature(
methodCall.getMethodName(),
eagerMap(methodCall.getArguments(), argument -> argument.getType()));
- 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());
- MethodSignature signature = new MethodSignature(
- staticMethodCall.getMethodName(),
- eagerMap(arguments, argument -> argument.getType().getName()));
- return clazz.callStaticMethod(environment, signature, arguments);
+
+ return methodCall.getReceiver().accept(new Receiver.Mapper<InterpreterValue>() {
+ @Override
+ public InterpreterValue visit(ExpressionNode receiverExpression) {
+ InterpreterValue receiver = eval(receiverExpression);
+ ConcreteType type = receiver.getType();
+ return type.callMethod(environment, receiver, signature, arguments);
+ }
+
+ @Override
+ public InterpreterValue visit(TypeName receiver) {
+ ConcreteType clazz = environment.findClass(receiver);
+ return clazz.callStaticMethod(environment, signature, arguments);
+ }
+ });
}
@Override