diff options
| author | Michael Williamson <mike@zwobble.org> | 2015-10-01 21:04:37 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2015-10-01 21:04:37 +0100 |
| commit | 8187130b8a8aabbcf983e530413d6969141d6da2 (patch) | |
| tree | d72dcb499d08812e7391b95cdf780dff054b3a3c /src/main/java/org/zwobble/couscous/interpreter/Evaluator.java | |
| parent | 36f3fdbcad95dcc5bfec785fffca4f42b24d1307 (diff) | |
Allow static method calls
Diffstat (limited to 'src/main/java/org/zwobble/couscous/interpreter/Evaluator.java')
| -rw-r--r-- | src/main/java/org/zwobble/couscous/interpreter/Evaluator.java | 17 |
1 files changed, 15 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 6a566c9..5acef94 100644 --- a/src/main/java/org/zwobble/couscous/interpreter/Evaluator.java +++ b/src/main/java/org/zwobble/couscous/interpreter/Evaluator.java @@ -1,11 +1,13 @@ package org.zwobble.couscous.interpreter; +import java.util.List; import java.util.stream.Collectors; import org.zwobble.couscous.ast.Assignment; import org.zwobble.couscous.ast.ExpressionNode; import org.zwobble.couscous.ast.LiteralNode; import org.zwobble.couscous.ast.MethodCallNode; +import org.zwobble.couscous.ast.StaticMethodCallNode; import org.zwobble.couscous.ast.TernaryConditionalNode; import org.zwobble.couscous.ast.VariableReferenceNode; import org.zwobble.couscous.ast.visitors.ExpressionNodeVisitor; @@ -62,10 +64,21 @@ public class Evaluator implements ExpressionNodeVisitor<InterpreterValue> { public InterpreterValue visit(MethodCallNode methodCall) { val receiver = eval(methodCall.getReceiver()); val type = receiver.getType(); - val arguments = methodCall.getArguments() + val arguments = evalArguments(methodCall.getArguments()); + return type.callMethod(receiver, methodCall.getMethodName(), arguments); + } + + private List<InterpreterValue> evalArguments(List<ExpressionNode> arguments) { + return arguments .stream() .map(argument -> eval(argument)) .collect(Collectors.toList()); - return type.callMethod(receiver, methodCall.getMethodName(), arguments); + } + + @Override + public InterpreterValue visit(StaticMethodCallNode staticMethodCall) { + val clazz = environment.findClass(staticMethodCall.getClassName()); + val arguments = evalArguments(staticMethodCall.getArguments()); + return clazz.callStaticMethod(staticMethodCall.getMethodName(), arguments); } } |
