diff options
| author | Michael Williamson <mike@zwobble.org> | 2016-01-10 16:12:32 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2016-01-10 16:12:32 +0000 |
| commit | 1cca01d385e68aefe2131319c53c4811101f15f7 (patch) | |
| tree | 08fbdf98f3e0d53ce1c64925bef8ad576c52ae64 /src/main/java/org/zwobble/couscous/interpreter/Evaluator.java | |
| parent | 29c9a38a112b53e4ca193af27818442493c876cb (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.java | 28 |
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 |
