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 | |
| parent | 36f3fdbcad95dcc5bfec785fffca4f42b24d1307 (diff) | |
Allow static method calls
Diffstat (limited to 'src/main/java/org/zwobble/couscous/interpreter')
| -rw-r--r-- | src/main/java/org/zwobble/couscous/interpreter/Environment.java | 10 | ||||
| -rw-r--r-- | src/main/java/org/zwobble/couscous/interpreter/Evaluator.java | 17 |
2 files changed, 25 insertions, 2 deletions
diff --git a/src/main/java/org/zwobble/couscous/interpreter/Environment.java b/src/main/java/org/zwobble/couscous/interpreter/Environment.java index a3b3871..ea4a5e4 100644 --- a/src/main/java/org/zwobble/couscous/interpreter/Environment.java +++ b/src/main/java/org/zwobble/couscous/interpreter/Environment.java @@ -3,6 +3,8 @@ package org.zwobble.couscous.interpreter; import java.util.HashMap; import java.util.Map; +import org.zwobble.couscous.values.ConcreteType; +import org.zwobble.couscous.values.IntegerValue; import org.zwobble.couscous.values.InterpreterValue; public class Environment { @@ -19,4 +21,12 @@ public class Environment { public void put(int referentId, InterpreterValue value) { stackFrame.put(referentId, value); } + + public ConcreteType<?> findClass(String className) { + if (className == "java.lang.Integer") { + return IntegerValue.TYPE; + } else { + throw new UnsupportedOperationException(); + } + } } 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); } } |
