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 + .../org/zwobble/couscous/backends/csharp/CsharpSerializer.java | 5 +++++ .../org/zwobble/couscous/backends/python/PythonCodeGenerator.java | 5 +++++ src/main/java/org/zwobble/couscous/interpreter/Evaluator.java | 7 ++++++- 12 files changed, 53 insertions(+), 4 deletions(-) (limited to 'src') 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); diff --git a/src/main/java/org/zwobble/couscous/backends/csharp/CsharpSerializer.java b/src/main/java/org/zwobble/couscous/backends/csharp/CsharpSerializer.java index ffd2f02..06dafbb 100644 --- a/src/main/java/org/zwobble/couscous/backends/csharp/CsharpSerializer.java +++ b/src/main/java/org/zwobble/couscous/backends/csharp/CsharpSerializer.java @@ -119,6 +119,11 @@ public class CsharpSerializer implements NodeVisitor { writeArguments(call.getArguments()); } + @Override + public void visit(OperationNode operation) { + write(operation.desugar()); + } + private void writeArguments(List arguments) { writer.writeSymbol("("); writer.writeWithSeparator(arguments, this::write, () -> writer.writeSymbol(", ")); diff --git a/src/main/java/org/zwobble/couscous/backends/python/PythonCodeGenerator.java b/src/main/java/org/zwobble/couscous/backends/python/PythonCodeGenerator.java index f518faa..964c5f9 100644 --- a/src/main/java/org/zwobble/couscous/backends/python/PythonCodeGenerator.java +++ b/src/main/java/org/zwobble/couscous/backends/python/PythonCodeGenerator.java @@ -283,6 +283,11 @@ public class PythonCodeGenerator { return pythonCall(classReference, arguments); } + @Override + public PythonExpressionNode visit(OperationNode operation) { + return generateExpression(operation.desugar()); + } + @Override public PythonExpressionNode visit(FieldAccessNode fieldAccess) { return pythonAttributeAccess(generateExpression(fieldAccess.getLeft()), fieldAccess.getFieldName()); diff --git a/src/main/java/org/zwobble/couscous/interpreter/Evaluator.java b/src/main/java/org/zwobble/couscous/interpreter/Evaluator.java index e715caa..dbb02c8 100644 --- a/src/main/java/org/zwobble/couscous/interpreter/Evaluator.java +++ b/src/main/java/org/zwobble/couscous/interpreter/Evaluator.java @@ -113,7 +113,12 @@ public class Evaluator implements ExpressionNodeMapper { List arguments = evalArguments(call.getArguments()); return clazz.callConstructor(environment, arguments); } - + + @Override + public InterpreterValue visit(OperationNode operation) { + return eval(operation.desugar()); + } + @Override public InterpreterValue visit(FieldAccessNode fieldAccess) { InterpreterValue left = eval(fieldAccess.getLeft()); -- cgit v1.2.3