aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2016-02-06 13:02:27 +0000
committerMichael Williamson <mike@zwobble.org>2016-02-06 13:02:27 +0000
commitd0cf76db293b34db15245dc1ab245bd18c81c8b3 (patch)
tree7d01cc227251bd449424136993c8a3523596bd24 /src
parent86569c014334e58c90430370e5184d3a0e8c8e7b (diff)
Implement while loops in C# backend
Diffstat (limited to 'src')
-rw-r--r--src/main/java/org/zwobble/couscous/backends/csharp/CsharpSerializer.java12
-rw-r--r--src/test/java/org/zwobble/couscous/tests/BackendMethodTests.java2
-rw-r--r--src/test/java/org/zwobble/couscous/tests/backends/csharp/CsharpCompilerMethodTests.java10
-rw-r--r--src/test/java/org/zwobble/couscous/tests/backends/csharp/CsharpSerializerTests.java9
4 files changed, 22 insertions, 11 deletions
diff --git a/src/main/java/org/zwobble/couscous/backends/csharp/CsharpSerializer.java b/src/main/java/org/zwobble/couscous/backends/csharp/CsharpSerializer.java
index b16f684..0bd7a21 100644
--- a/src/main/java/org/zwobble/couscous/backends/csharp/CsharpSerializer.java
+++ b/src/main/java/org/zwobble/couscous/backends/csharp/CsharpSerializer.java
@@ -228,7 +228,17 @@ public class CsharpSerializer implements NodeVisitor {
@Override
public void visit(WhileNode whileLoop) {
- throw new UnsupportedOperationException();
+ writer.writeStatement(() -> {
+ writer.writeKeyword("while");
+ writer.writeSpace();
+ writer.writeSymbol("(");
+ write(whileLoop.getCondition());
+ writer.writeSymbol(")");
+
+ writer.startBlock();
+ writeAll(whileLoop.getBody());
+ writer.endBlock();
+ });
}
@Override
diff --git a/src/test/java/org/zwobble/couscous/tests/BackendMethodTests.java b/src/test/java/org/zwobble/couscous/tests/BackendMethodTests.java
index 38627dc..d6d35af 100644
--- a/src/test/java/org/zwobble/couscous/tests/BackendMethodTests.java
+++ b/src/test/java/org/zwobble/couscous/tests/BackendMethodTests.java
@@ -121,6 +121,7 @@ public abstract class BackendMethodTests {
LocalVariableDeclarationNode x = localVariableDeclaration(TestIds.id("x"), "x", IntegerValue.REF, literal(0));
LocalVariableDeclarationNode y = localVariableDeclaration(TestIds.id("y"), "y", IntegerValue.REF, literal(2));
MethodNode.Builder method = staticMethod("hello")
+ .returns(IntegerValue.REF)
.statement(x)
.statement(y)
.statement(whileLoop(
@@ -135,6 +136,7 @@ public abstract class BackendMethodTests {
LocalVariableDeclarationNode x = localVariableDeclaration(TestIds.id("x"), "x", IntegerValue.REF, literal(0));
LocalVariableDeclarationNode y = localVariableDeclaration(TestIds.id("y"), "y", IntegerValue.REF, literal(2));
MethodNode.Builder method = staticMethod("hello")
+ .returns(IntegerValue.REF)
.statement(x)
.statement(y)
.statement(whileLoop(
diff --git a/src/test/java/org/zwobble/couscous/tests/backends/csharp/CsharpCompilerMethodTests.java b/src/test/java/org/zwobble/couscous/tests/backends/csharp/CsharpCompilerMethodTests.java
index d68c349..8817644 100644
--- a/src/test/java/org/zwobble/couscous/tests/backends/csharp/CsharpCompilerMethodTests.java
+++ b/src/test/java/org/zwobble/couscous/tests/backends/csharp/CsharpCompilerMethodTests.java
@@ -11,16 +11,6 @@ public class CsharpCompilerMethodTests extends BackendMethodTests {
public void methodWithNoStatementsReturnsUnit() {
}
- @Ignore
- @Test
- public void whileLoopIsExecutedWhileConditionIsTrue() {
- }
-
- @Ignore
- @Test
- public void returnWillExitWhileLoopEarly() {
- }
-
@Override
protected MethodRunner buildMethodRunner() {
return new CsharpMethodRunner();
diff --git a/src/test/java/org/zwobble/couscous/tests/backends/csharp/CsharpSerializerTests.java b/src/test/java/org/zwobble/couscous/tests/backends/csharp/CsharpSerializerTests.java
index cc686e5..3f4ef60 100644
--- a/src/test/java/org/zwobble/couscous/tests/backends/csharp/CsharpSerializerTests.java
+++ b/src/test/java/org/zwobble/couscous/tests/backends/csharp/CsharpSerializerTests.java
@@ -23,6 +23,7 @@ import static org.zwobble.couscous.ast.TernaryConditionalNode.ternaryConditional
import static org.zwobble.couscous.ast.ThisReferenceNode.thisReference;
import static org.zwobble.couscous.ast.VariableDeclaration.var;
import static org.zwobble.couscous.ast.VariableReferenceNode.reference;
+import static org.zwobble.couscous.ast.WhileNode.whileLoop;
import static org.zwobble.couscous.util.ExtraLists.list;
public class CsharpSerializerTests {
@@ -179,6 +180,14 @@ public class CsharpSerializerTests {
}
@Test
+ public void whileLoopPrintsConditionAndBody() {
+ String output = serialize(whileLoop(
+ literal(true),
+ list(returns(literal(1)))));
+ assertEquals("while (true) {\n return 1;\n}\n", output);
+ }
+
+ @Test
public void methodCanHaveVoidReturnType() {
String output = serialize(MethodNode.staticMethod("nothing")
.returns(TypeName.of("void"))