aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org/zwobble/couscous/ast/visitors
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2015-11-15 15:31:09 +0000
committerMichael Williamson <mike@zwobble.org>2015-11-15 15:31:09 +0000
commitbacc781ea755d3771e1c8d09e1fbfd873872f750 (patch)
treec4b4fbfa93fbaa79afaae77bb9978f6ad0ba15bf /src/main/java/org/zwobble/couscous/ast/visitors
parent549099039ef76a04ed524448c070a0c5328c52b2 (diff)
Allow descendants of nodes to be traversed
Diffstat (limited to 'src/main/java/org/zwobble/couscous/ast/visitors')
-rw-r--r--src/main/java/org/zwobble/couscous/ast/visitors/NodeMapper.java28
-rw-r--r--src/main/java/org/zwobble/couscous/ast/visitors/NodeMapperWithDefault.java111
-rw-r--r--src/main/java/org/zwobble/couscous/ast/visitors/NodeVisitor.java7
-rw-r--r--src/main/java/org/zwobble/couscous/ast/visitors/NodeVisitorWithEmptyDefaults.java73
-rw-r--r--src/main/java/org/zwobble/couscous/ast/visitors/NodeVisitors.java119
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