diff options
| author | Michael Williamson <mike@zwobble.org> | 2015-10-02 19:06:57 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2015-10-02 19:06:57 +0100 |
| commit | c02fac3e8b50b1941a8d3f35a033212c1e51d5d4 (patch) | |
| tree | a9d95d665f435283d053387a050bc25b53220f52 /src/main/java/org/zwobble/couscous/values | |
| parent | 6c3751fd9dd53aef044cea5bbc1dbf87bf21462a (diff) | |
Preserve environment across calls
Diffstat (limited to 'src/main/java/org/zwobble/couscous/values')
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); } } |
