From d0cf76db293b34db15245dc1ab245bd18c81c8b3 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sat, 6 Feb 2016 13:02:27 +0000 Subject: Implement while loops in C# backend --- .../zwobble/couscous/backends/csharp/CsharpSerializer.java | 12 +++++++++++- .../java/org/zwobble/couscous/tests/BackendMethodTests.java | 2 ++ .../tests/backends/csharp/CsharpCompilerMethodTests.java | 10 ---------- .../tests/backends/csharp/CsharpSerializerTests.java | 9 +++++++++ 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 { @@ -178,6 +179,14 @@ public class CsharpSerializerTests { assertEquals("if (true) {\n return 1;\n} else {\n return 2;\n}\n", output); } + @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") -- cgit v1.2.3