aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org/zwobble/couscous/values
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2015-10-02 19:06:57 +0100
committerMichael Williamson <mike@zwobble.org>2015-10-02 19:06:57 +0100
commitc02fac3e8b50b1941a8d3f35a033212c1e51d5d4 (patch)
treea9d95d665f435283d053387a050bc25b53220f52 /src/main/java/org/zwobble/couscous/values
parent6c3751fd9dd53aef044cea5bbc1dbf87bf21462a (diff)
Preserve environment across calls
Diffstat (limited to 'src/main/java/org/zwobble/couscous/values')
-rw-r--r--src/main/java/org/zwobble/couscous/values/ConcreteType.java19
-rw-r--r--src/main/java/org/zwobble/couscous/values/IntegerValue.java2
-rw-r--r--src/main/java/org/zwobble/couscous/values/StaticMethodValue.java9
3 files changed, 20 insertions, 10 deletions
diff --git a/src/main/java/org/zwobble/couscous/values/ConcreteType.java b/src/main/java/org/zwobble/couscous/values/ConcreteType.java
index 7d296db..43016d1 100644
--- a/src/main/java/org/zwobble/couscous/values/ConcreteType.java
+++ b/src/main/java/org/zwobble/couscous/values/ConcreteType.java
@@ -3,11 +3,12 @@ package org.zwobble.couscous.values;
import java.util.List;
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 org.zwobble.couscous.ast.ClassNode;
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;
@@ -42,7 +43,7 @@ public class ConcreteType<T> {
public Builder<T> staticMethod(
String name,
Supplier<List<ConcreteType<?>>> argumentsTypes,
- Function<Arguments, InterpreterValue> method) {
+ BiFunction<Environment, Arguments, InterpreterValue> method) {
staticMethods.put(name, new StaticMethodValue(argumentsTypes, method));
return this;
}
@@ -58,7 +59,15 @@ public class ConcreteType<T> {
.filter(method -> method.isStatic())
.collect(toMap(
method -> method.getName(),
- Executor::callMethod));
+ method -> {
+ Supplier<List<ConcreteType<?>>> argumentTypes = () -> method.getArguments()
+ .stream()
+ .<ConcreteType<?>>map(arg -> arg.getType())
+ .collect(Collectors.toList());
+ return new StaticMethodValue(argumentTypes, (environment, arguments) -> {
+ return Executor.callMethod(environment, method, arguments);
+ });
+ }));
return new ConcreteType<Void>(
classNode.getName(),
ImmutableMap.of(),
@@ -88,9 +97,9 @@ public class ConcreteType<T> {
return method.apply((T)receiver, new Arguments(arguments));
}
- public InterpreterValue callStaticMethod(String methodName, List<InterpreterValue> arguments) {
+ public InterpreterValue callStaticMethod(Environment environment, String methodName, List<InterpreterValue> arguments) {
val method = findMethod(staticMethods, methodName, arguments);
- return method.apply(new Arguments(arguments));
+ return method.apply(environment, new Arguments(arguments));
}
private static <T extends Callable> T findMethod(Map<String, T> methods, String methodName, List<InterpreterValue> arguments) {
diff --git a/src/main/java/org/zwobble/couscous/values/IntegerValue.java b/src/main/java/org/zwobble/couscous/values/IntegerValue.java
index 1b20a01..76d0c59 100644
--- a/src/main/java/org/zwobble/couscous/values/IntegerValue.java
+++ b/src/main/java/org/zwobble/couscous/values/IntegerValue.java
@@ -9,7 +9,7 @@ import lombok.val;
public class IntegerValue implements InterpreterValue {
public static final ConcreteType<?> TYPE = ConcreteType.<IntegerValue>builder("Integer")
.staticMethod("parseInt", () -> asList(StringValue.TYPE),
- arguments -> {
+ (environment, arguments) -> {
val value = (StringValue)arguments.get(0);
return new IntegerValue(Integer.parseInt(value.getValue()));
})
diff --git a/src/main/java/org/zwobble/couscous/values/StaticMethodValue.java b/src/main/java/org/zwobble/couscous/values/StaticMethodValue.java
index 15a70d3..80ace03 100644
--- a/src/main/java/org/zwobble/couscous/values/StaticMethodValue.java
+++ b/src/main/java/org/zwobble/couscous/values/StaticMethodValue.java
@@ -1,10 +1,11 @@
package org.zwobble.couscous.values;
import java.util.List;
-import java.util.function.Function;
+import java.util.function.BiFunction;
import java.util.function.Supplier;
import org.zwobble.couscous.interpreter.Arguments;
+import org.zwobble.couscous.interpreter.Environment;
import lombok.AccessLevel;
import lombok.Getter;
@@ -15,15 +16,15 @@ public class StaticMethodValue implements Callable {
@Getter(value=AccessLevel.NONE)
Supplier<List<ConcreteType<?>>> argumentTypes;
@Getter(value=AccessLevel.NONE)
- Function<Arguments, InterpreterValue> apply;
+ BiFunction<Environment, Arguments, InterpreterValue> apply;
@Override
public List<ConcreteType<?>> getArgumentTypes() {
return argumentTypes.get();
}
- public InterpreterValue apply(Arguments arguments) {
- return apply.apply(arguments);
+ public InterpreterValue apply(Environment environment, Arguments arguments) {
+ return apply.apply(environment, arguments);
}
}