diff options
Diffstat (limited to 'src/main/java/org/zwobble/couscous/interpreter/Executor.java')
| -rw-r--r-- | src/main/java/org/zwobble/couscous/interpreter/Executor.java | 38 |
1 files changed, 11 insertions, 27 deletions
diff --git a/src/main/java/org/zwobble/couscous/interpreter/Executor.java b/src/main/java/org/zwobble/couscous/interpreter/Executor.java index cbeeaa4..4002238 100644 --- a/src/main/java/org/zwobble/couscous/interpreter/Executor.java +++ b/src/main/java/org/zwobble/couscous/interpreter/Executor.java @@ -1,20 +1,14 @@ package org.zwobble.couscous.interpreter; -import java.util.List; import java.util.Optional; -import java.util.function.Supplier; -import java.util.stream.Collectors; import java.util.stream.IntStream; -import org.zwobble.couscous.Project; import org.zwobble.couscous.ast.ExpressionStatementNode; import org.zwobble.couscous.ast.MethodNode; import org.zwobble.couscous.ast.ReturnNode; import org.zwobble.couscous.ast.StatementNode; import org.zwobble.couscous.ast.visitors.StatementNodeVisitor; -import org.zwobble.couscous.values.ConcreteType; import org.zwobble.couscous.values.InterpreterValue; -import org.zwobble.couscous.values.StaticMethodValue; import org.zwobble.couscous.values.UnitValue; import static java.util.stream.Collectors.toMap; @@ -23,25 +17,20 @@ import static org.zwobble.couscous.interpreter.Evaluator.eval; import lombok.val; public class Executor implements StatementNodeVisitor<Optional<InterpreterValue>> { - public static StaticMethodValue callMethod(MethodNode method) { - Supplier<List<ConcreteType<?>>> argumentTypes = () -> method.getArguments() - .stream() - .<ConcreteType<?>>map(arg -> arg.getType()) - .collect(Collectors.toList()); - return new StaticMethodValue(argumentTypes, arguments -> { - val environment = buildEnvironment(method, arguments); - - for (val statement : method.getBody()) { - val result = exec(environment, statement); - if (result.isPresent()) { - return result.get(); - } + public static InterpreterValue callMethod(Environment environment, MethodNode method, Arguments arguments) { + val innerEnvironment = buildEnvironment(environment, method, arguments); + + for (val statement : method.getBody()) { + val result = exec(innerEnvironment, statement); + if (result.isPresent()) { + return result.get(); } - return UnitValue.UNIT; - }); + } + return UnitValue.UNIT; } private static Environment buildEnvironment( + final Environment environment, final MethodNode method, Arguments arguments) { @@ -50,12 +39,7 @@ public class Executor implements StatementNodeVisitor<Optional<InterpreterValue> .collect(toMap( index -> method.getArguments().get(index).getId(), index -> arguments.get(index))); - return new Environment(new Project() { - @Override - public ConcreteType<?> findClass(String name) { - throw new UnsupportedOperationException(); - } - }, stackFrame); + return environment.withStackFrame(stackFrame); } public static Optional<InterpreterValue> exec(Environment environment, StatementNode statement) { |
