aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org/zwobble
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2016-07-31 19:18:13 +0100
committerMichael Williamson <mike@zwobble.org>2016-07-31 19:19:21 +0100
commit903963a7c2b6345c41568f00de4d4752466f02f0 (patch)
tree67edb73a315858d5ee86f6988128b3c01132ff18 /src/main/java/org/zwobble
parent44f8b1ba1342af8d2088dd7c038f0753c7346db4 (diff)
Desugar foreach to for rather than while
Diffstat (limited to 'src/main/java/org/zwobble')
-rw-r--r--src/main/java/org/zwobble/couscous/backends/csharp/CsharpCodeGenerator.java4
-rw-r--r--src/main/java/org/zwobble/couscous/backends/python/PythonCodeGenerator.java4
-rw-r--r--src/main/java/org/zwobble/couscous/transforms/DesugarForEachToFor.java (renamed from src/main/java/org/zwobble/couscous/transforms/DesugarForEachToWhile.java)20
3 files changed, 16 insertions, 12 deletions
diff --git a/src/main/java/org/zwobble/couscous/backends/csharp/CsharpCodeGenerator.java b/src/main/java/org/zwobble/couscous/backends/csharp/CsharpCodeGenerator.java
index 28d2a3e..2245782 100644
--- a/src/main/java/org/zwobble/couscous/backends/csharp/CsharpCodeGenerator.java
+++ b/src/main/java/org/zwobble/couscous/backends/csharp/CsharpCodeGenerator.java
@@ -5,7 +5,7 @@ import org.zwobble.couscous.ast.Node;
import org.zwobble.couscous.ast.visitors.NodeTransformer;
import org.zwobble.couscous.backends.csharp.primitives.CsharpPrimitiveMethods;
import org.zwobble.couscous.backends.naming.Naming;
-import org.zwobble.couscous.transforms.DesugarForEachToWhile;
+import org.zwobble.couscous.transforms.DesugarForEachToFor;
import org.zwobble.couscous.transforms.DesugarForToWhile;
import org.zwobble.couscous.types.*;
@@ -47,7 +47,7 @@ public class CsharpCodeGenerator {
return nodeTransformer.transform(
CsharpPrimitiveMethods.TRANSFORMER.transform(
DesugarForToWhile.transformer().transform(
- DesugarForEachToWhile.transformer().transform(
+ DesugarForEachToFor.transformer().transform(
node
)
)
diff --git a/src/main/java/org/zwobble/couscous/backends/python/PythonCodeGenerator.java b/src/main/java/org/zwobble/couscous/backends/python/PythonCodeGenerator.java
index 29e7274..2190f66 100644
--- a/src/main/java/org/zwobble/couscous/backends/python/PythonCodeGenerator.java
+++ b/src/main/java/org/zwobble/couscous/backends/python/PythonCodeGenerator.java
@@ -10,7 +10,7 @@ import org.zwobble.couscous.ast.visitors.DynamicNodeMapper;
import org.zwobble.couscous.ast.visitors.NodeTransformer;
import org.zwobble.couscous.backends.naming.Names;
import org.zwobble.couscous.backends.python.ast.*;
-import org.zwobble.couscous.transforms.DesugarForEachToWhile;
+import org.zwobble.couscous.transforms.DesugarForEachToFor;
import org.zwobble.couscous.transforms.DesugarForToWhile;
import org.zwobble.couscous.transforms.DesugarSwitchToIfElse;
import org.zwobble.couscous.types.ScalarType;
@@ -63,7 +63,7 @@ public class PythonCodeGenerator {
public static PythonModuleNode generateCode(TypeNode sugaredTypeNode) {
NodeTransformer switchTransformer = DesugarSwitchToIfElse.transformer();
NodeTransformer forTransformer = DesugarForToWhile.transformer();
- NodeTransformer forEachTransformer = DesugarForEachToWhile.transformer();
+ NodeTransformer forEachTransformer = DesugarForEachToFor.transformer();
TypeNode typeNode = forTransformer.transformTypeDeclaration(
forEachTransformer.transformTypeDeclaration(
switchTransformer.transformTypeDeclaration(sugaredTypeNode)
diff --git a/src/main/java/org/zwobble/couscous/transforms/DesugarForEachToWhile.java b/src/main/java/org/zwobble/couscous/transforms/DesugarForEachToFor.java
index 7b6147b..bdae29a 100644
--- a/src/main/java/org/zwobble/couscous/transforms/DesugarForEachToWhile.java
+++ b/src/main/java/org/zwobble/couscous/transforms/DesugarForEachToFor.java
@@ -13,14 +13,13 @@ import java.util.Optional;
import static org.zwobble.couscous.ast.LocalVariableDeclarationNode.localVariableDeclaration;
import static org.zwobble.couscous.ast.MethodCallNode.methodCall;
import static org.zwobble.couscous.ast.VariableReferenceNode.reference;
-import static org.zwobble.couscous.ast.WhileNode.whileLoop;
import static org.zwobble.couscous.types.BoundTypeParameter.boundTypeParameter;
import static org.zwobble.couscous.util.ExtraLists.cons;
import static org.zwobble.couscous.util.ExtraLists.list;
-public class DesugarForEachToWhile {
+public class DesugarForEachToFor {
public static NodeTransformer transformer() {
- Scope scope = Scope.create().temporaryPrefix("_couscous_desugar_foreach_to_while");
+ Scope scope = Scope.create().temporaryPrefix("_couscous_desugar_foreach_to_for");
return NodeTransformer.builder()
.transformStatement(statement -> {
if (statement.type() == NodeTypes.FOR_EACH) {
@@ -39,11 +38,16 @@ public class DesugarForEachToWhile {
ExpressionNode hasNext = methodCall(reference(iterator), "hasNext", list(), Types.BOOLEAN);
ExpressionNode next = methodCall(reference(iterator), "next", list(), boundTypeParameter(JavaTypes.ITERATOR_TYPE_PARAMETER, elementType));
- WhileNode loop = whileLoop(hasNext, cons(
- localVariableDeclaration(forEach.getTarget(), next),
- forEach.getStatements()
- ));
+ ForNode loop = new ForNode(
+ list(iterator),
+ hasNext,
+ list(),
+ cons(
+ localVariableDeclaration(forEach.getTarget(), next),
+ forEach.getStatements()
+ )
+ );
- return list(new StatementBlockNode(list(iterator, loop)));
+ return list(loop);
}
}