From 9604bf821f926e9fc653705ec78093ccb19d1195 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sat, 21 Nov 2015 11:48:14 +0000 Subject: Only explore statements when finding declarations --- .../org/zwobble/couscous/ast/structure/NodeStructure.java | 11 +++++++++++ src/main/java/org/zwobble/couscous/interpreter/Executor.java | 3 +-- 2 files changed, 12 insertions(+), 2 deletions(-) (limited to 'src/main/java') 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 descendantNodesAndSelf(Node node, Predicate predicate) { + return Stream.concat(Stream.of(node), descendantNodes(node, predicate)); + } + + public static Stream descendantNodes(Node node, Predicate predicate) { + return childNodes(node) + .filter(predicate) + .flatMap(child -> descendantNodesAndSelf(child, predicate)); + } + public static Stream 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> } private static Stream findDeclarations(List 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.empty()) { @Override public Stream visit(LocalVariableDeclarationNode localVariableDeclaration) { -- cgit v1.2.3