aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org/zwobble/couscous/ast
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/org/zwobble/couscous/ast')
-rw-r--r--src/main/java/org/zwobble/couscous/ast/AnnotationNode.java6
-rw-r--r--src/main/java/org/zwobble/couscous/ast/ArrayNode.java5
-rw-r--r--src/main/java/org/zwobble/couscous/ast/AssignmentNode.java6
-rw-r--r--src/main/java/org/zwobble/couscous/ast/CastNode.java6
-rw-r--r--src/main/java/org/zwobble/couscous/ast/ClassNode.java15
-rw-r--r--src/main/java/org/zwobble/couscous/ast/ConstructorCallNode.java5
-rw-r--r--src/main/java/org/zwobble/couscous/ast/ConstructorNode.java6
-rw-r--r--src/main/java/org/zwobble/couscous/ast/EnumNode.java6
-rw-r--r--src/main/java/org/zwobble/couscous/ast/ExpressionStatementNode.java6
-rw-r--r--src/main/java/org/zwobble/couscous/ast/FieldAccessNode.java6
-rw-r--r--src/main/java/org/zwobble/couscous/ast/FieldDeclarationNode.java6
-rw-r--r--src/main/java/org/zwobble/couscous/ast/FormalArgumentNode.java6
-rw-r--r--src/main/java/org/zwobble/couscous/ast/FormalTypeParameterNode.java6
-rw-r--r--src/main/java/org/zwobble/couscous/ast/IfStatementNode.java7
-rw-r--r--src/main/java/org/zwobble/couscous/ast/InstanceOfNode.java6
-rw-r--r--src/main/java/org/zwobble/couscous/ast/InstanceReceiver.java6
-rw-r--r--src/main/java/org/zwobble/couscous/ast/InterfaceNode.java5
-rw-r--r--src/main/java/org/zwobble/couscous/ast/LiteralNode.java6
-rw-r--r--src/main/java/org/zwobble/couscous/ast/LocalVariableDeclarationNode.java6
-rw-r--r--src/main/java/org/zwobble/couscous/ast/MethodCallNode.java6
-rw-r--r--src/main/java/org/zwobble/couscous/ast/MethodNode.java10
-rw-r--r--src/main/java/org/zwobble/couscous/ast/Node.java2
-rw-r--r--src/main/java/org/zwobble/couscous/ast/OperationNode.java5
-rw-r--r--src/main/java/org/zwobble/couscous/ast/ReturnNode.java6
-rw-r--r--src/main/java/org/zwobble/couscous/ast/StaticReceiver.java6
-rw-r--r--src/main/java/org/zwobble/couscous/ast/TernaryConditionalNode.java6
-rw-r--r--src/main/java/org/zwobble/couscous/ast/ThisReferenceNode.java6
-rw-r--r--src/main/java/org/zwobble/couscous/ast/ThrowNode.java6
-rw-r--r--src/main/java/org/zwobble/couscous/ast/TryNode.java11
-rw-r--r--src/main/java/org/zwobble/couscous/ast/TypeCoercionNode.java6
-rw-r--r--src/main/java/org/zwobble/couscous/ast/VariableReferenceNode.java6
-rw-r--r--src/main/java/org/zwobble/couscous/ast/WhileNode.java6
-rw-r--r--src/main/java/org/zwobble/couscous/ast/structure/NodeStructure.java183
33 files changed, 204 insertions, 182 deletions
diff --git a/src/main/java/org/zwobble/couscous/ast/AnnotationNode.java b/src/main/java/org/zwobble/couscous/ast/AnnotationNode.java
index 00d9797..86fe23c 100644
--- a/src/main/java/org/zwobble/couscous/ast/AnnotationNode.java
+++ b/src/main/java/org/zwobble/couscous/ast/AnnotationNode.java
@@ -3,6 +3,7 @@ package org.zwobble.couscous.ast;
import org.zwobble.couscous.types.Type;
import org.zwobble.couscous.ast.visitors.NodeMapper;
import org.zwobble.couscous.ast.visitors.NodeTransformer;
+import org.zwobble.couscous.util.ExtraIterables;
public class AnnotationNode implements Node {
public static AnnotationNode annotation(Type type) {
@@ -24,6 +25,11 @@ public class AnnotationNode implements Node {
return visitor.visit(this);
}
+ @Override
+ public Iterable<? extends Node> childNodes() {
+ return ExtraIterables.empty();
+ }
+
public AnnotationNode transform(NodeTransformer transformer) {
return new AnnotationNode(transformer.transform(type));
}
diff --git a/src/main/java/org/zwobble/couscous/ast/ArrayNode.java b/src/main/java/org/zwobble/couscous/ast/ArrayNode.java
index 78e6869..a544cc9 100644
--- a/src/main/java/org/zwobble/couscous/ast/ArrayNode.java
+++ b/src/main/java/org/zwobble/couscous/ast/ArrayNode.java
@@ -39,6 +39,11 @@ public class ArrayNode implements ExpressionNode {
}
@Override
+ public Iterable<? extends Node> childNodes() {
+ return elements;
+ }
+
+ @Override
public ExpressionNode transform(NodeTransformer transformer) {
return new ArrayNode(
transformer.transform(elementType),
diff --git a/src/main/java/org/zwobble/couscous/ast/AssignmentNode.java b/src/main/java/org/zwobble/couscous/ast/AssignmentNode.java
index 6c49d39..a2f9f2d 100644
--- a/src/main/java/org/zwobble/couscous/ast/AssignmentNode.java
+++ b/src/main/java/org/zwobble/couscous/ast/AssignmentNode.java
@@ -3,6 +3,7 @@ package org.zwobble.couscous.ast;
import org.zwobble.couscous.types.Type;
import org.zwobble.couscous.ast.visitors.ExpressionNodeMapper;
import org.zwobble.couscous.ast.visitors.NodeTransformer;
+import org.zwobble.couscous.util.ExtraIterables;
import static org.zwobble.couscous.ast.ExpressionStatementNode.expressionStatement;
import static org.zwobble.couscous.ast.VariableReferenceNode.reference;
@@ -46,6 +47,11 @@ public class AssignmentNode implements ExpressionNode {
}
@Override
+ public Iterable<Node> childNodes() {
+ return ExtraIterables.of(value, target);
+ }
+
+ @Override
public ExpressionNode transform(NodeTransformer transformer) {
return new AssignmentNode(
(AssignableExpressionNode) transformer.transformExpression(target),
diff --git a/src/main/java/org/zwobble/couscous/ast/CastNode.java b/src/main/java/org/zwobble/couscous/ast/CastNode.java
index 026a1c0..ed41011 100644
--- a/src/main/java/org/zwobble/couscous/ast/CastNode.java
+++ b/src/main/java/org/zwobble/couscous/ast/CastNode.java
@@ -3,6 +3,7 @@ package org.zwobble.couscous.ast;
import org.zwobble.couscous.types.Type;
import org.zwobble.couscous.ast.visitors.ExpressionNodeMapper;
import org.zwobble.couscous.ast.visitors.NodeTransformer;
+import org.zwobble.couscous.util.ExtraIterables;
public class CastNode implements ExpressionNode {
public static ExpressionNode cast(ExpressionNode expression, Type type) {
@@ -32,6 +33,11 @@ public class CastNode implements ExpressionNode {
}
@Override
+ public Iterable<? extends Node> childNodes() {
+ return ExtraIterables.of(expression);
+ }
+
+ @Override
public ExpressionNode transform(NodeTransformer transformer) {
return new CastNode(transformer.transformExpression(expression), transformer.transform(type));
}
diff --git a/src/main/java/org/zwobble/couscous/ast/ClassNode.java b/src/main/java/org/zwobble/couscous/ast/ClassNode.java
index bcdd275..97f66f8 100644
--- a/src/main/java/org/zwobble/couscous/ast/ClassNode.java
+++ b/src/main/java/org/zwobble/couscous/ast/ClassNode.java
@@ -1,9 +1,11 @@
package org.zwobble.couscous.ast;
-import org.zwobble.couscous.types.ScalarType;
-import org.zwobble.couscous.types.Type;
+import com.google.common.collect.Iterables;
import org.zwobble.couscous.ast.visitors.NodeMapper;
import org.zwobble.couscous.ast.visitors.NodeTransformer;
+import org.zwobble.couscous.types.ScalarType;
+import org.zwobble.couscous.types.Type;
+import org.zwobble.couscous.util.ExtraIterables;
import java.util.List;
import java.util.Set;
@@ -96,6 +98,15 @@ public class ClassNode implements TypeNode {
}
@Override
+ public Iterable<? extends Node> childNodes() {
+ return Iterables.concat(
+ ExtraIterables.of(constructor),
+ fields,
+ methods
+ );
+ }
+
+ @Override
public ClassNode transform(NodeTransformer transformer) {
return new ClassNode(
transformer.transform(name),
diff --git a/src/main/java/org/zwobble/couscous/ast/ConstructorCallNode.java b/src/main/java/org/zwobble/couscous/ast/ConstructorCallNode.java
index fdd9f86..9f054ae 100644
--- a/src/main/java/org/zwobble/couscous/ast/ConstructorCallNode.java
+++ b/src/main/java/org/zwobble/couscous/ast/ConstructorCallNode.java
@@ -40,6 +40,11 @@ public class ConstructorCallNode implements ExpressionNode {
}
@Override
+ public Iterable<? extends Node> childNodes() {
+ return arguments;
+ }
+
+ @Override
public ExpressionNode transform(NodeTransformer transformer) {
return new ConstructorCallNode(
transformer.transform(type),
diff --git a/src/main/java/org/zwobble/couscous/ast/ConstructorNode.java b/src/main/java/org/zwobble/couscous/ast/ConstructorNode.java
index 1bd33d0..ea83c93 100644
--- a/src/main/java/org/zwobble/couscous/ast/ConstructorNode.java
+++ b/src/main/java/org/zwobble/couscous/ast/ConstructorNode.java
@@ -1,5 +1,6 @@
package org.zwobble.couscous.ast;
+import com.google.common.collect.Iterables;
import org.zwobble.couscous.ast.visitors.NodeMapper;
import org.zwobble.couscous.ast.visitors.NodeTransformer;
@@ -38,6 +39,11 @@ public class ConstructorNode implements Node {
return visitor.visit(this);
}
+ @Override
+ public Iterable<? extends Node> childNodes() {
+ return Iterables.concat(arguments, body);
+ }
+
public ConstructorNode transform(NodeTransformer transformer) {
return new ConstructorNode(
transformer.transformFormalArguments(arguments),
diff --git a/src/main/java/org/zwobble/couscous/ast/EnumNode.java b/src/main/java/org/zwobble/couscous/ast/EnumNode.java
index 6ecec65..5b68dc6 100644
--- a/src/main/java/org/zwobble/couscous/ast/EnumNode.java
+++ b/src/main/java/org/zwobble/couscous/ast/EnumNode.java
@@ -4,6 +4,7 @@ import org.zwobble.couscous.ast.visitors.NodeMapper;
import org.zwobble.couscous.ast.visitors.NodeTransformer;
import org.zwobble.couscous.types.ScalarType;
import org.zwobble.couscous.types.Type;
+import org.zwobble.couscous.util.ExtraIterables;
import java.util.List;
import java.util.Set;
@@ -50,6 +51,11 @@ public class EnumNode implements TypeNode {
}
@Override
+ public Iterable<? extends Node> childNodes() {
+ return ExtraIterables.empty();
+ }
+
+ @Override
public TypeNode transform(NodeTransformer transformer) {
return new EnumNode(
transformer.transform(name),
diff --git a/src/main/java/org/zwobble/couscous/ast/ExpressionStatementNode.java b/src/main/java/org/zwobble/couscous/ast/ExpressionStatementNode.java
index aa69ea1..1dacc9f 100644
--- a/src/main/java/org/zwobble/couscous/ast/ExpressionStatementNode.java
+++ b/src/main/java/org/zwobble/couscous/ast/ExpressionStatementNode.java
@@ -2,6 +2,7 @@ package org.zwobble.couscous.ast;
import org.zwobble.couscous.ast.visitors.NodeTransformer;
import org.zwobble.couscous.ast.visitors.StatementNodeMapper;
+import org.zwobble.couscous.util.ExtraIterables;
public class ExpressionStatementNode implements StatementNode {
public static ExpressionStatementNode expressionStatement(ExpressionNode expression) {
@@ -24,6 +25,11 @@ public class ExpressionStatementNode implements StatementNode {
}
@Override
+ public Iterable<? extends Node> childNodes() {
+ return ExtraIterables.of(expression);
+ }
+
+ @Override
public StatementNode transform(NodeTransformer transformer) {
return new ExpressionStatementNode(transformer.transformExpression(expression));
}
diff --git a/src/main/java/org/zwobble/couscous/ast/FieldAccessNode.java b/src/main/java/org/zwobble/couscous/ast/FieldAccessNode.java
index b28d823..3b7992c 100644
--- a/src/main/java/org/zwobble/couscous/ast/FieldAccessNode.java
+++ b/src/main/java/org/zwobble/couscous/ast/FieldAccessNode.java
@@ -5,6 +5,7 @@ import org.zwobble.couscous.types.Type;
import org.zwobble.couscous.ast.visitors.AssignableExpressionNodeVisitor;
import org.zwobble.couscous.ast.visitors.ExpressionNodeMapper;
import org.zwobble.couscous.ast.visitors.NodeTransformer;
+import org.zwobble.couscous.util.ExtraIterables;
import static org.zwobble.couscous.ast.InstanceReceiver.instanceReceiver;
import static org.zwobble.couscous.ast.StaticReceiver.staticReceiver;
@@ -66,6 +67,11 @@ public class FieldAccessNode implements AssignableExpressionNode {
}
@Override
+ public Iterable<? extends Node> childNodes() {
+ return ExtraIterables.of(left);
+ }
+
+ @Override
public ExpressionNode transform(NodeTransformer transformer) {
return new FieldAccessNode(
transformer.transformReceiver(left),
diff --git a/src/main/java/org/zwobble/couscous/ast/FieldDeclarationNode.java b/src/main/java/org/zwobble/couscous/ast/FieldDeclarationNode.java
index 67f79c9..8c4dc5a 100644
--- a/src/main/java/org/zwobble/couscous/ast/FieldDeclarationNode.java
+++ b/src/main/java/org/zwobble/couscous/ast/FieldDeclarationNode.java
@@ -3,6 +3,7 @@ package org.zwobble.couscous.ast;
import org.zwobble.couscous.types.Type;
import org.zwobble.couscous.ast.visitors.NodeMapper;
import org.zwobble.couscous.ast.visitors.NodeTransformer;
+import org.zwobble.couscous.util.ExtraIterables;
public class FieldDeclarationNode implements Node {
public static FieldDeclarationNode field(String name, Type type) {
@@ -44,6 +45,11 @@ public class FieldDeclarationNode implements Node {
return visitor.visit(this);
}
+ @Override
+ public Iterable<? extends Node> childNodes() {
+ return ExtraIterables.empty();
+ }
+
public FieldDeclarationNode transform(NodeTransformer transformer) {
return new FieldDeclarationNode(
isStatic,
diff --git a/src/main/java/org/zwobble/couscous/ast/FormalArgumentNode.java b/src/main/java/org/zwobble/couscous/ast/FormalArgumentNode.java
index ae80b0c..db13e59 100644
--- a/src/main/java/org/zwobble/couscous/ast/FormalArgumentNode.java
+++ b/src/main/java/org/zwobble/couscous/ast/FormalArgumentNode.java
@@ -3,6 +3,7 @@ package org.zwobble.couscous.ast;
import org.zwobble.couscous.types.Type;
import org.zwobble.couscous.ast.visitors.NodeMapper;
import org.zwobble.couscous.ast.visitors.NodeTransformer;
+import org.zwobble.couscous.util.ExtraIterables;
public class FormalArgumentNode implements VariableNode, Node {
public static FormalArgumentNode formalArg(VariableDeclaration declaration) {
@@ -32,6 +33,11 @@ public class FormalArgumentNode implements VariableNode, Node {
return visitor.visit(this);
}
+ @Override
+ public Iterable<? extends Node> childNodes() {
+ return ExtraIterables.empty();
+ }
+
public FormalArgumentNode transform(NodeTransformer transformer) {
return new FormalArgumentNode(transformer.transform(declaration));
}
diff --git a/src/main/java/org/zwobble/couscous/ast/FormalTypeParameterNode.java b/src/main/java/org/zwobble/couscous/ast/FormalTypeParameterNode.java
index d81eadb..2c1ac4a 100644
--- a/src/main/java/org/zwobble/couscous/ast/FormalTypeParameterNode.java
+++ b/src/main/java/org/zwobble/couscous/ast/FormalTypeParameterNode.java
@@ -4,6 +4,7 @@ import org.zwobble.couscous.ast.identifiers.Identifier;
import org.zwobble.couscous.ast.visitors.NodeMapper;
import org.zwobble.couscous.ast.visitors.NodeTransformer;
import org.zwobble.couscous.types.TypeParameter;
+import org.zwobble.couscous.util.ExtraIterables;
public class FormalTypeParameterNode implements Node {
public static FormalTypeParameterNode formalTypeParameter(Identifier declaringScope, String name) {
@@ -28,6 +29,11 @@ public class FormalTypeParameterNode implements Node {
return type.getName();
}
+ @Override
+ public Iterable<? extends Node> childNodes() {
+ return ExtraIterables.empty();
+ }
+
public FormalTypeParameterNode transform(NodeTransformer transformer) {
return new FormalTypeParameterNode(transformer.transform(type));
}
diff --git a/src/main/java/org/zwobble/couscous/ast/IfStatementNode.java b/src/main/java/org/zwobble/couscous/ast/IfStatementNode.java
index a3a94ad..6ead916 100644
--- a/src/main/java/org/zwobble/couscous/ast/IfStatementNode.java
+++ b/src/main/java/org/zwobble/couscous/ast/IfStatementNode.java
@@ -1,7 +1,9 @@
package org.zwobble.couscous.ast;
+import com.google.common.collect.Iterables;
import org.zwobble.couscous.ast.visitors.NodeTransformer;
import org.zwobble.couscous.ast.visitors.StatementNodeMapper;
+import org.zwobble.couscous.util.ExtraIterables;
import java.util.List;
@@ -44,6 +46,11 @@ public class IfStatementNode implements StatementNode {
}
@Override
+ public Iterable<? extends Node> childNodes() {
+ return Iterables.concat(ExtraIterables.of(condition), trueBranch, falseBranch);
+ }
+
+ @Override
public StatementNode transform(NodeTransformer transformer) {
return new IfStatementNode(
transformer.transformExpression(condition),
diff --git a/src/main/java/org/zwobble/couscous/ast/InstanceOfNode.java b/src/main/java/org/zwobble/couscous/ast/InstanceOfNode.java
index 21f823b..d36e909 100644
--- a/src/main/java/org/zwobble/couscous/ast/InstanceOfNode.java
+++ b/src/main/java/org/zwobble/couscous/ast/InstanceOfNode.java
@@ -5,6 +5,7 @@ import org.zwobble.couscous.ast.visitors.NodeTransformer;
import org.zwobble.couscous.types.ScalarType;
import org.zwobble.couscous.types.Type;
import org.zwobble.couscous.types.Types;
+import org.zwobble.couscous.util.ExtraIterables;
public class InstanceOfNode implements ExpressionNode {
private final ExpressionNode left;
@@ -34,6 +35,11 @@ public class InstanceOfNode implements ExpressionNode {
}
@Override
+ public Iterable<? extends Node> childNodes() {
+ return ExtraIterables.of(left);
+ }
+
+ @Override
public ExpressionNode transform(NodeTransformer transformer) {
return new InstanceOfNode(
transformer.transformExpression(left),
diff --git a/src/main/java/org/zwobble/couscous/ast/InstanceReceiver.java b/src/main/java/org/zwobble/couscous/ast/InstanceReceiver.java
index cbd4b6e..292b026 100644
--- a/src/main/java/org/zwobble/couscous/ast/InstanceReceiver.java
+++ b/src/main/java/org/zwobble/couscous/ast/InstanceReceiver.java
@@ -2,6 +2,7 @@ package org.zwobble.couscous.ast;
import org.zwobble.couscous.ast.visitors.NodeMapper;
import org.zwobble.couscous.ast.visitors.NodeTransformer;
+import org.zwobble.couscous.util.ExtraIterables;
public class InstanceReceiver implements Receiver {
public static Receiver instanceReceiver(ExpressionNode expression) {
@@ -24,6 +25,11 @@ public class InstanceReceiver implements Receiver {
}
@Override
+ public Iterable<? extends Node> childNodes() {
+ return ExtraIterables.of(expression);
+ }
+
+ @Override
public Receiver transform(NodeTransformer transformer) {
return new InstanceReceiver(transformer.transformExpression(expression));
}
diff --git a/src/main/java/org/zwobble/couscous/ast/InterfaceNode.java b/src/main/java/org/zwobble/couscous/ast/InterfaceNode.java
index 86972ad..94d45fd 100644
--- a/src/main/java/org/zwobble/couscous/ast/InterfaceNode.java
+++ b/src/main/java/org/zwobble/couscous/ast/InterfaceNode.java
@@ -71,6 +71,11 @@ public class InterfaceNode implements TypeNode {
}
@Override
+ public Iterable<? extends Node> childNodes() {
+ return methods;
+ }
+
+ @Override
public InterfaceNode transform(NodeTransformer transformer) {
return new InterfaceNode(
transformer.transform(name),
diff --git a/src/main/java/org/zwobble/couscous/ast/LiteralNode.java b/src/main/java/org/zwobble/couscous/ast/LiteralNode.java
index d1be23f..ac9cd1b 100644
--- a/src/main/java/org/zwobble/couscous/ast/LiteralNode.java
+++ b/src/main/java/org/zwobble/couscous/ast/LiteralNode.java
@@ -4,6 +4,7 @@ import org.zwobble.couscous.ast.visitors.ExpressionNodeMapper;
import org.zwobble.couscous.ast.visitors.NodeTransformer;
import org.zwobble.couscous.types.ScalarType;
import org.zwobble.couscous.types.Type;
+import org.zwobble.couscous.util.ExtraIterables;
import org.zwobble.couscous.values.PrimitiveValue;
import org.zwobble.couscous.values.PrimitiveValues;
import org.zwobble.couscous.values.TypeValue;
@@ -59,6 +60,11 @@ public class LiteralNode implements ExpressionNode {
}
@Override
+ public Iterable<Node> childNodes() {
+ return ExtraIterables.empty();
+ }
+
+ @Override
public ExpressionNode transform(NodeTransformer transformer) {
return new LiteralNode(transformValue(transformer), transformer.transform(type));
}
diff --git a/src/main/java/org/zwobble/couscous/ast/LocalVariableDeclarationNode.java b/src/main/java/org/zwobble/couscous/ast/LocalVariableDeclarationNode.java
index 4078adb..54a6804 100644
--- a/src/main/java/org/zwobble/couscous/ast/LocalVariableDeclarationNode.java
+++ b/src/main/java/org/zwobble/couscous/ast/LocalVariableDeclarationNode.java
@@ -4,6 +4,7 @@ import org.zwobble.couscous.ast.identifiers.Identifier;
import org.zwobble.couscous.types.Type;
import org.zwobble.couscous.ast.visitors.NodeTransformer;
import org.zwobble.couscous.ast.visitors.StatementNodeMapper;
+import org.zwobble.couscous.util.ExtraIterables;
import static org.zwobble.couscous.ast.TypeCoercionNode.coerce;
import static org.zwobble.couscous.ast.VariableDeclaration.var;
@@ -55,6 +56,11 @@ public class LocalVariableDeclarationNode implements VariableNode, StatementNode
}
@Override
+ public Iterable<? extends Node> childNodes() {
+ return ExtraIterables.of(initialValue);
+ }
+
+ @Override
public StatementNode transform(NodeTransformer transformer) {
return new LocalVariableDeclarationNode(
transformer.transform(declaration),
diff --git a/src/main/java/org/zwobble/couscous/ast/MethodCallNode.java b/src/main/java/org/zwobble/couscous/ast/MethodCallNode.java
index c0f2c6f..0446857 100644
--- a/src/main/java/org/zwobble/couscous/ast/MethodCallNode.java
+++ b/src/main/java/org/zwobble/couscous/ast/MethodCallNode.java
@@ -4,6 +4,7 @@ import org.zwobble.couscous.ast.visitors.ExpressionNodeMapper;
import org.zwobble.couscous.ast.visitors.NodeTransformer;
import org.zwobble.couscous.types.ScalarType;
import org.zwobble.couscous.types.Type;
+import org.zwobble.couscous.util.ExtraIterables;
import java.util.List;
@@ -159,6 +160,11 @@ public class MethodCallNode implements ExpressionNode {
}
@Override
+ public Iterable<? extends Node> childNodes() {
+ return ExtraIterables.lazyCons(receiver, arguments);
+ }
+
+ @Override
public ExpressionNode transform(NodeTransformer transformer) {
return new MethodCallNode(
transformer.transformReceiver(receiver),
diff --git a/src/main/java/org/zwobble/couscous/ast/MethodNode.java b/src/main/java/org/zwobble/couscous/ast/MethodNode.java
index 1cb3766..2c1c099 100644
--- a/src/main/java/org/zwobble/couscous/ast/MethodNode.java
+++ b/src/main/java/org/zwobble/couscous/ast/MethodNode.java
@@ -1,6 +1,7 @@
package org.zwobble.couscous.ast;
import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Iterables;
import org.zwobble.couscous.ast.visitors.NodeMapper;
import org.zwobble.couscous.ast.visitors.NodeTransformer;
import org.zwobble.couscous.types.Type;
@@ -193,6 +194,15 @@ public class MethodNode implements Node {
return visitor.visit(this);
}
+ @Override
+ public Iterable<? extends Node> childNodes() {
+ return Iterables.concat(
+ annotations,
+ arguments,
+ body.orElse(ImmutableList.of())
+ );
+ }
+
public MethodNode transform(NodeTransformer transformer) {
return new MethodNode(
transformer.transformAnnotations(annotations),
diff --git a/src/main/java/org/zwobble/couscous/ast/Node.java b/src/main/java/org/zwobble/couscous/ast/Node.java
index 7bea8b9..cc57d12 100644
--- a/src/main/java/org/zwobble/couscous/ast/Node.java
+++ b/src/main/java/org/zwobble/couscous/ast/Node.java
@@ -4,6 +4,8 @@ import org.zwobble.couscous.ast.visitors.NodeMapper;
import org.zwobble.couscous.ast.visitors.NodeVisitor;
public interface Node {
+ Iterable<? extends Node> childNodes();
+
default void accept(NodeVisitor visitor) {
accept(new NodeMapper<Void>() {
@Override
diff --git a/src/main/java/org/zwobble/couscous/ast/OperationNode.java b/src/main/java/org/zwobble/couscous/ast/OperationNode.java
index 1e49c97..32bde37 100644
--- a/src/main/java/org/zwobble/couscous/ast/OperationNode.java
+++ b/src/main/java/org/zwobble/couscous/ast/OperationNode.java
@@ -52,6 +52,11 @@ public class OperationNode implements ExpressionNode {
}
@Override
+ public Iterable<? extends Node> childNodes() {
+ return arguments;
+ }
+
+ @Override
public ExpressionNode transform(NodeTransformer transformer) {
return new OperationNode(
operator,
diff --git a/src/main/java/org/zwobble/couscous/ast/ReturnNode.java b/src/main/java/org/zwobble/couscous/ast/ReturnNode.java
index 136f343..a5d9011 100644
--- a/src/main/java/org/zwobble/couscous/ast/ReturnNode.java
+++ b/src/main/java/org/zwobble/couscous/ast/ReturnNode.java
@@ -2,6 +2,7 @@ package org.zwobble.couscous.ast;
import org.zwobble.couscous.ast.visitors.NodeTransformer;
import org.zwobble.couscous.ast.visitors.StatementNodeMapper;
+import org.zwobble.couscous.util.ExtraIterables;
public class ReturnNode implements StatementNode {
public static ReturnNode returns(ExpressionNode value) {
@@ -24,6 +25,11 @@ public class ReturnNode implements StatementNode {
}
@Override
+ public Iterable<? extends Node> childNodes() {
+ return ExtraIterables.of(value);
+ }
+
+ @Override
public StatementNode transform(NodeTransformer transformer) {
return new ReturnNode(transformer.transformExpression(value));
}
diff --git a/src/main/java/org/zwobble/couscous/ast/StaticReceiver.java b/src/main/java/org/zwobble/couscous/ast/StaticReceiver.java
index bd59261..f2fbc59 100644
--- a/src/main/java/org/zwobble/couscous/ast/StaticReceiver.java
+++ b/src/main/java/org/zwobble/couscous/ast/StaticReceiver.java
@@ -3,6 +3,7 @@ package org.zwobble.couscous.ast;
import org.zwobble.couscous.types.ScalarType;
import org.zwobble.couscous.ast.visitors.NodeMapper;
import org.zwobble.couscous.ast.visitors.NodeTransformer;
+import org.zwobble.couscous.util.ExtraIterables;
public class StaticReceiver implements Receiver {
public static Receiver staticReceiver(String type) {
@@ -34,6 +35,11 @@ public class StaticReceiver implements Receiver {
}
@Override
+ public Iterable<? extends Node> childNodes() {
+ return ExtraIterables.empty();
+ }
+
+ @Override
public Receiver transform(NodeTransformer transformer) {
return new StaticReceiver(transformer.transform(type));
}
diff --git a/src/main/java/org/zwobble/couscous/ast/TernaryConditionalNode.java b/src/main/java/org/zwobble/couscous/ast/TernaryConditionalNode.java
index 9d17848..3ffcf63 100644
--- a/src/main/java/org/zwobble/couscous/ast/TernaryConditionalNode.java
+++ b/src/main/java/org/zwobble/couscous/ast/TernaryConditionalNode.java
@@ -3,6 +3,7 @@ package org.zwobble.couscous.ast;
import org.zwobble.couscous.types.Type;
import org.zwobble.couscous.ast.visitors.ExpressionNodeMapper;
import org.zwobble.couscous.ast.visitors.NodeTransformer;
+import org.zwobble.couscous.util.ExtraIterables;
public class TernaryConditionalNode implements ExpressionNode {
public static TernaryConditionalNode ternaryConditional(
@@ -43,6 +44,11 @@ public class TernaryConditionalNode implements ExpressionNode {
}
@Override
+ public Iterable<? extends Node> childNodes() {
+ return ExtraIterables.of(condition, ifTrue, ifFalse);
+ }
+
+ @Override
public ExpressionNode transform(NodeTransformer transformer) {
return new TernaryConditionalNode(
transformer.transformExpression(condition),
diff --git a/src/main/java/org/zwobble/couscous/ast/ThisReferenceNode.java b/src/main/java/org/zwobble/couscous/ast/ThisReferenceNode.java
index e13596e..1363b24 100644
--- a/src/main/java/org/zwobble/couscous/ast/ThisReferenceNode.java
+++ b/src/main/java/org/zwobble/couscous/ast/ThisReferenceNode.java
@@ -3,6 +3,7 @@ package org.zwobble.couscous.ast;
import org.zwobble.couscous.types.Type;
import org.zwobble.couscous.ast.visitors.ExpressionNodeMapper;
import org.zwobble.couscous.ast.visitors.NodeTransformer;
+import org.zwobble.couscous.util.ExtraIterables;
public class ThisReferenceNode implements ExpressionNode, ReferenceNode {
public static ThisReferenceNode thisReference(Type type) {
@@ -30,6 +31,11 @@ public class ThisReferenceNode implements ExpressionNode, ReferenceNode {
}
@Override
+ public Iterable<Node> childNodes() {
+ return ExtraIterables.empty();
+ }
+
+ @Override
public ExpressionNode transform(NodeTransformer transformer) {
return new ThisReferenceNode(transformer.transform(type));
}
diff --git a/src/main/java/org/zwobble/couscous/ast/ThrowNode.java b/src/main/java/org/zwobble/couscous/ast/ThrowNode.java
index ee6d7a5..c8a0edf 100644
--- a/src/main/java/org/zwobble/couscous/ast/ThrowNode.java
+++ b/src/main/java/org/zwobble/couscous/ast/ThrowNode.java
@@ -2,6 +2,7 @@ package org.zwobble.couscous.ast;
import org.zwobble.couscous.ast.visitors.NodeTransformer;
import org.zwobble.couscous.ast.visitors.StatementNodeMapper;
+import org.zwobble.couscous.util.ExtraIterables;
public class ThrowNode implements StatementNode {
public static ThrowNode throwNode(ExpressionNode value) {
@@ -24,6 +25,11 @@ public class ThrowNode implements StatementNode {
}
@Override
+ public Iterable<? extends Node> childNodes() {
+ return ExtraIterables.of(value);
+ }
+
+ @Override
public StatementNode transform(NodeTransformer transformer) {
return new ThrowNode(transformer.transformExpression(value));
}
diff --git a/src/main/java/org/zwobble/couscous/ast/TryNode.java b/src/main/java/org/zwobble/couscous/ast/TryNode.java
index 800931f..3c18e1a 100644
--- a/src/main/java/org/zwobble/couscous/ast/TryNode.java
+++ b/src/main/java/org/zwobble/couscous/ast/TryNode.java
@@ -1,10 +1,12 @@
package org.zwobble.couscous.ast;
+import com.google.common.collect.Iterables;
import org.zwobble.couscous.ast.visitors.NodeTransformer;
import org.zwobble.couscous.ast.visitors.StatementNodeMapper;
import java.util.List;
+import static org.zwobble.couscous.util.ExtraIterables.lazyFlatMap;
import static org.zwobble.couscous.util.ExtraLists.eagerMap;
public class TryNode implements StatementNode {
@@ -48,6 +50,15 @@ public class TryNode implements StatementNode {
}
@Override
+ public Iterable<? extends Node> childNodes() {
+ return Iterables.concat(
+ body,
+ lazyFlatMap(exceptionHandlers, handler -> handler.getBody()),
+ finallyBody
+ );
+ }
+
+ @Override
public StatementNode transform(NodeTransformer transformer) {
return new TryNode(
transformer.transformStatements(body),
diff --git a/src/main/java/org/zwobble/couscous/ast/TypeCoercionNode.java b/src/main/java/org/zwobble/couscous/ast/TypeCoercionNode.java
index 503aa7e..89f6d84 100644
--- a/src/main/java/org/zwobble/couscous/ast/TypeCoercionNode.java
+++ b/src/main/java/org/zwobble/couscous/ast/TypeCoercionNode.java
@@ -3,6 +3,7 @@ package org.zwobble.couscous.ast;
import org.zwobble.couscous.types.Type;
import org.zwobble.couscous.ast.visitors.ExpressionNodeMapper;
import org.zwobble.couscous.ast.visitors.NodeTransformer;
+import org.zwobble.couscous.util.ExtraIterables;
import static org.zwobble.couscous.types.Types.concrete;
@@ -42,6 +43,11 @@ public class TypeCoercionNode implements ExpressionNode {
}
@Override
+ public Iterable<? extends Node> childNodes() {
+ return ExtraIterables.of(expression);
+ }
+
+ @Override
public ExpressionNode transform(NodeTransformer transformer) {
return new TypeCoercionNode(
transformer.transformExpression(expression),
diff --git a/src/main/java/org/zwobble/couscous/ast/VariableReferenceNode.java b/src/main/java/org/zwobble/couscous/ast/VariableReferenceNode.java
index 3f7da7f..ce2ba44 100644
--- a/src/main/java/org/zwobble/couscous/ast/VariableReferenceNode.java
+++ b/src/main/java/org/zwobble/couscous/ast/VariableReferenceNode.java
@@ -5,6 +5,7 @@ import org.zwobble.couscous.types.Type;
import org.zwobble.couscous.ast.visitors.AssignableExpressionNodeVisitor;
import org.zwobble.couscous.ast.visitors.ExpressionNodeMapper;
import org.zwobble.couscous.ast.visitors.NodeTransformer;
+import org.zwobble.couscous.util.ExtraIterables;
public class VariableReferenceNode implements AssignableExpressionNode, ReferenceNode {
public static VariableReferenceNode reference(VariableNode variable) {
@@ -50,6 +51,11 @@ public class VariableReferenceNode implements AssignableExpressionNode, Referenc
}
@Override
+ public Iterable<Node> childNodes() {
+ return ExtraIterables.empty();
+ }
+
+ @Override
public ExpressionNode transform(NodeTransformer transformer) {
return new VariableReferenceNode(transformer.transform(referent));
}
diff --git a/src/main/java/org/zwobble/couscous/ast/WhileNode.java b/src/main/java/org/zwobble/couscous/ast/WhileNode.java
index 8ea693f..3dd6bce 100644
--- a/src/main/java/org/zwobble/couscous/ast/WhileNode.java
+++ b/src/main/java/org/zwobble/couscous/ast/WhileNode.java
@@ -3,6 +3,7 @@ package org.zwobble.couscous.ast;
import com.google.common.base.Objects;
import org.zwobble.couscous.ast.visitors.NodeTransformer;
import org.zwobble.couscous.ast.visitors.StatementNodeMapper;
+import org.zwobble.couscous.util.ExtraIterables;
import java.util.List;
@@ -33,6 +34,11 @@ public class WhileNode implements StatementNode {
}
@Override
+ public Iterable<? extends Node> childNodes() {
+ return ExtraIterables.lazyCons(condition, body);
+ }
+
+ @Override
public StatementNode transform(NodeTransformer transformer) {
return new WhileNode(
transformer.transformExpression(condition),
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 a31e438..7bc2dbf 100644
--- a/src/main/java/org/zwobble/couscous/ast/structure/NodeStructure.java
+++ b/src/main/java/org/zwobble/couscous/ast/structure/NodeStructure.java
@@ -1,14 +1,11 @@
package org.zwobble.couscous.ast.structure;
-import org.zwobble.couscous.ast.*;
-import org.zwobble.couscous.ast.visitors.NodeMapper;
+import org.zwobble.couscous.ast.Node;
+import org.zwobble.couscous.util.ExtraIterables;
-import java.util.Collection;
import java.util.function.Predicate;
import java.util.stream.Stream;
-import static org.zwobble.couscous.util.ExtraStreams.concatStreams;
-
public class NodeStructure {
public static Stream<? extends Node> descendantNodesAndSelf(Node node, Predicate<Node> predicate) {
return Stream.concat(Stream.of(node), descendantNodes(node, predicate));
@@ -29,180 +26,6 @@ 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) {
- return Stream.empty();
- }
-
- @Override
- public Stream<Node> visit(VariableReferenceNode variableReference) {
- return Stream.empty();
- }
-
- @Override
- public Stream<Node> visit(ThisReferenceNode reference) {
- return Stream.empty();
- }
-
- @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());
- }
-
- @Override
- public Stream<Node> visit(TernaryConditionalNode ternaryConditional) {
- return Stream.of(
- ternaryConditional.getCondition(),
- ternaryConditional.getIfTrue(),
- ternaryConditional.getIfFalse());
- }
-
- @Override
- public Stream<Node> visit(MethodCallNode methodCall) {
- return Stream.concat(
- Stream.of(methodCall.getReceiver()),
- methodCall.getArguments().stream());
- }
-
- @Override
- public Stream<? extends ExpressionNode> visit(ConstructorCallNode call) {
- return call.getArguments().stream();
- }
-
- @Override
- public Stream<? extends Node> visit(OperationNode operation) {
- return operation.getArguments().stream();
- }
-
- @Override
- public Stream<? extends Node> visit(InstanceOfNode instanceOf) {
- return Stream.of(instanceOf.getLeft());
- }
-
- @Override
- public Stream<Node> visit(FieldAccessNode fieldAccess) {
- return Stream.of(fieldAccess.getLeft());
- }
-
- @Override
- public Stream<? extends Node> visit(TypeCoercionNode typeCoercion) {
- return Stream.of(typeCoercion.getExpression());
- }
-
- @Override
- public Stream<? extends Node> visit(CastNode cast) {
- return Stream.of(cast.getExpression());
- }
-
- @Override
- public Stream<? extends Node> visit(InstanceReceiver receiver) {
- return Stream.of(receiver.getExpression());
- }
-
- @Override
- public Stream<? extends Node> visit(StaticReceiver receiver) {
- return Stream.empty();
- }
-
- @Override
- public Stream<Node> visit(ReturnNode returnNode) {
- return Stream.of(returnNode.getValue());
- }
-
- @Override
- public Stream<? extends Node> visit(ThrowNode throwNode) {
- return Stream.of(throwNode.getValue());
- }
-
- @Override
- public Stream<Node> visit(ExpressionStatementNode expressionStatement) {
- return Stream.of(expressionStatement.getExpression());
- }
-
- @Override
- public Stream<Node> visit(LocalVariableDeclarationNode localVariableDeclaration) {
- return Stream.of(localVariableDeclaration.getInitialValue());
- }
-
- @Override
- public Stream<Node> visit(IfStatementNode ifStatement) {
- return concatStreams(
- Stream.of(ifStatement.getCondition()),
- ifStatement.getTrueBranch().stream(),
- ifStatement.getFalseBranch().stream());
- }
-
- @Override
- public Stream<Node> visit(WhileNode whileLoop) {
- return Stream.concat(
- Stream.of(whileLoop.getCondition()),
- whileLoop.getBody().stream());
- }
-
- @Override
- public Stream<? extends Node> visit(TryNode tryStatement) {
- return Stream.concat(
- tryStatement.getBody().stream(),
- tryStatement.getExceptionHandlers().stream().flatMap(handler -> handler.getBody().stream()));
- }
-
- @Override
- public Stream<? extends Node> visit(FormalTypeParameterNode parameter) {
- return Stream.empty();
- }
-
- @Override
- public Stream<? extends Node> visit(FormalArgumentNode formalArgumentNode) {
- return Stream.empty();
- }
-
- @Override
- public Stream<? extends Node> visit(AnnotationNode annotation) {
- return Stream.empty();
- }
-
- @Override
- public Stream<Node> visit(ClassNode classNode) {
- return concatStreams(
- Stream.of(classNode.getConstructor()),
- classNode.getFields().stream(),
- classNode.getMethods().stream());
- }
-
- @Override
- public Stream<? extends Node> visit(InterfaceNode interfaceNode) {
- return interfaceNode.getMethods().stream();
- }
-
- @Override
- public Stream<? extends Node> visit(EnumNode enumNode) {
- return Stream.empty();
- }
-
- @Override
- public Stream<Node> visit(MethodNode methodNode) {
- return concatStreams(
- methodNode.getAnnotations().stream(),
- methodNode.getArguments().stream(),
- methodNode.getBody().map(Collection::stream).orElse(Stream.empty()));
- }
-
- @Override
- public Stream<Node> visit(ConstructorNode constructorNode) {
- return Stream.concat(constructorNode.getArguments().stream(), constructorNode.getBody().stream());
- }
-
- @Override
- public Stream<? extends Node> visit(FieldDeclarationNode declaration) {
- return Stream.empty();
- }
- });
+ return ExtraIterables.stream(node.childNodes());
}
}