diff options
Diffstat (limited to 'src/main/java/org/zwobble/couscous/transforms')
4 files changed, 26 insertions, 33 deletions
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.<ForEachNode>transformer(NodeTypes.FOR_EACH, node -> desugar(scope, node)); } public static List<StatementNode> 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<StatementNode> 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 <T extends StatementNode> NodeTransformer transformer(int nodeType, Function<T, List<StatementNode>> 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.<SwitchNode>transformer(NodeTypes.SWITCH, node -> desugar(scope, node)); } public static List<StatementNode> desugar(Scope scope, SwitchNode switchNode) { |
