From 1cca01d385e68aefe2131319c53c4811101f15f7 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sun, 10 Jan 2016 16:12:32 +0000 Subject: Handle both static and instance method calls in one node --- .../zwobble/couscous/interpreter/Evaluator.java | 28 ++++++++++++---------- 1 file changed, 15 insertions(+), 13 deletions(-) (limited to 'src/main/java/org/zwobble/couscous/interpreter/Evaluator.java') 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 { @Override public InterpreterValue visit(MethodCallNode methodCall) { - InterpreterValue receiver = eval(methodCall.getReceiver()); - ConcreteType type = receiver.getType(); List 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 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() { + @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 -- cgit v1.2.3