aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2016-01-24 16:01:06 +0000
committerMichael Williamson <mike@zwobble.org>2016-01-24 16:01:06 +0000
commitf2ed6b591da6149319c149d1c78694bfa9641a73 (patch)
tree65cbe4fe98c28d4e0e4c130936d0dff8098bc489
parente448dbcfaab619dc85d0d6d7f4b3dfe827646e38 (diff)
Implement visitors on OperationNode instead of desugarring
-rw-r--r--src/main/java/org/zwobble/couscous/ast/ExpressionNode.java5
-rw-r--r--src/main/java/org/zwobble/couscous/ast/Node.java6
-rw-r--r--src/main/java/org/zwobble/couscous/ast/OperationNode.java7
-rw-r--r--src/main/java/org/zwobble/couscous/ast/structure/NodeStructure.java6
-rw-r--r--src/main/java/org/zwobble/couscous/ast/visitors/ExpressionNodeMapper.java2
-rw-r--r--src/main/java/org/zwobble/couscous/ast/visitors/NodeMapper.java1
-rw-r--r--src/main/java/org/zwobble/couscous/ast/visitors/NodeMapperWithDefault.java7
-rw-r--r--src/main/java/org/zwobble/couscous/ast/visitors/NodeTransformer.java5
-rw-r--r--src/main/java/org/zwobble/couscous/ast/visitors/NodeVisitor.java1
-rw-r--r--src/main/java/org/zwobble/couscous/backends/csharp/CsharpSerializer.java5
-rw-r--r--src/main/java/org/zwobble/couscous/backends/python/PythonCodeGenerator.java5
-rw-r--r--src/main/java/org/zwobble/couscous/interpreter/Evaluator.java7
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());