From c7b0410af60f4267264a875a80cfda2d45381bb3 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sun, 31 Jul 2016 19:33:48 +0100 Subject: Extract common code for building desugar statement transformers --- .../couscous/transforms/DesugarForEachToFor.java | 11 +---------- .../couscous/transforms/DesugarForToWhile.java | 15 ++------------- .../couscous/transforms/DesugarStatement.java | 22 ++++++++++++++++++++++ .../couscous/transforms/DesugarSwitchToIfElse.java | 11 +---------- 4 files changed, 26 insertions(+), 33 deletions(-) create mode 100644 src/main/java/org/zwobble/couscous/transforms/DesugarStatement.java diff --git a/src/main/java/org/zwobble/couscous/transforms/DesugarForEachToFor.java b/src/main/java/org/zwobble/couscous/transforms/DesugarForEachToFor.java index bdae29a..3b95c43 100644 --- a/src/main/java/org/zwobble/couscous/transforms/DesugarForEachToFor.java +++ b/src/main/java/org/zwobble/couscous/transforms/DesugarForEachToFor.java @@ -8,7 +8,6 @@ import org.zwobble.couscous.types.Type; import org.zwobble.couscous.types.Types; import java.util.List; -import java.util.Optional; import static org.zwobble.couscous.ast.LocalVariableDeclarationNode.localVariableDeclaration; import static org.zwobble.couscous.ast.MethodCallNode.methodCall; @@ -20,15 +19,7 @@ import static org.zwobble.couscous.util.ExtraLists.list; public class DesugarForEachToFor { public static NodeTransformer transformer() { Scope scope = Scope.create().temporaryPrefix("_couscous_desugar_foreach_to_for"); - return NodeTransformer.builder() - .transformStatement(statement -> { - if (statement.type() == NodeTypes.FOR_EACH) { - return Optional.of(desugar(scope, ((ForEachNode) statement))); - } else { - return Optional.empty(); - } - }) - .build(); + return DesugarStatement.transformer(NodeTypes.FOR_EACH, node -> desugar(scope, node)); } public static List desugar(Scope scope, ForEachNode forEach) { diff --git a/src/main/java/org/zwobble/couscous/transforms/DesugarForToWhile.java b/src/main/java/org/zwobble/couscous/transforms/DesugarForToWhile.java index 68b961c..3bd0d32 100644 --- a/src/main/java/org/zwobble/couscous/transforms/DesugarForToWhile.java +++ b/src/main/java/org/zwobble/couscous/transforms/DesugarForToWhile.java @@ -7,26 +7,15 @@ import org.zwobble.couscous.ast.StatementNode; import org.zwobble.couscous.ast.visitors.NodeTransformer; import java.util.List; -import java.util.Optional; import static org.zwobble.couscous.ast.ExpressionStatementNode.expressionStatement; import static org.zwobble.couscous.ast.WhileNode.whileLoop; import static org.zwobble.couscous.util.ExtraIterables.lazyMap; -import static org.zwobble.couscous.util.ExtraLists.append; -import static org.zwobble.couscous.util.ExtraLists.concat; -import static org.zwobble.couscous.util.ExtraLists.list; +import static org.zwobble.couscous.util.ExtraLists.*; public class DesugarForToWhile { public static NodeTransformer transformer() { - return NodeTransformer.builder() - .transformStatement(statement -> { - if (statement.type() == NodeTypes.FOR) { - return Optional.of(desugar(((ForNode) statement))); - } else { - return Optional.empty(); - } - }) - .build(); + return DesugarStatement.transformer(NodeTypes.FOR, DesugarForToWhile::desugar); } public static List desugar(ForNode forNode) { diff --git a/src/main/java/org/zwobble/couscous/transforms/DesugarStatement.java b/src/main/java/org/zwobble/couscous/transforms/DesugarStatement.java new file mode 100644 index 0000000..700b31b --- /dev/null +++ b/src/main/java/org/zwobble/couscous/transforms/DesugarStatement.java @@ -0,0 +1,22 @@ +package org.zwobble.couscous.transforms; + +import org.zwobble.couscous.ast.StatementNode; +import org.zwobble.couscous.ast.visitors.NodeTransformer; + +import java.util.List; +import java.util.Optional; +import java.util.function.Function; + +class DesugarStatement { + static NodeTransformer transformer(int nodeType, Function> desugar) { + return NodeTransformer.builder() + .transformStatement(statement -> { + if (statement.type() == nodeType) { + return Optional.of(desugar.apply((T) statement)); + } else { + return Optional.empty(); + } + }) + .build(); + } +} diff --git a/src/main/java/org/zwobble/couscous/transforms/DesugarSwitchToIfElse.java b/src/main/java/org/zwobble/couscous/transforms/DesugarSwitchToIfElse.java index 5ecd25d..006a7c9 100644 --- a/src/main/java/org/zwobble/couscous/transforms/DesugarSwitchToIfElse.java +++ b/src/main/java/org/zwobble/couscous/transforms/DesugarSwitchToIfElse.java @@ -11,7 +11,6 @@ import org.zwobble.couscous.types.Types; import org.zwobble.couscous.util.ExtraLists; import java.util.List; -import java.util.Optional; import static com.google.common.collect.Iterables.tryFind; import static org.zwobble.couscous.ast.IfStatementNode.ifStatement; @@ -30,15 +29,7 @@ public class DesugarSwitchToIfElse { public static NodeTransformer transformer() { Scope scope = Scope.create().temporaryPrefix("_couscous_desugar_switch_to_if"); - return NodeTransformer.builder() - .transformStatement(statement -> { - if (statement.type() == NodeTypes.SWITCH) { - return Optional.of(desugar(scope, ((SwitchNode) statement))); - } else { - return Optional.empty(); - } - }) - .build(); + return DesugarStatement.transformer(NodeTypes.SWITCH, node -> desugar(scope, node)); } public static List desugar(Scope scope, SwitchNode switchNode) { -- cgit v1.2.3