diff options
| author | Michael Williamson <mike@zwobble.org> | 2015-10-05 22:26:29 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2015-10-05 22:26:29 +0100 |
| commit | 166a205aeb4c595b40b8ffe4c7d745b13031e3b3 (patch) | |
| tree | aa493482f4ca312c1f23913ebc2f57b71d8aa590 /src/main/java/org/zwobble/couscous/ast/visitors | |
| parent | 44e4b877baea47c0465e1029bdbedc848381999f (diff) | |
Add support for static method calls to Python backend
Diffstat (limited to 'src/main/java/org/zwobble/couscous/ast/visitors')
| -rw-r--r-- | src/main/java/org/zwobble/couscous/ast/visitors/ExpressionNodeMapper.java (renamed from src/main/java/org/zwobble/couscous/ast/visitors/ExpressionNodeVisitor.java) | 2 | ||||
| -rw-r--r-- | src/main/java/org/zwobble/couscous/ast/visitors/NodeVisitor.java | 29 | ||||
| -rw-r--r-- | src/main/java/org/zwobble/couscous/ast/visitors/NodeVisitorWithEmptyDefaults.java | 59 | ||||
| -rw-r--r-- | src/main/java/org/zwobble/couscous/ast/visitors/NodeVisitors.java | 97 | ||||
| -rw-r--r-- | src/main/java/org/zwobble/couscous/ast/visitors/StatementNodeMapper.java (renamed from src/main/java/org/zwobble/couscous/ast/visitors/StatementNodeVisitor.java) | 2 |
5 files changed, 187 insertions, 2 deletions
diff --git a/src/main/java/org/zwobble/couscous/ast/visitors/ExpressionNodeVisitor.java b/src/main/java/org/zwobble/couscous/ast/visitors/ExpressionNodeMapper.java index c47b942..2be2894 100644 --- a/src/main/java/org/zwobble/couscous/ast/visitors/ExpressionNodeVisitor.java +++ b/src/main/java/org/zwobble/couscous/ast/visitors/ExpressionNodeMapper.java @@ -7,7 +7,7 @@ import org.zwobble.couscous.ast.StaticMethodCallNode; import org.zwobble.couscous.ast.TernaryConditionalNode; import org.zwobble.couscous.ast.VariableReferenceNode; -public interface ExpressionNodeVisitor<T> { +public interface ExpressionNodeMapper<T> { T visit(LiteralNode literal); T visit(VariableReferenceNode variableReference); T visit(AssignmentNode assignment); diff --git a/src/main/java/org/zwobble/couscous/ast/visitors/NodeVisitor.java b/src/main/java/org/zwobble/couscous/ast/visitors/NodeVisitor.java new file mode 100644 index 0000000..014b48e --- /dev/null +++ b/src/main/java/org/zwobble/couscous/ast/visitors/NodeVisitor.java @@ -0,0 +1,29 @@ +package org.zwobble.couscous.ast.visitors; + +import org.zwobble.couscous.ast.AssignmentNode; +import org.zwobble.couscous.ast.ClassNode; +import org.zwobble.couscous.ast.ExpressionStatementNode; +import org.zwobble.couscous.ast.LiteralNode; +import org.zwobble.couscous.ast.LocalVariableDeclarationNode; +import org.zwobble.couscous.ast.MethodCallNode; +import org.zwobble.couscous.ast.MethodNode; +import org.zwobble.couscous.ast.ReturnNode; +import org.zwobble.couscous.ast.StaticMethodCallNode; +import org.zwobble.couscous.ast.TernaryConditionalNode; +import org.zwobble.couscous.ast.VariableReferenceNode; + +public interface NodeVisitor { + void visit(LiteralNode literal); + void visit(VariableReferenceNode variableReference); + void visit(AssignmentNode assignment); + void visit(TernaryConditionalNode ternaryConditional); + void visit(MethodCallNode methodCall); + void visit(StaticMethodCallNode staticMethodCall); + + void visit(ReturnNode returnNode); + void visit(ExpressionStatementNode expressionStatement); + void visit(LocalVariableDeclarationNode localVariableDeclaration); + + void visit(ClassNode classNode); + void visit(MethodNode methodNode); +} diff --git a/src/main/java/org/zwobble/couscous/ast/visitors/NodeVisitorWithEmptyDefaults.java b/src/main/java/org/zwobble/couscous/ast/visitors/NodeVisitorWithEmptyDefaults.java new file mode 100644 index 0000000..3a58614 --- /dev/null +++ b/src/main/java/org/zwobble/couscous/ast/visitors/NodeVisitorWithEmptyDefaults.java @@ -0,0 +1,59 @@ +package org.zwobble.couscous.ast.visitors; + +import org.zwobble.couscous.ast.AssignmentNode; +import org.zwobble.couscous.ast.ClassNode; +import org.zwobble.couscous.ast.ExpressionStatementNode; +import org.zwobble.couscous.ast.LiteralNode; +import org.zwobble.couscous.ast.LocalVariableDeclarationNode; +import org.zwobble.couscous.ast.MethodCallNode; +import org.zwobble.couscous.ast.MethodNode; +import org.zwobble.couscous.ast.ReturnNode; +import org.zwobble.couscous.ast.StaticMethodCallNode; +import org.zwobble.couscous.ast.TernaryConditionalNode; +import org.zwobble.couscous.ast.VariableReferenceNode; + +public interface NodeVisitorWithEmptyDefaults extends NodeVisitor { + @Override + default void visit(LiteralNode literal) { + } + + @Override + default void visit(VariableReferenceNode variableReference) { + } + + @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(ReturnNode returnNode) { + } + + @Override + default void visit(ExpressionStatementNode expressionStatement) { + } + + @Override + default void visit(LocalVariableDeclarationNode localVariableDeclaration) { + } + + @Override + default void visit(ClassNode classNode) { + } + + @Override + default void visit(MethodNode methodNode) { + } +} diff --git a/src/main/java/org/zwobble/couscous/ast/visitors/NodeVisitors.java b/src/main/java/org/zwobble/couscous/ast/visitors/NodeVisitors.java new file mode 100644 index 0000000..88c6e10 --- /dev/null +++ b/src/main/java/org/zwobble/couscous/ast/visitors/NodeVisitors.java @@ -0,0 +1,97 @@ +package org.zwobble.couscous.ast.visitors; + +import org.zwobble.couscous.ast.AssignmentNode; +import org.zwobble.couscous.ast.ClassNode; +import org.zwobble.couscous.ast.ExpressionStatementNode; +import org.zwobble.couscous.ast.LiteralNode; +import org.zwobble.couscous.ast.LocalVariableDeclarationNode; +import org.zwobble.couscous.ast.MethodCallNode; +import org.zwobble.couscous.ast.MethodNode; +import org.zwobble.couscous.ast.Node; +import org.zwobble.couscous.ast.ReturnNode; +import org.zwobble.couscous.ast.StaticMethodCallNode; +import org.zwobble.couscous.ast.TernaryConditionalNode; +import org.zwobble.couscous.ast.VariableReferenceNode; + +import lombok.val; + +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(AssignmentNode assignment) { + visitor.visit(assignment); + assignment.getValue().accept(this); + visit(assignment.getTarget()); + } + + @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); + for (val argument : methodCall.getArguments()) { + argument.accept(this); + } + } + + @Override + public void visit(StaticMethodCallNode staticMethodCall) { + visitor.visit(staticMethodCall); + for (val argument : staticMethodCall.getArguments()) { + argument.accept(this); + } + } + + @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(ClassNode classNode) { + visitor.visit(classNode); + for (val method : classNode.getMethods()) { + method.accept(this); + } + } + + @Override + public void visit(MethodNode methodNode) { + for (val statement : methodNode.getBody()) { + statement.accept(this); + } + } + }); + } +} diff --git a/src/main/java/org/zwobble/couscous/ast/visitors/StatementNodeVisitor.java b/src/main/java/org/zwobble/couscous/ast/visitors/StatementNodeMapper.java index 620f6f8..4bae481 100644 --- a/src/main/java/org/zwobble/couscous/ast/visitors/StatementNodeVisitor.java +++ b/src/main/java/org/zwobble/couscous/ast/visitors/StatementNodeMapper.java @@ -4,7 +4,7 @@ import org.zwobble.couscous.ast.ExpressionStatementNode; import org.zwobble.couscous.ast.LocalVariableDeclarationNode; import org.zwobble.couscous.ast.ReturnNode; -public interface StatementNodeVisitor<T> { +public interface StatementNodeMapper<T> { T visit(ReturnNode returnNode); T visit(ExpressionStatementNode expressionStatement); T visit(LocalVariableDeclarationNode localVariableDeclaration); |
