aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org/zwobble/couscous/ast
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2016-03-29 19:56:41 +0100
committerMichael Williamson <mike@zwobble.org>2016-03-29 19:56:41 +0100
commitbbfc91caf379a07198bfa352023524c0b54e1bb0 (patch)
treea1b081d63bb693f9cad63f980e430540a20d0586 /src/main/java/org/zwobble/couscous/ast
parentdf10352d2eea46b3e82cbd7783ed16e3f02fced6 (diff)
Add support for reading vararg method invocations
Diffstat (limited to 'src/main/java/org/zwobble/couscous/ast')
-rw-r--r--src/main/java/org/zwobble/couscous/ast/ArrayNode.java70
-rw-r--r--src/main/java/org/zwobble/couscous/ast/ExpressionNode.java5
-rw-r--r--src/main/java/org/zwobble/couscous/ast/LiteralNode.java4
-rw-r--r--src/main/java/org/zwobble/couscous/ast/Node.java6
-rw-r--r--src/main/java/org/zwobble/couscous/ast/structure/NodeStructure.java5
-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
10 files changed, 102 insertions, 4 deletions
diff --git a/src/main/java/org/zwobble/couscous/ast/ArrayNode.java b/src/main/java/org/zwobble/couscous/ast/ArrayNode.java
new file mode 100644
index 0000000..ac4c284
--- /dev/null
+++ b/src/main/java/org/zwobble/couscous/ast/ArrayNode.java
@@ -0,0 +1,70 @@
+package org.zwobble.couscous.ast;
+
+import org.zwobble.couscous.ast.visitors.ExpressionNodeMapper;
+import org.zwobble.couscous.ast.visitors.NodeTransformer;
+import org.zwobble.couscous.types.Type;
+import org.zwobble.couscous.types.Types;
+
+import java.util.List;
+
+public class ArrayNode implements ExpressionNode {
+ public static ArrayNode array(Type elementType, List<ExpressionNode> expressions) {
+ return new ArrayNode(elementType, expressions);
+ }
+
+ private final Type elementType;
+ private final List<ExpressionNode> elements;
+
+ public ArrayNode(Type elementType, List<ExpressionNode> elements) {
+ this.elementType = elementType;
+ this.elements = elements;
+ }
+
+ public List<ExpressionNode> getElements() {
+ return elements;
+ }
+
+ @Override
+ public Type getType() {
+ return Types.array(elementType);
+ }
+
+ @Override
+ public <T> T accept(ExpressionNodeMapper<T> visitor) {
+ return visitor.visit(this);
+ }
+
+ @Override
+ public ExpressionNode transform(NodeTransformer transformer) {
+ return new ArrayNode(
+ transformer.transform(elementType),
+ transformer.transformExpressions(elements));
+ }
+
+ @Override
+ public String toString() {
+ return "ArrayNode(" +
+ "elementType=" + elementType +
+ ", elements=" + elements +
+ ')';
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+
+ ArrayNode arrayNode = (ArrayNode) o;
+
+ if (!elementType.equals(arrayNode.elementType)) return false;
+ return elements.equals(arrayNode.elements);
+
+ }
+
+ @Override
+ public int hashCode() {
+ int result = elementType.hashCode();
+ result = 31 * result + elements.hashCode();
+ return result;
+ }
+}
diff --git a/src/main/java/org/zwobble/couscous/ast/ExpressionNode.java b/src/main/java/org/zwobble/couscous/ast/ExpressionNode.java
index 817078f..37bd436 100644
--- a/src/main/java/org/zwobble/couscous/ast/ExpressionNode.java
+++ b/src/main/java/org/zwobble/couscous/ast/ExpressionNode.java
@@ -28,6 +28,11 @@ public interface ExpressionNode extends Node {
}
@Override
+ public T visit(ArrayNode array) {
+ return visitor.visit(array);
+ }
+
+ @Override
public T visit(AssignmentNode assignment) {
return visitor.visit(assignment);
}
diff --git a/src/main/java/org/zwobble/couscous/ast/LiteralNode.java b/src/main/java/org/zwobble/couscous/ast/LiteralNode.java
index 46a141e..d1be23f 100644
--- a/src/main/java/org/zwobble/couscous/ast/LiteralNode.java
+++ b/src/main/java/org/zwobble/couscous/ast/LiteralNode.java
@@ -32,11 +32,11 @@ public class LiteralNode implements ExpressionNode {
public static LiteralNode literal(ScalarType type) {
return literal(value(type));
}
-
+
public static LiteralNode of(PrimitiveValue value, Type type) {
return new LiteralNode(value, type);
}
-
+
private final PrimitiveValue value;
private final Type type;
diff --git a/src/main/java/org/zwobble/couscous/ast/Node.java b/src/main/java/org/zwobble/couscous/ast/Node.java
index a055488..4f21904 100644
--- a/src/main/java/org/zwobble/couscous/ast/Node.java
+++ b/src/main/java/org/zwobble/couscous/ast/Node.java
@@ -25,6 +25,12 @@ public interface Node {
}
@Override
+ public Void visit(ArrayNode array) {
+ visitor.visit(array);
+ return null;
+ }
+
+ @Override
public Void visit(AssignmentNode assignment) {
visitor.visit(assignment);
return null;
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 f1f37a6..ed5b474 100644
--- a/src/main/java/org/zwobble/couscous/ast/structure/NodeStructure.java
+++ b/src/main/java/org/zwobble/couscous/ast/structure/NodeStructure.java
@@ -47,6 +47,11 @@ public class NodeStructure {
}
@Override
+ public Stream<? extends Node> visit(ArrayNode array) {
+ return array.getElements().stream();
+ }
+
+ @Override
public Stream<Node> visit(AssignmentNode assignment) {
return Stream.of(assignment.getValue(), assignment.getTarget());
}
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 2836a22..2c8ed24 100644
--- a/src/main/java/org/zwobble/couscous/ast/visitors/ExpressionNodeMapper.java
+++ b/src/main/java/org/zwobble/couscous/ast/visitors/ExpressionNodeMapper.java
@@ -6,6 +6,7 @@ public interface ExpressionNodeMapper<T> {
T visit(LiteralNode literal);
T visit(VariableReferenceNode variableReference);
T visit(ThisReferenceNode reference);
+ T visit(ArrayNode array);
T visit(AssignmentNode assignment);
T visit(TernaryConditionalNode ternaryConditional);
T visit(MethodCallNode methodCall);
@@ -14,5 +15,4 @@ public interface ExpressionNodeMapper<T> {
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 338d8d2..3596896 100644
--- a/src/main/java/org/zwobble/couscous/ast/visitors/NodeMapper.java
+++ b/src/main/java/org/zwobble/couscous/ast/visitors/NodeMapper.java
@@ -6,6 +6,7 @@ public interface NodeMapper<T> {
T visit(LiteralNode literal);
T visit(VariableReferenceNode variableReference);
T visit(ThisReferenceNode reference);
+ T visit(ArrayNode array);
T visit(AssignmentNode assignment);
T visit(TernaryConditionalNode ternaryConditional);
T visit(MethodCallNode methodCall);
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 bcb74d5..b3285ba 100644
--- a/src/main/java/org/zwobble/couscous/ast/visitors/NodeMapperWithDefault.java
+++ b/src/main/java/org/zwobble/couscous/ast/visitors/NodeMapperWithDefault.java
@@ -23,7 +23,12 @@ public class NodeMapperWithDefault<T> implements NodeMapper<T> {
public T visit(ThisReferenceNode reference) {
return defaultValue;
}
-
+
+ @Override
+ public T visit(ArrayNode array) {
+ return defaultValue;
+ }
+
@Override
public T visit(AssignmentNode assignment) {
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 393bd7e..710ef99 100644
--- a/src/main/java/org/zwobble/couscous/ast/visitors/NodeTransformer.java
+++ b/src/main/java/org/zwobble/couscous/ast/visitors/NodeTransformer.java
@@ -45,6 +45,11 @@ public class NodeTransformer {
}
@Override
+ public Node visit(ArrayNode array) {
+ return transformExpression(array);
+ }
+
+ @Override
public Node visit(AssignmentNode assignment) {
return transformExpression(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
index 28c38fc..c70d662 100644
--- a/src/main/java/org/zwobble/couscous/ast/visitors/NodeVisitor.java
+++ b/src/main/java/org/zwobble/couscous/ast/visitors/NodeVisitor.java
@@ -6,6 +6,7 @@ public interface NodeVisitor {
void visit(LiteralNode literal);
void visit(VariableReferenceNode variableReference);
void visit(ThisReferenceNode reference);
+ void visit(ArrayNode array);
void visit(AssignmentNode assignment);
void visit(TernaryConditionalNode ternaryConditional);
void visit(MethodCallNode methodCall);