aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/org')
-rw-r--r--src/main/java/org/zwobble/couscous/transforms/DesugarForEachToFor.java11
-rw-r--r--src/main/java/org/zwobble/couscous/transforms/DesugarForToWhile.java15
-rw-r--r--src/main/java/org/zwobble/couscous/transforms/DesugarStatement.java22
-rw-r--r--src/main/java/org/zwobble/couscous/transforms/DesugarSwitchToIfElse.java11
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) {