aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org/zwobble/couscous/transforms/DesugarForToWhile.java
blob: 3bd0d326d5106eb5c00b999ed61c70f41550ab09 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
package org.zwobble.couscous.transforms;

import org.zwobble.couscous.ast.ForNode;
import org.zwobble.couscous.ast.NodeTypes;
import org.zwobble.couscous.ast.StatementBlockNode;
import org.zwobble.couscous.ast.StatementNode;
import org.zwobble.couscous.ast.visitors.NodeTransformer;

import java.util.List;

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.*;

public class DesugarForToWhile {
    public static NodeTransformer transformer() {
        return DesugarStatement.transformer(NodeTypes.FOR, DesugarForToWhile::desugar);
    }

    public static List<StatementNode> desugar(ForNode forNode) {
        List<StatementNode> statements = append(
            forNode.getInitializers(),
            whileLoop(
                forNode.getCondition(),
                concat(
                    forNode.getStatements(),
                    lazyMap(forNode.getUpdaters(), updater -> expressionStatement(updater))
                )
            )
        );
        return list(new StatementBlockNode(statements));
    }
}