From 38c95d6f76efde8b14a93e3a31d28c5d56bfb638 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sun, 10 Jul 2016 18:10:01 +0100 Subject: Move childNodes onto Node interface --- .../org/zwobble/couscous/ast/AnnotationNode.java | 6 + .../java/org/zwobble/couscous/ast/ArrayNode.java | 5 + .../org/zwobble/couscous/ast/AssignmentNode.java | 6 + .../java/org/zwobble/couscous/ast/CastNode.java | 6 + .../java/org/zwobble/couscous/ast/ClassNode.java | 15 +- .../zwobble/couscous/ast/ConstructorCallNode.java | 5 + .../org/zwobble/couscous/ast/ConstructorNode.java | 6 + .../java/org/zwobble/couscous/ast/EnumNode.java | 6 + .../couscous/ast/ExpressionStatementNode.java | 6 + .../org/zwobble/couscous/ast/FieldAccessNode.java | 6 + .../zwobble/couscous/ast/FieldDeclarationNode.java | 6 + .../zwobble/couscous/ast/FormalArgumentNode.java | 6 + .../couscous/ast/FormalTypeParameterNode.java | 6 + .../org/zwobble/couscous/ast/IfStatementNode.java | 7 + .../org/zwobble/couscous/ast/InstanceOfNode.java | 6 + .../org/zwobble/couscous/ast/InstanceReceiver.java | 6 + .../org/zwobble/couscous/ast/InterfaceNode.java | 5 + .../java/org/zwobble/couscous/ast/LiteralNode.java | 6 + .../couscous/ast/LocalVariableDeclarationNode.java | 6 + .../org/zwobble/couscous/ast/MethodCallNode.java | 6 + .../java/org/zwobble/couscous/ast/MethodNode.java | 10 ++ src/main/java/org/zwobble/couscous/ast/Node.java | 2 + .../org/zwobble/couscous/ast/OperationNode.java | 5 + .../java/org/zwobble/couscous/ast/ReturnNode.java | 6 + .../org/zwobble/couscous/ast/StaticReceiver.java | 6 + .../couscous/ast/TernaryConditionalNode.java | 6 + .../zwobble/couscous/ast/ThisReferenceNode.java | 6 + .../java/org/zwobble/couscous/ast/ThrowNode.java | 6 + .../java/org/zwobble/couscous/ast/TryNode.java | 11 ++ .../org/zwobble/couscous/ast/TypeCoercionNode.java | 6 + .../couscous/ast/VariableReferenceNode.java | 6 + .../java/org/zwobble/couscous/ast/WhileNode.java | 6 + .../couscous/ast/structure/NodeStructure.java | 183 +-------------------- .../org/zwobble/couscous/util/ExtraIterables.java | 19 ++- 34 files changed, 222 insertions(+), 183 deletions(-) (limited to 'src/main/java') 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 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 @@ -38,6 +38,11 @@ public class ArrayNode implements ExpressionNode { return visitor.visit(this); } + @Override + public Iterable childNodes() { + return elements; + } + @Override public ExpressionNode transform(NodeTransformer transformer) { return new ArrayNode( 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; @@ -45,6 +46,11 @@ public class AssignmentNode implements ExpressionNode { return visitor.visit(this); } + @Override + public Iterable childNodes() { + return ExtraIterables.of(value, target); + } + @Override public ExpressionNode transform(NodeTransformer transformer) { return new AssignmentNode( 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) { @@ -31,6 +32,11 @@ public class CastNode implements ExpressionNode { return visitor.visit(this); } + @Override + public Iterable 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; @@ -95,6 +97,15 @@ public class ClassNode implements TypeNode { return visitor.visit(this); } + @Override + public Iterable childNodes() { + return Iterables.concat( + ExtraIterables.of(constructor), + fields, + methods + ); + } + @Override public ClassNode transform(NodeTransformer transformer) { return new ClassNode( 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 @@ -39,6 +39,11 @@ public class ConstructorCallNode implements ExpressionNode { return visitor.visit(this); } + @Override + public Iterable childNodes() { + return arguments; + } + @Override public ExpressionNode transform(NodeTransformer transformer) { return new ConstructorCallNode( 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 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; @@ -49,6 +50,11 @@ public class EnumNode implements TypeNode { return list(); } + @Override + public Iterable childNodes() { + return ExtraIterables.empty(); + } + @Override public TypeNode transform(NodeTransformer transformer) { return new EnumNode( 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) { @@ -23,6 +24,11 @@ public class ExpressionStatementNode implements StatementNode { return visitor.visit(this); } + @Override + public Iterable 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; @@ -65,6 +66,11 @@ public class FieldAccessNode implements AssignableExpressionNode { return visitor.visit(this); } + @Override + public Iterable childNodes() { + return ExtraIterables.of(left); + } + @Override public ExpressionNode transform(NodeTransformer transformer) { return new FieldAccessNode( 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 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 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 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; @@ -43,6 +45,11 @@ public class IfStatementNode implements StatementNode { return visitor.visit(this); } + @Override + public Iterable childNodes() { + return Iterables.concat(ExtraIterables.of(condition), trueBranch, falseBranch); + } + @Override public StatementNode transform(NodeTransformer transformer) { return new IfStatementNode( 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; @@ -33,6 +34,11 @@ public class InstanceOfNode implements ExpressionNode { return visitor.visit(this); } + @Override + public Iterable childNodes() { + return ExtraIterables.of(left); + } + @Override public ExpressionNode transform(NodeTransformer transformer) { return new InstanceOfNode( 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) { @@ -23,6 +24,11 @@ public class InstanceReceiver implements Receiver { return visitor.visit(expression); } + @Override + public Iterable 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 @@ -70,6 +70,11 @@ public class InterfaceNode implements TypeNode { ')'; } + @Override + public Iterable childNodes() { + return methods; + } + @Override public InterfaceNode transform(NodeTransformer transformer) { return new InterfaceNode( 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; @@ -58,6 +59,11 @@ public class LiteralNode implements ExpressionNode { return visitor.visit(this); } + @Override + public Iterable 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; @@ -54,6 +55,11 @@ public class LocalVariableDeclarationNode implements VariableNode, StatementNode return visitor.visit(this); } + @Override + public Iterable childNodes() { + return ExtraIterables.of(initialValue); + } + @Override public StatementNode transform(NodeTransformer transformer) { return new LocalVariableDeclarationNode( 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; @@ -158,6 +159,11 @@ public class MethodCallNode implements ExpressionNode { return visitor.visit(this); } + @Override + public Iterable childNodes() { + return ExtraIterables.lazyCons(receiver, arguments); + } + @Override public ExpressionNode transform(NodeTransformer transformer) { return new MethodCallNode( 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 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 childNodes(); + default void accept(NodeVisitor visitor) { accept(new NodeMapper() { @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 @@ -51,6 +51,11 @@ public class OperationNode implements ExpressionNode { return visitor.visit(this); } + @Override + public Iterable childNodes() { + return arguments; + } + @Override public ExpressionNode transform(NodeTransformer transformer) { return new OperationNode( 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) { @@ -23,6 +24,11 @@ public class ReturnNode implements StatementNode { return visitor.visit(this); } + @Override + public Iterable 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) { @@ -33,6 +34,11 @@ public class StaticReceiver implements Receiver { return visitor.visit(this); } + @Override + public Iterable 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( @@ -42,6 +43,11 @@ public class TernaryConditionalNode implements ExpressionNode { return visitor.visit(this); } + @Override + public Iterable childNodes() { + return ExtraIterables.of(condition, ifTrue, ifFalse); + } + @Override public ExpressionNode transform(NodeTransformer transformer) { return new TernaryConditionalNode( 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) { @@ -29,6 +30,11 @@ public class ThisReferenceNode implements ExpressionNode, ReferenceNode { return visitor.visit(this); } + @Override + public Iterable 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) { @@ -23,6 +24,11 @@ public class ThrowNode implements StatementNode { return visitor.visit(this); } + @Override + public Iterable 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 { @@ -47,6 +49,15 @@ public class TryNode implements StatementNode { return visitor.visit(this); } + @Override + public Iterable childNodes() { + return Iterables.concat( + body, + lazyFlatMap(exceptionHandlers, handler -> handler.getBody()), + finallyBody + ); + } + @Override public StatementNode transform(NodeTransformer transformer) { return new TryNode( 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; @@ -41,6 +42,11 @@ public class TypeCoercionNode implements ExpressionNode { return visitor.visit(this); } + @Override + public Iterable childNodes() { + return ExtraIterables.of(expression); + } + @Override public ExpressionNode transform(NodeTransformer transformer) { return new TypeCoercionNode( 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) { @@ -49,6 +50,11 @@ public class VariableReferenceNode implements AssignableExpressionNode, Referenc return visitor.visit(this); } + @Override + public Iterable 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; @@ -32,6 +33,11 @@ public class WhileNode implements StatementNode { return visitor.visit(this); } + @Override + public Iterable childNodes() { + return ExtraIterables.lazyCons(condition, body); + } + @Override public StatementNode transform(NodeTransformer transformer) { return new WhileNode( 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 descendantNodesAndSelf(Node node, Predicate predicate) { return Stream.concat(Stream.of(node), descendantNodes(node, predicate)); @@ -29,180 +26,6 @@ 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) { - return Stream.empty(); - } - - @Override - public Stream visit(VariableReferenceNode variableReference) { - return Stream.empty(); - } - - @Override - public Stream visit(ThisReferenceNode reference) { - return Stream.empty(); - } - - @Override - public Stream visit(ArrayNode array) { - return array.getElements().stream(); - } - - @Override - public Stream visit(AssignmentNode assignment) { - return Stream.of(assignment.getValue(), assignment.getTarget()); - } - - @Override - public Stream visit(TernaryConditionalNode ternaryConditional) { - return Stream.of( - ternaryConditional.getCondition(), - ternaryConditional.getIfTrue(), - ternaryConditional.getIfFalse()); - } - - @Override - public Stream visit(MethodCallNode methodCall) { - return Stream.concat( - Stream.of(methodCall.getReceiver()), - methodCall.getArguments().stream()); - } - - @Override - public Stream visit(ConstructorCallNode call) { - return call.getArguments().stream(); - } - - @Override - public Stream visit(OperationNode operation) { - return operation.getArguments().stream(); - } - - @Override - public Stream visit(InstanceOfNode instanceOf) { - return Stream.of(instanceOf.getLeft()); - } - - @Override - public Stream visit(FieldAccessNode fieldAccess) { - return Stream.of(fieldAccess.getLeft()); - } - - @Override - public Stream visit(TypeCoercionNode typeCoercion) { - return Stream.of(typeCoercion.getExpression()); - } - - @Override - public Stream visit(CastNode cast) { - return Stream.of(cast.getExpression()); - } - - @Override - public Stream visit(InstanceReceiver receiver) { - return Stream.of(receiver.getExpression()); - } - - @Override - public Stream visit(StaticReceiver receiver) { - return Stream.empty(); - } - - @Override - public Stream visit(ReturnNode returnNode) { - return Stream.of(returnNode.getValue()); - } - - @Override - public Stream visit(ThrowNode throwNode) { - return Stream.of(throwNode.getValue()); - } - - @Override - public Stream visit(ExpressionStatementNode expressionStatement) { - return Stream.of(expressionStatement.getExpression()); - } - - @Override - public Stream visit(LocalVariableDeclarationNode localVariableDeclaration) { - return Stream.of(localVariableDeclaration.getInitialValue()); - } - - @Override - public Stream visit(IfStatementNode ifStatement) { - return concatStreams( - Stream.of(ifStatement.getCondition()), - ifStatement.getTrueBranch().stream(), - ifStatement.getFalseBranch().stream()); - } - - @Override - public Stream visit(WhileNode whileLoop) { - return Stream.concat( - Stream.of(whileLoop.getCondition()), - whileLoop.getBody().stream()); - } - - @Override - public Stream visit(TryNode tryStatement) { - return Stream.concat( - tryStatement.getBody().stream(), - tryStatement.getExceptionHandlers().stream().flatMap(handler -> handler.getBody().stream())); - } - - @Override - public Stream visit(FormalTypeParameterNode parameter) { - return Stream.empty(); - } - - @Override - public Stream visit(FormalArgumentNode formalArgumentNode) { - return Stream.empty(); - } - - @Override - public Stream visit(AnnotationNode annotation) { - return Stream.empty(); - } - - @Override - public Stream visit(ClassNode classNode) { - return concatStreams( - Stream.of(classNode.getConstructor()), - classNode.getFields().stream(), - classNode.getMethods().stream()); - } - - @Override - public Stream visit(InterfaceNode interfaceNode) { - return interfaceNode.getMethods().stream(); - } - - @Override - public Stream visit(EnumNode enumNode) { - return Stream.empty(); - } - - @Override - public Stream visit(MethodNode methodNode) { - return concatStreams( - methodNode.getAnnotations().stream(), - methodNode.getArguments().stream(), - methodNode.getBody().map(Collection::stream).orElse(Stream.empty())); - } - - @Override - public Stream visit(ConstructorNode constructorNode) { - return Stream.concat(constructorNode.getArguments().stream(), constructorNode.getBody().stream()); - } - - @Override - public Stream visit(FieldDeclarationNode declaration) { - return Stream.empty(); - } - }); + return ExtraIterables.stream(node.childNodes()); } } diff --git a/src/main/java/org/zwobble/couscous/util/ExtraIterables.java b/src/main/java/org/zwobble/couscous/util/ExtraIterables.java index 4b8b802..a0c4593 100644 --- a/src/main/java/org/zwobble/couscous/util/ExtraIterables.java +++ b/src/main/java/org/zwobble/couscous/util/ExtraIterables.java @@ -1,5 +1,6 @@ package org.zwobble.couscous.util; +import com.google.common.collect.ImmutableList; import com.google.common.collect.Iterables; import java.util.Iterator; @@ -82,7 +83,7 @@ public class ExtraIterables { return Iterables.concat(head, list(tail)); } - public static Iterable lazyCons(T head, Iterable tails) { + public static Iterable lazyCons(T head, Iterable tails) { return Iterables.concat(list(head), tails); } @@ -134,4 +135,20 @@ public class ExtraIterables { } }; } + + public static Iterable empty() { + return ImmutableList.of(); + } + + public static Iterable of(T e1) { + return ImmutableList.of(e1); + } + + public static Iterable of(T e1, T e2) { + return ImmutableList.of(e1, e2); + } + + public static Iterable of(T e1, T e2, T e3) { + return ImmutableList.of(e1, e2, e3); + } } -- cgit v1.2.3