aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org/zwobble
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2015-11-21 11:48:14 +0000
committerMichael Williamson <mike@zwobble.org>2015-11-21 11:48:14 +0000
commit9604bf821f926e9fc653705ec78093ccb19d1195 (patch)
treeba2dc08ac2f7ca02cf3360b711f8dd8e3def86c7 /src/main/java/org/zwobble
parentdf43ad49026543712029ca1a7155b4bd764fdcf2 (diff)
Only explore statements when finding declarations
Diffstat (limited to 'src/main/java/org/zwobble')
-rw-r--r--src/main/java/org/zwobble/couscous/ast/structure/NodeStructure.java11
-rw-r--r--src/main/java/org/zwobble/couscous/interpreter/Executor.java3
2 files changed, 12 insertions, 2 deletions
diff --git a/src/main/java/org/zwobble/couscous/ast/structure/NodeStructure.java b/src/main/java/org/zwobble/couscous/ast/structure/NodeStructure.java
index 5fdd505..6054711 100644
--- a/src/main/java/org/zwobble/couscous/ast/structure/NodeStructure.java
+++ b/src/main/java/org/zwobble/couscous/ast/structure/NodeStructure.java
@@ -3,11 +3,22 @@ package org.zwobble.couscous.ast.structure;
import org.zwobble.couscous.ast.*;
import org.zwobble.couscous.ast.visitors.NodeMapper;
+import java.util.function.Predicate;
import java.util.stream.Stream;
import static org.zwobble.couscous.util.ExtraStreams.concatStreams;
public class NodeStructure {
+ public static Stream<? extends Node> descendantNodesAndSelf(Node node, Predicate<Node> predicate) {
+ return Stream.concat(Stream.of(node), descendantNodes(node, predicate));
+ }
+
+ public static Stream<? extends Node> descendantNodes(Node node, Predicate<Node> predicate) {
+ return childNodes(node)
+ .filter(predicate)
+ .flatMap(child -> descendantNodesAndSelf(child, predicate));
+ }
+
public static Stream<? extends Node> descendantNodesAndSelf(Node node) {
return Stream.concat(Stream.of(node), descendantNodes(node));
}
diff --git a/src/main/java/org/zwobble/couscous/interpreter/Executor.java b/src/main/java/org/zwobble/couscous/interpreter/Executor.java
index c9528be..556e7d1 100644
--- a/src/main/java/org/zwobble/couscous/interpreter/Executor.java
+++ b/src/main/java/org/zwobble/couscous/interpreter/Executor.java
@@ -37,9 +37,8 @@ public class Executor implements StatementNodeMapper<Optional<InterpreterValue>>
}
private static Stream<VariableNode> findDeclarations(List<StatementNode> body) {
- // TODO: add filter argument to descendantNodesAndSelf to allow recursion to be stopped early
return body.stream()
- .flatMap(NodeStructure::descendantNodesAndSelf)
+ .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) {