From 4189eb24789bd5d1d9ef4ecea567f4119cbb325c Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sun, 31 Jul 2016 19:13:45 +0100 Subject: Implement for loops using desugar --- .../couscous/transforms/DesugarForToWhile.java | 44 ++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 src/main/java/org/zwobble/couscous/transforms/DesugarForToWhile.java (limited to 'src/main/java/org/zwobble/couscous/transforms') diff --git a/src/main/java/org/zwobble/couscous/transforms/DesugarForToWhile.java b/src/main/java/org/zwobble/couscous/transforms/DesugarForToWhile.java new file mode 100644 index 0000000..5989838 --- /dev/null +++ b/src/main/java/org/zwobble/couscous/transforms/DesugarForToWhile.java @@ -0,0 +1,44 @@ +package org.zwobble.couscous.transforms; + +import org.zwobble.couscous.ast.ForNode; +import org.zwobble.couscous.ast.NodeTypes; +import org.zwobble.couscous.ast.StatementNode; +import org.zwobble.couscous.ast.visitors.NodeTransformer; +import org.zwobble.couscous.frontends.java.Scope; + +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; + +public class DesugarForToWhile { + public static NodeTransformer transformer() { + Scope scope = Scope.create().temporaryPrefix("_couscous_desugar_for_to_while"); + return NodeTransformer.builder() + .transformStatement(statement -> { + if (statement.type() == NodeTypes.FOR) { + return Optional.of(desugar(scope, ((ForNode) statement))); + } else { + return Optional.empty(); + } + }) + .build(); + } + + public static List desugar(Scope scope, ForNode forNode) { + return append( + forNode.getInitializers(), + whileLoop( + forNode.getCondition(), + concat( + forNode.getStatements(), + lazyMap(forNode.getUpdaters(), updater -> expressionStatement(updater)) + ) + ) + ); + } +} -- cgit v1.2.3