From f2ed6b591da6149319c149d1c78694bfa9641a73 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sun, 24 Jan 2016 16:01:06 +0000 Subject: Implement visitors on OperationNode instead of desugarring --- src/main/java/org/zwobble/couscous/ast/ExpressionNode.java | 5 +++++ src/main/java/org/zwobble/couscous/ast/Node.java | 6 ++++++ src/main/java/org/zwobble/couscous/ast/OperationNode.java | 7 +++++-- .../java/org/zwobble/couscous/ast/structure/NodeStructure.java | 6 ++++++ .../org/zwobble/couscous/ast/visitors/ExpressionNodeMapper.java | 2 ++ src/main/java/org/zwobble/couscous/ast/visitors/NodeMapper.java | 1 + .../org/zwobble/couscous/ast/visitors/NodeMapperWithDefault.java | 7 ++++++- .../java/org/zwobble/couscous/ast/visitors/NodeTransformer.java | 5 +++++ src/main/java/org/zwobble/couscous/ast/visitors/NodeVisitor.java | 1 + 9 files changed, 37 insertions(+), 3 deletions(-) (limited to 'src/main/java/org/zwobble/couscous/ast') diff --git a/src/main/java/org/zwobble/couscous/ast/ExpressionNode.java b/src/main/java/org/zwobble/couscous/ast/ExpressionNode.java index 6f419dc..e46ca0a 100644 --- a/src/main/java/org/zwobble/couscous/ast/ExpressionNode.java +++ b/src/main/java/org/zwobble/couscous/ast/ExpressionNode.java @@ -48,6 +48,11 @@ public interface ExpressionNode extends Node { return visitor.visit(call); } + @Override + public T visit(OperationNode operation) { + return visitor.visit(operation); + } + @Override public T visit(FieldAccessNode fieldAccess) { return visitor.visit(fieldAccess); diff --git a/src/main/java/org/zwobble/couscous/ast/Node.java b/src/main/java/org/zwobble/couscous/ast/Node.java index a1a6f91..44fabc1 100644 --- a/src/main/java/org/zwobble/couscous/ast/Node.java +++ b/src/main/java/org/zwobble/couscous/ast/Node.java @@ -48,6 +48,12 @@ public interface Node { return null; } + @Override + public Void visit(OperationNode operation) { + visitor.visit(operation); + return null; + } + @Override public Void visit(FieldAccessNode fieldAccess) { visitor.visit(fieldAccess); diff --git a/src/main/java/org/zwobble/couscous/ast/OperationNode.java b/src/main/java/org/zwobble/couscous/ast/OperationNode.java index db341a0..0840044 100644 --- a/src/main/java/org/zwobble/couscous/ast/OperationNode.java +++ b/src/main/java/org/zwobble/couscous/ast/OperationNode.java @@ -28,6 +28,10 @@ public class OperationNode implements ExpressionNode { type); } + public List getArguments() { + return arguments; + } + @Override public TypeName getType() { return type; @@ -35,8 +39,7 @@ public class OperationNode implements ExpressionNode { @Override public T accept(ExpressionNodeMapper visitor) { - // TODO: Don't desugar - return desugar().accept(visitor); + return visitor.visit(this); } @Override 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 2fd444d..a4cedca 100644 --- a/src/main/java/org/zwobble/couscous/ast/structure/NodeStructure.java +++ b/src/main/java/org/zwobble/couscous/ast/structure/NodeStructure.java @@ -28,6 +28,7 @@ public class NodeStructure { } public static Stream childNodes(Node node) { + // TODO: is this just duplicating the logic already in node.transform? return node.accept(new NodeMapper>() { @Override public Stream visit(LiteralNode literal) { @@ -69,6 +70,11 @@ public class NodeStructure { return call.getArguments().stream(); } + @Override + public Stream visit(OperationNode operation) { + return operation.getArguments().stream(); + } + @Override public Stream visit(FieldAccessNode fieldAccess) { return Stream.of(fieldAccess.getLeft()); diff --git a/src/main/java/org/zwobble/couscous/ast/visitors/ExpressionNodeMapper.java b/src/main/java/org/zwobble/couscous/ast/visitors/ExpressionNodeMapper.java index c296a30..2836a22 100644 --- a/src/main/java/org/zwobble/couscous/ast/visitors/ExpressionNodeMapper.java +++ b/src/main/java/org/zwobble/couscous/ast/visitors/ExpressionNodeMapper.java @@ -10,7 +10,9 @@ public interface ExpressionNodeMapper { T visit(TernaryConditionalNode ternaryConditional); T visit(MethodCallNode methodCall); T visit(ConstructorCallNode call); + T visit(OperationNode operation); T visit(FieldAccessNode fieldAccess); T visit(TypeCoercionNode typeCoercion); T visit(CastNode cast); + } diff --git a/src/main/java/org/zwobble/couscous/ast/visitors/NodeMapper.java b/src/main/java/org/zwobble/couscous/ast/visitors/NodeMapper.java index fb8da13..e0e16a8 100644 --- a/src/main/java/org/zwobble/couscous/ast/visitors/NodeMapper.java +++ b/src/main/java/org/zwobble/couscous/ast/visitors/NodeMapper.java @@ -10,6 +10,7 @@ public interface NodeMapper { T visit(TernaryConditionalNode ternaryConditional); T visit(MethodCallNode methodCall); T visit(ConstructorCallNode call); + T visit(OperationNode operation); T visit(FieldAccessNode fieldAccess); T visit(TypeCoercionNode typeCoercion); T visit(CastNode cast); diff --git a/src/main/java/org/zwobble/couscous/ast/visitors/NodeMapperWithDefault.java b/src/main/java/org/zwobble/couscous/ast/visitors/NodeMapperWithDefault.java index 178442d..fb0b93a 100644 --- a/src/main/java/org/zwobble/couscous/ast/visitors/NodeMapperWithDefault.java +++ b/src/main/java/org/zwobble/couscous/ast/visitors/NodeMapperWithDefault.java @@ -43,7 +43,12 @@ public class NodeMapperWithDefault implements NodeMapper { public T visit(ConstructorCallNode call) { return defaultValue; } - + + @Override + public T visit(OperationNode operation) { + return defaultValue; + } + @Override public T visit(FieldAccessNode fieldAccess) { return defaultValue; diff --git a/src/main/java/org/zwobble/couscous/ast/visitors/NodeTransformer.java b/src/main/java/org/zwobble/couscous/ast/visitors/NodeTransformer.java index 158b3ce..79a409c 100644 --- a/src/main/java/org/zwobble/couscous/ast/visitors/NodeTransformer.java +++ b/src/main/java/org/zwobble/couscous/ast/visitors/NodeTransformer.java @@ -56,6 +56,11 @@ public class NodeTransformer implements ExpressionNodeMapper, St return defaultTransformExpression(call); } + @Override + public ExpressionNode visit(OperationNode operationNode) { + return defaultTransformExpression(operationNode); + } + @Override public ExpressionNode visit(FieldAccessNode fieldAccess) { return defaultTransformExpression(fieldAccess); 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 bf6240b..4a80008 100644 --- a/src/main/java/org/zwobble/couscous/ast/visitors/NodeVisitor.java +++ b/src/main/java/org/zwobble/couscous/ast/visitors/NodeVisitor.java @@ -10,6 +10,7 @@ public interface NodeVisitor { void visit(TernaryConditionalNode ternaryConditional); void visit(MethodCallNode methodCall); void visit(ConstructorCallNode call); + void visit(OperationNode operation); void visit(FieldAccessNode fieldAccess); void visit(TypeCoercionNode typeCoercion); void visit(CastNode cast); -- cgit v1.2.3