From 921de028319d06253bc2a73302e8f4ee51bc7ca0 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sun, 17 Jan 2016 18:09:32 +0000 Subject: Implement replaceExpressions using NodeTransformer --- src/main/java/org/zwobble/couscous/ast/AssignmentNode.java | 8 -------- src/main/java/org/zwobble/couscous/ast/CastNode.java | 6 ------ .../java/org/zwobble/couscous/ast/ConstructorCallNode.java | 7 ------- src/main/java/org/zwobble/couscous/ast/ExpressionNode.java | 12 +++++++++++- src/main/java/org/zwobble/couscous/ast/FieldAccessNode.java | 6 ------ src/main/java/org/zwobble/couscous/ast/LiteralNode.java | 6 ------ src/main/java/org/zwobble/couscous/ast/MethodCallNode.java | 9 --------- .../org/zwobble/couscous/ast/TernaryConditionalNode.java | 9 --------- .../java/org/zwobble/couscous/ast/ThisReferenceNode.java | 8 +------- src/main/java/org/zwobble/couscous/ast/TypeCoercionNode.java | 6 ------ .../java/org/zwobble/couscous/ast/VariableReferenceNode.java | 8 +------- .../org/zwobble/couscous/ast/visitors/NodeTransformer.java | 2 ++ 12 files changed, 15 insertions(+), 72 deletions(-) (limited to 'src/main/java/org/zwobble') diff --git a/src/main/java/org/zwobble/couscous/ast/AssignmentNode.java b/src/main/java/org/zwobble/couscous/ast/AssignmentNode.java index dd1a9f3..b027399 100644 --- a/src/main/java/org/zwobble/couscous/ast/AssignmentNode.java +++ b/src/main/java/org/zwobble/couscous/ast/AssignmentNode.java @@ -3,8 +3,6 @@ package org.zwobble.couscous.ast; import org.zwobble.couscous.ast.visitors.ExpressionNodeMapper; import org.zwobble.couscous.ast.visitors.NodeTransformer; -import java.util.function.Function; - import static org.zwobble.couscous.ast.ExpressionStatementNode.expressionStatement; import static org.zwobble.couscous.ast.VariableReferenceNode.reference; @@ -47,12 +45,6 @@ public class AssignmentNode implements ExpressionNode { } @Override - public ExpressionNode replaceExpressions(Function replace) { - return new AssignmentNode( - (AssignableExpressionNode) replace.apply(target), - replace.apply(value)); - } - public ExpressionNode transform(NodeTransformer transformer) { return new AssignmentNode( (AssignableExpressionNode) transformer.visit(target), diff --git a/src/main/java/org/zwobble/couscous/ast/CastNode.java b/src/main/java/org/zwobble/couscous/ast/CastNode.java index 1f61941..858779e 100644 --- a/src/main/java/org/zwobble/couscous/ast/CastNode.java +++ b/src/main/java/org/zwobble/couscous/ast/CastNode.java @@ -3,8 +3,6 @@ package org.zwobble.couscous.ast; import org.zwobble.couscous.ast.visitors.ExpressionNodeMapper; import org.zwobble.couscous.ast.visitors.NodeTransformer; -import java.util.function.Function; - public class CastNode implements ExpressionNode { public static ExpressionNode cast(ExpressionNode expression, TypeName type) { return new CastNode(expression, type); @@ -33,10 +31,6 @@ public class CastNode implements ExpressionNode { } @Override - public ExpressionNode replaceExpressions(Function replace) { - return new CastNode(replace.apply(expression), type); - } - public ExpressionNode transform(NodeTransformer transformer) { return new CastNode(transformer.visit(expression), transformer.transform(type)); } diff --git a/src/main/java/org/zwobble/couscous/ast/ConstructorCallNode.java b/src/main/java/org/zwobble/couscous/ast/ConstructorCallNode.java index ecbdc00..b5439bf 100644 --- a/src/main/java/org/zwobble/couscous/ast/ConstructorCallNode.java +++ b/src/main/java/org/zwobble/couscous/ast/ConstructorCallNode.java @@ -4,9 +4,6 @@ import org.zwobble.couscous.ast.visitors.ExpressionNodeMapper; import org.zwobble.couscous.ast.visitors.NodeTransformer; import java.util.List; -import java.util.function.Function; - -import static org.zwobble.couscous.util.ExtraLists.eagerMap; public class ConstructorCallNode implements ExpressionNode { public static ConstructorCallNode constructorCall( @@ -40,10 +37,6 @@ public class ConstructorCallNode implements ExpressionNode { } @Override - public ExpressionNode replaceExpressions(Function replace) { - return new ConstructorCallNode(type, eagerMap(arguments, replace::apply)); - } - public ExpressionNode transform(NodeTransformer transformer) { return new ConstructorCallNode( transformer.transform(type), diff --git a/src/main/java/org/zwobble/couscous/ast/ExpressionNode.java b/src/main/java/org/zwobble/couscous/ast/ExpressionNode.java index d07b485..79a0cd9 100644 --- a/src/main/java/org/zwobble/couscous/ast/ExpressionNode.java +++ b/src/main/java/org/zwobble/couscous/ast/ExpressionNode.java @@ -2,6 +2,7 @@ package org.zwobble.couscous.ast; import org.zwobble.couscous.ast.visitors.ExpressionNodeMapper; import org.zwobble.couscous.ast.visitors.NodeMapper; +import org.zwobble.couscous.ast.visitors.NodeTransformer; import java.util.function.Function; @@ -64,5 +65,14 @@ public interface ExpressionNode extends Node { }); } - ExpressionNode replaceExpressions(Function replace); + ExpressionNode transform(NodeTransformer transformer); + + default ExpressionNode replaceExpressions(Function replace) { + return transform(new NodeTransformer() { + @Override + public ExpressionNode visit(ExpressionNode value) { + return replace.apply(value); + } + }); + } } diff --git a/src/main/java/org/zwobble/couscous/ast/FieldAccessNode.java b/src/main/java/org/zwobble/couscous/ast/FieldAccessNode.java index 3224b5d..6d88d28 100644 --- a/src/main/java/org/zwobble/couscous/ast/FieldAccessNode.java +++ b/src/main/java/org/zwobble/couscous/ast/FieldAccessNode.java @@ -4,8 +4,6 @@ import org.zwobble.couscous.ast.visitors.AssignableExpressionNodeVisitor; import org.zwobble.couscous.ast.visitors.ExpressionNodeMapper; import org.zwobble.couscous.ast.visitors.NodeTransformer; -import java.util.function.Function; - public class FieldAccessNode implements AssignableExpressionNode { public static FieldAccessNode fieldAccess( ExpressionNode left, @@ -45,10 +43,6 @@ public class FieldAccessNode implements AssignableExpressionNode { } @Override - public ExpressionNode replaceExpressions(Function replace) { - return new FieldAccessNode(replace.apply(left), fieldName, type); - } - public ExpressionNode transform(NodeTransformer transformer) { return new FieldAccessNode( transformer.visit(left), diff --git a/src/main/java/org/zwobble/couscous/ast/LiteralNode.java b/src/main/java/org/zwobble/couscous/ast/LiteralNode.java index 5753650..923bb2f 100644 --- a/src/main/java/org/zwobble/couscous/ast/LiteralNode.java +++ b/src/main/java/org/zwobble/couscous/ast/LiteralNode.java @@ -4,8 +4,6 @@ import org.zwobble.couscous.ast.visitors.ExpressionNodeMapper; import org.zwobble.couscous.ast.visitors.NodeTransformer; import org.zwobble.couscous.values.*; -import java.util.function.Function; - import static org.zwobble.couscous.values.PrimitiveValues.value; public class LiteralNode implements ExpressionNode { @@ -55,10 +53,6 @@ public class LiteralNode implements ExpressionNode { } @Override - public ExpressionNode replaceExpressions(Function replace) { - return this; - } - public ExpressionNode transform(NodeTransformer transformer) { return new LiteralNode(transformValue(transformer), transformer.transform(type)); } diff --git a/src/main/java/org/zwobble/couscous/ast/MethodCallNode.java b/src/main/java/org/zwobble/couscous/ast/MethodCallNode.java index 5a67bc2..b622d24 100644 --- a/src/main/java/org/zwobble/couscous/ast/MethodCallNode.java +++ b/src/main/java/org/zwobble/couscous/ast/MethodCallNode.java @@ -4,7 +4,6 @@ import org.zwobble.couscous.ast.visitors.ExpressionNodeMapper; import org.zwobble.couscous.ast.visitors.NodeTransformer; import java.util.List; -import java.util.function.Function; import static org.zwobble.couscous.ast.InstanceReceiver.instanceReceiver; import static org.zwobble.couscous.ast.StaticReceiver.staticReceiver; @@ -88,14 +87,6 @@ public class MethodCallNode implements ExpressionNode { } @Override - public ExpressionNode replaceExpressions(Function replace) { - return new MethodCallNode( - receiver.replaceExpressions(replace), - methodName, - eagerMap(arguments, replace::apply), - type); - } - public ExpressionNode transform(NodeTransformer transformer) { return new MethodCallNode( transformer.visit(receiver), diff --git a/src/main/java/org/zwobble/couscous/ast/TernaryConditionalNode.java b/src/main/java/org/zwobble/couscous/ast/TernaryConditionalNode.java index c49bbc5..6364e94 100644 --- a/src/main/java/org/zwobble/couscous/ast/TernaryConditionalNode.java +++ b/src/main/java/org/zwobble/couscous/ast/TernaryConditionalNode.java @@ -3,8 +3,6 @@ package org.zwobble.couscous.ast; import org.zwobble.couscous.ast.visitors.ExpressionNodeMapper; import org.zwobble.couscous.ast.visitors.NodeTransformer; -import java.util.function.Function; - public class TernaryConditionalNode implements ExpressionNode { public static TernaryConditionalNode ternaryConditional( ExpressionNode condition, @@ -44,13 +42,6 @@ public class TernaryConditionalNode implements ExpressionNode { } @Override - public ExpressionNode replaceExpressions(Function replace) { - return new TernaryConditionalNode( - replace.apply(condition), - replace.apply(ifTrue), - replace.apply(ifFalse)); - } - public ExpressionNode transform(NodeTransformer transformer) { return new TernaryConditionalNode( transformer.visit(condition), diff --git a/src/main/java/org/zwobble/couscous/ast/ThisReferenceNode.java b/src/main/java/org/zwobble/couscous/ast/ThisReferenceNode.java index 6056abd..ebc2d8d 100644 --- a/src/main/java/org/zwobble/couscous/ast/ThisReferenceNode.java +++ b/src/main/java/org/zwobble/couscous/ast/ThisReferenceNode.java @@ -3,8 +3,6 @@ package org.zwobble.couscous.ast; import org.zwobble.couscous.ast.visitors.ExpressionNodeMapper; import org.zwobble.couscous.ast.visitors.NodeTransformer; -import java.util.function.Function; - public class ThisReferenceNode implements ExpressionNode, ReferenceNode { public static ThisReferenceNode thisReference(TypeName type) { return new ThisReferenceNode(type); @@ -25,16 +23,12 @@ public class ThisReferenceNode implements ExpressionNode, ReferenceNode { return visitor.visit(this); } - @Override - public ExpressionNode replaceExpressions(Function replace) { - return this; - } - @Override public T accept(Visitor visitor) { return visitor.visit(this); } + @Override public ExpressionNode transform(NodeTransformer transformer) { return new ThisReferenceNode(transformer.transform(type)); } diff --git a/src/main/java/org/zwobble/couscous/ast/TypeCoercionNode.java b/src/main/java/org/zwobble/couscous/ast/TypeCoercionNode.java index 04ba7d1..db58deb 100644 --- a/src/main/java/org/zwobble/couscous/ast/TypeCoercionNode.java +++ b/src/main/java/org/zwobble/couscous/ast/TypeCoercionNode.java @@ -3,8 +3,6 @@ package org.zwobble.couscous.ast; import org.zwobble.couscous.ast.visitors.ExpressionNodeMapper; import org.zwobble.couscous.ast.visitors.NodeTransformer; -import java.util.function.Function; - public class TypeCoercionNode implements ExpressionNode { public static TypeCoercionNode typeCoercion(ExpressionNode expression, TypeName type) { return new TypeCoercionNode(expression, type); @@ -33,10 +31,6 @@ public class TypeCoercionNode implements ExpressionNode { } @Override - public ExpressionNode replaceExpressions(Function replace) { - return new TypeCoercionNode(replace.apply(expression), type); - } - public ExpressionNode transform(NodeTransformer transformer) { return new TypeCoercionNode( transformer.visit(expression), diff --git a/src/main/java/org/zwobble/couscous/ast/VariableReferenceNode.java b/src/main/java/org/zwobble/couscous/ast/VariableReferenceNode.java index b907c6d..f9800a5 100644 --- a/src/main/java/org/zwobble/couscous/ast/VariableReferenceNode.java +++ b/src/main/java/org/zwobble/couscous/ast/VariableReferenceNode.java @@ -5,8 +5,6 @@ import org.zwobble.couscous.ast.visitors.AssignableExpressionNodeVisitor; import org.zwobble.couscous.ast.visitors.ExpressionNodeMapper; import org.zwobble.couscous.ast.visitors.NodeTransformer; -import java.util.function.Function; - public class VariableReferenceNode implements AssignableExpressionNode, ReferenceNode { public static VariableReferenceNode reference(VariableNode variable) { return new VariableReferenceNode(variable.getDeclaration()); @@ -31,11 +29,6 @@ public class VariableReferenceNode implements AssignableExpressionNode, Referenc return visitor.visit(this); } - @Override - public ExpressionNode replaceExpressions(Function replace) { - return this; - } - public Identifier getReferentId() { return referent.getId(); } @@ -55,6 +48,7 @@ public class VariableReferenceNode implements AssignableExpressionNode, Referenc return visitor.visit(this); } + @Override public ExpressionNode transform(NodeTransformer transformer) { return new VariableReferenceNode(transformer.transform(referent)); } 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 539acd0..2b68afc 100644 --- a/src/main/java/org/zwobble/couscous/ast/visitors/NodeTransformer.java +++ b/src/main/java/org/zwobble/couscous/ast/visitors/NodeTransformer.java @@ -11,6 +11,8 @@ import java.util.Set; public class NodeTransformer implements ExpressionNodeMapper, StatementNodeMapper, NodeMapper { // TODO: tidy up transform vs visit + // TODO: don't expose specific statement/expression visit methods + // (require passing through visit(ExpressionNode) and visit(StatementNode) for callers public TypeName transform(TypeName type) { return type; } -- cgit v1.2.3