diff options
Diffstat (limited to 'src/main')
12 files changed, 53 insertions, 4 deletions
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 @@ -49,6 +49,11 @@ public interface ExpressionNode extends Node { } @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 @@ -49,6 +49,12 @@ public interface Node { } @Override + public Void visit(OperationNode operation) { + visitor.visit(operation); + return null; + } + + @Override public Void visit(FieldAccessNode fieldAccess) { visitor.visit(fieldAccess); return null; 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<ExpressionNode> getArguments() { + return arguments; + } + @Override public TypeName getType() { return type; @@ -35,8 +39,7 @@ public class OperationNode implements ExpressionNode { @Override public <T> T accept(ExpressionNodeMapper<T> 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<? extends Node> childNodes(Node node) { + // TODO: is this just duplicating the logic already in node.transform? return node.accept(new NodeMapper<Stream<? extends Node>>() { @Override public Stream<Node> visit(LiteralNode literal) { @@ -70,6 +71,11 @@ public class NodeStructure { } @Override + public Stream<? extends Node> visit(OperationNode operation) { + return operation.getArguments().stream(); + } + + @Override public Stream<Node> 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> { 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> { 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<T> implements NodeMapper<T> { 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 @@ -57,6 +57,11 @@ public class NodeTransformer implements ExpressionNodeMapper<ExpressionNode>, St } @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<? extends ExpressionNode> 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 @@ -284,6 +284,11 @@ public class PythonCodeGenerator { } @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<InterpreterValue> { List<InterpreterValue> 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()); |
