aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org/zwobble/couscous/values
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2015-10-02 18:40:19 +0100
committerMichael Williamson <mike@zwobble.org>2015-10-02 18:40:19 +0100
commit6c3751fd9dd53aef044cea5bbc1dbf87bf21462a (patch)
treee3793b01a9358db3ffb0841710bed9e2d4615fef /src/main/java/org/zwobble/couscous/values
parent30d2215800deafbdcfb134f1356777ec0139bb7a (diff)
Move method call logic into Executor
Diffstat (limited to 'src/main/java/org/zwobble/couscous/values')
-rw-r--r--src/main/java/org/zwobble/couscous/values/ConcreteType.java42
1 files changed, 2 insertions, 40 deletions
diff --git a/src/main/java/org/zwobble/couscous/values/ConcreteType.java b/src/main/java/org/zwobble/couscous/values/ConcreteType.java
index 6aea1db..7d296db 100644
--- a/src/main/java/org/zwobble/couscous/values/ConcreteType.java
+++ b/src/main/java/org/zwobble/couscous/values/ConcreteType.java
@@ -5,14 +5,10 @@ import java.util.Map;
import java.util.function.BiFunction;
import java.util.function.Function;
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.ClassNode;
-import org.zwobble.couscous.ast.MethodNode;
import org.zwobble.couscous.interpreter.Arguments;
-import org.zwobble.couscous.interpreter.Environment;
+import org.zwobble.couscous.interpreter.Executor;
import org.zwobble.couscous.interpreter.NoSuchMethod;
import org.zwobble.couscous.interpreter.UnexpectedValueType;
import org.zwobble.couscous.interpreter.WrongNumberOfArguments;
@@ -20,7 +16,6 @@ import org.zwobble.couscous.interpreter.WrongNumberOfArguments;
import com.google.common.collect.ImmutableMap;
import static java.util.stream.Collectors.toMap;
-import static org.zwobble.couscous.interpreter.Executor.exec;
import lombok.val;
@@ -63,46 +58,13 @@ public class ConcreteType<T> {
.filter(method -> method.isStatic())
.collect(toMap(
method -> method.getName(),
- 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();
- }
- }
- return UnitValue.UNIT;
- });
- }));
+ Executor::callMethod));
return new ConcreteType<Void>(
classNode.getName(),
ImmutableMap.of(),
staticMethods);
}
- private static Environment buildEnvironment(
- final MethodNode method,
- Arguments arguments) {
-
- val stackFrame = IntStream.range(0, method.getArguments().size())
- .boxed()
- .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);
- }
-
private String name;
private Map<String, MethodValue<T>> methods;
private Map<String, StaticMethodValue> staticMethods;