diff options
| author | Michael Williamson <mike@zwobble.org> | 2015-11-15 15:31:09 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2015-11-15 15:31:09 +0000 |
| commit | bacc781ea755d3771e1c8d09e1fbfd873872f750 (patch) | |
| tree | c4b4fbfa93fbaa79afaae77bb9978f6ad0ba15bf /src/main/java/org/zwobble/couscous/ast/visitors | |
| parent | 549099039ef76a04ed524448c070a0c5328c52b2 (diff) | |
Allow descendants of nodes to be traversed
Diffstat (limited to 'src/main/java/org/zwobble/couscous/ast/visitors')
5 files changed, 144 insertions, 194 deletions
diff --git a/src/main/java/org/zwobble/couscous/ast/visitors/NodeMapper.java b/src/main/java/org/zwobble/couscous/ast/visitors/NodeMapper.java new file mode 100644 index 0000000..d38d7fa --- /dev/null +++ b/src/main/java/org/zwobble/couscous/ast/visitors/NodeMapper.java @@ -0,0 +1,28 @@ +package org.zwobble.couscous.ast.visitors; + +import org.zwobble.couscous.ast.*; + +public interface NodeMapper<T> { + T visit(LiteralNode literal); + T visit(VariableReferenceNode variableReference); + T visit(ThisReferenceNode reference); + T visit(AssignmentNode assignment); + T visit(TernaryConditionalNode ternaryConditional); + T visit(MethodCallNode methodCall); + T visit(StaticMethodCallNode staticMethodCall); + T visit(ConstructorCallNode call); + T visit(FieldAccessNode fieldAccess); + + T visit(ReturnNode returnNode); + T visit(ExpressionStatementNode expressionStatement); + T visit(LocalVariableDeclarationNode localVariableDeclaration); + T visit(IfStatementNode ifStatement); + T visit(WhileNode whileLoop); + + T visit(FormalArgumentNode formalArgumentNode); + T visit(AnnotationNode annotation); + T visit(MethodNode methodNode); + T visit(ConstructorNode constructorNode); + T visit(FieldDeclarationNode declaration); + T visit(ClassNode classNode); +} diff --git a/src/main/java/org/zwobble/couscous/ast/visitors/NodeMapperWithDefault.java b/src/main/java/org/zwobble/couscous/ast/visitors/NodeMapperWithDefault.java new file mode 100644 index 0000000..e4203e0 --- /dev/null +++ b/src/main/java/org/zwobble/couscous/ast/visitors/NodeMapperWithDefault.java @@ -0,0 +1,111 @@ +package org.zwobble.couscous.ast.visitors; + +import org.zwobble.couscous.ast.*; + +public class NodeMapperWithDefault<T> implements NodeMapper<T> { + private final T defaultValue; + + public NodeMapperWithDefault(T defaultValue) { + this.defaultValue = defaultValue; + } + + @Override + public T visit(LiteralNode literal) { + return defaultValue; + } + + @Override + public T visit(VariableReferenceNode variableReference) { + return defaultValue; + } + + @Override + public T visit(ThisReferenceNode reference) { + return defaultValue; + } + + @Override + public T visit(AssignmentNode assignment) { + return defaultValue; + } + + @Override + public T visit(TernaryConditionalNode ternaryConditional) { + return defaultValue; + } + + @Override + public T visit(MethodCallNode methodCall) { + return defaultValue; + } + + @Override + public T visit(StaticMethodCallNode staticMethodCall) { + return defaultValue; + } + + @Override + public T visit(ConstructorCallNode call) { + return defaultValue; + } + + @Override + public T visit(FieldAccessNode fieldAccess) { + return defaultValue; + } + + @Override + public T visit(ReturnNode returnNode) { + return defaultValue; + } + + @Override + public T visit(ExpressionStatementNode expressionStatement) { + return defaultValue; + } + + @Override + public T visit(LocalVariableDeclarationNode localVariableDeclaration) { + return defaultValue; + } + + @Override + public T visit(IfStatementNode ifStatement) { + return defaultValue; + } + + @Override + public T visit(WhileNode whileLoop) { + return defaultValue; + } + + @Override + public T visit(AnnotationNode annotation) { + return defaultValue; + } + + @Override + public T visit(FieldDeclarationNode declaration) { + return defaultValue; + } + + @Override + public T visit(FormalArgumentNode formalArgumentNode) { + return defaultValue; + } + + @Override + public T visit(ClassNode classNode) { + return defaultValue; + } + + @Override + public T visit(MethodNode methodNode) { + return defaultValue; + } + + @Override + public T visit(ConstructorNode constructorNode) { + return defaultValue; + } +} diff --git a/src/main/java/org/zwobble/couscous/ast/visitors/NodeVisitor.java b/src/main/java/org/zwobble/couscous/ast/visitors/NodeVisitor.java index 8d42f5c..75e6da5 100644 --- a/src/main/java/org/zwobble/couscous/ast/visitors/NodeVisitor.java +++ b/src/main/java/org/zwobble/couscous/ast/visitors/NodeVisitor.java @@ -18,8 +18,11 @@ public interface NodeVisitor { void visit(LocalVariableDeclarationNode localVariableDeclaration); void visit(IfStatementNode ifStatement); void visit(WhileNode whileLoop); - - void visit(ClassNode classNode); + + void visit(FormalArgumentNode formalArgumentNode); + void visit(AnnotationNode annotation); void visit(MethodNode methodNode); void visit(ConstructorNode constructorNode); + void visit(FieldDeclarationNode declaration); + void visit(ClassNode classNode); } diff --git a/src/main/java/org/zwobble/couscous/ast/visitors/NodeVisitorWithEmptyDefaults.java b/src/main/java/org/zwobble/couscous/ast/visitors/NodeVisitorWithEmptyDefaults.java deleted file mode 100644 index c8dd2cf..0000000 --- a/src/main/java/org/zwobble/couscous/ast/visitors/NodeVisitorWithEmptyDefaults.java +++ /dev/null @@ -1,73 +0,0 @@ -package org.zwobble.couscous.ast.visitors; - -import org.zwobble.couscous.ast.*; - -public interface NodeVisitorWithEmptyDefaults extends NodeVisitor { - @Override - default void visit(LiteralNode literal) { - } - - @Override - default void visit(VariableReferenceNode variableReference) { - } - - @Override - default void visit(ThisReferenceNode reference) { - } - - @Override - default void visit(AssignmentNode assignment) { - } - - @Override - default void visit(TernaryConditionalNode ternaryConditional) { - } - - @Override - default void visit(MethodCallNode methodCall) { - } - - @Override - default void visit(StaticMethodCallNode staticMethodCall) { - } - - @Override - default void visit(ConstructorCallNode call) { - } - - @Override - default void visit(FieldAccessNode fieldAccess) { - } - - @Override - default void visit(ReturnNode returnNode) { - } - - @Override - default void visit(ExpressionStatementNode expressionStatement) { - } - - @Override - default void visit(LocalVariableDeclarationNode localVariableDeclaration) { - } - - @Override - default void visit(IfStatementNode ifStatement) { - } - - @Override - default void visit(WhileNode whileLoop) { - } - - @Override - default void visit(ClassNode classNode) { - } - - @Override - default void visit(MethodNode methodNode) { - } - - @Override - default void visit(ConstructorNode constructorNode) { - } -} diff --git a/src/main/java/org/zwobble/couscous/ast/visitors/NodeVisitors.java b/src/main/java/org/zwobble/couscous/ast/visitors/NodeVisitors.java deleted file mode 100644 index 78a8254..0000000 --- a/src/main/java/org/zwobble/couscous/ast/visitors/NodeVisitors.java +++ /dev/null @@ -1,119 +0,0 @@ -package org.zwobble.couscous.ast.visitors; - -import java.util.List; - -import org.zwobble.couscous.ast.*; - -public class NodeVisitors { - public static void visitAll(Node node, NodeVisitor visitor) { - node.accept(new NodeVisitor(){ - @Override - public void visit(LiteralNode literal) { - visitor.visit(literal); - } - - @Override - public void visit(VariableReferenceNode variableReference) { - visitor.visit(variableReference); - } - - @Override - public void visit(ThisReferenceNode reference) { - visitor.visit(reference); - } - - @Override - public void visit(AssignmentNode assignment) { - visitor.visit(assignment); - assignment.getValue().accept(this); - assignment.getTarget().accept(this); - } - - @Override - public void visit(TernaryConditionalNode ternaryConditional) { - visitor.visit(ternaryConditional); - ternaryConditional.getCondition().accept(this); - ternaryConditional.getIfTrue().accept(this); - ternaryConditional.getIfFalse().accept(this); - } - - @Override - public void visit(MethodCallNode methodCall) { - visitor.visit(methodCall); - methodCall.getReceiver().accept(this); - visitAll(methodCall.getArguments()); - } - - @Override - public void visit(StaticMethodCallNode staticMethodCall) { - visitor.visit(staticMethodCall); - visitAll(staticMethodCall.getArguments()); - } - - @Override - public void visit(ConstructorCallNode call) { - visitor.visit(call); - visitAll(call.getArguments()); - } - - @Override - public void visit(FieldAccessNode fieldAccess) { - visitor.visit(fieldAccess); - } - - @Override - public void visit(ReturnNode returnNode) { - visitor.visit(returnNode); - returnNode.getValue().accept(this); - } - - @Override - public void visit(ExpressionStatementNode expressionStatement) { - visitor.visit(expressionStatement); - expressionStatement.getExpression().accept(this); - } - - @Override - public void visit(LocalVariableDeclarationNode localVariableDeclaration) { - visitor.visit(localVariableDeclaration); - localVariableDeclaration.getInitialValue().accept(this); - } - - @Override - public void visit(IfStatementNode ifStatement) { - ifStatement.getCondition().accept(visitor); - visitAll(ifStatement.getTrueBranch()); - visitAll(ifStatement.getFalseBranch()); - } - - @Override - public void visit(WhileNode whileLoop) { - whileLoop.getCondition().accept(visitor); - visitAll(whileLoop.getBody()); - } - - @Override - public void visit(ClassNode classNode) { - visitor.visit(classNode); - classNode.getConstructor().accept(this); - visitAll(classNode.getMethods()); - } - - @Override - public void visit(MethodNode methodNode) { - visitAll(methodNode.getBody()); - } - - @Override - public void visit(ConstructorNode constructorNode) { - visitAll(constructorNode.getBody()); - } - - private <T extends Node> void visitAll(List<T> nodes) { - for (Node node : nodes) { - node.accept(this); - } - } - }); - } -}
\ No newline at end of file |
