aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org/zwobble/couscous/interpreter/Executor.java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2016-07-14 16:35:31 +0100
committerMichael Williamson <mike@zwobble.org>2016-07-14 16:35:31 +0100
commit284d439f4db00be49de12862b2610a40d84cfc81 (patch)
treea6a3161536b58ff9e5a4491d9820046096e9907c /src/main/java/org/zwobble/couscous/interpreter/Executor.java
parent6d5608b5061bc7b5e40db9c37f186cfd0d48a3e6 (diff)
Remove NodeMapper in favour of a DynamicNodeMapper
Diffstat (limited to 'src/main/java/org/zwobble/couscous/interpreter/Executor.java')
-rw-r--r--src/main/java/org/zwobble/couscous/interpreter/Executor.java28
1 files changed, 21 insertions, 7 deletions
diff --git a/src/main/java/org/zwobble/couscous/interpreter/Executor.java b/src/main/java/org/zwobble/couscous/interpreter/Executor.java
index 9641c5e..50fdcff 100644
--- a/src/main/java/org/zwobble/couscous/interpreter/Executor.java
+++ b/src/main/java/org/zwobble/couscous/interpreter/Executor.java
@@ -1,13 +1,15 @@
package org.zwobble.couscous.interpreter;
+import net.bytebuddy.description.type.TypeDescription;
import org.zwobble.couscous.ast.*;
-import org.zwobble.couscous.ast.visitors.NodeMapperWithDefault;
+import org.zwobble.couscous.ast.visitors.DynamicNodeMapper;
import org.zwobble.couscous.ast.visitors.StatementNodeMapper;
import org.zwobble.couscous.interpreter.values.InterpreterValue;
import org.zwobble.couscous.interpreter.values.UnitInterpreterValue;
import java.util.List;
import java.util.Optional;
+import java.util.function.Function;
import java.util.stream.Stream;
import static org.zwobble.couscous.ast.structure.NodeStructure.descendantNodesAndSelf;
@@ -63,12 +65,24 @@ public class Executor implements StatementNodeMapper<Optional<InterpreterValue>>
private static Stream<VariableNode> findDeclarations(List<StatementNode> body) {
return body.stream()
.flatMap(statement -> descendantNodesAndSelf(statement, node -> node instanceof StatementNode))
- .flatMap(node -> node.accept(new NodeMapperWithDefault<Stream<VariableNode>>(Stream.empty()) {
- @Override
- public Stream<VariableNode> visit(LocalVariableDeclarationNode localVariableDeclaration) {
- return Stream.of(localVariableDeclaration);
- }
- }));
+ .flatMap(findDirectDeclarations);
+ }
+
+ private static final Function<Node, Stream<VariableNode>> findDirectDeclarations =
+ DynamicNodeMapper.<FindDirectDeclarations, Stream<VariableNode>>build(
+ FindDirectDeclarations.class,
+ new TypeDescription.ForLoadedType(Stream.class),
+ "visit"
+ ).instantiate(new FindDirectDeclarations());
+
+ public static class FindDirectDeclarations {
+ public Stream<VariableNode> visit(Node node) {
+ return Stream.empty();
+ }
+
+ public Stream<VariableNode> visit(LocalVariableDeclarationNode localVariableDeclaration) {
+ return Stream.of(localVariableDeclaration);
+ }
}
public static Optional<InterpreterValue> exec(Environment environment, Iterable<StatementNode> statements) {