From bacc781ea755d3771e1c8d09e1fbfd873872f750 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sun, 15 Nov 2015 15:31:09 +0000 Subject: Allow descendants of nodes to be traversed --- .../org/zwobble/couscous/interpreter/Executor.java | 48 ++++++++-------------- 1 file changed, 16 insertions(+), 32 deletions(-) (limited to 'src/main/java/org/zwobble/couscous/interpreter/Executor.java') diff --git a/src/main/java/org/zwobble/couscous/interpreter/Executor.java b/src/main/java/org/zwobble/couscous/interpreter/Executor.java index 8909acc..c9528be 100644 --- a/src/main/java/org/zwobble/couscous/interpreter/Executor.java +++ b/src/main/java/org/zwobble/couscous/interpreter/Executor.java @@ -1,15 +1,18 @@ package org.zwobble.couscous.interpreter; -import java.util.List; -import java.util.Optional; -import java.util.stream.Stream; - import org.zwobble.couscous.ast.*; +import org.zwobble.couscous.ast.structure.NodeStructure; +import org.zwobble.couscous.ast.visitors.NodeMapperWithDefault; import org.zwobble.couscous.ast.visitors.StatementNodeMapper; import org.zwobble.couscous.interpreter.values.BooleanInterpreterValue; 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.stream.Stream; + +import static org.zwobble.couscous.ast.structure.NodeStructure.descendantNodesAndSelf; import static org.zwobble.couscous.interpreter.Evaluator.eval; public class Executor implements StatementNodeMapper> { @@ -34,34 +37,15 @@ public class Executor implements StatementNodeMapper> } private static Stream findDeclarations(List body) { - return body.stream().flatMap(statement -> statement.accept(new StatementNodeMapper>(){ - @Override - public Stream visit(ReturnNode returnNode) { - return Stream.empty(); - } - - @Override - public Stream visit(ExpressionStatementNode expressionStatement) { - return Stream.empty(); - } - - @Override - public Stream visit(LocalVariableDeclarationNode localVariableDeclaration) { - return Stream.of(localVariableDeclaration); - } - - @Override - public Stream visit(IfStatementNode ifStatement) { - // TODO: Handle declarations in branches - return Stream.empty(); - } - - @Override - public Stream visit(WhileNode whileLoop) { - // TODO: Handle declarations in branches - return Stream.empty(); - } - })); + // TODO: add filter argument to descendantNodesAndSelf to allow recursion to be stopped early + return body.stream() + .flatMap(NodeStructure::descendantNodesAndSelf) + .flatMap(node -> node.accept(new NodeMapperWithDefault>(Stream.empty()) { + @Override + public Stream visit(LocalVariableDeclarationNode localVariableDeclaration) { + return Stream.of(localVariableDeclaration); + } + })); } public static Optional exec(Environment environment, StatementNode statement) { -- cgit v1.2.3