diff options
5 files changed, 51 insertions, 25 deletions
diff --git a/src/main/java/org/zwobble/couscous/backends/SourceCodeWriter.java b/src/main/java/org/zwobble/couscous/backends/SourceCodeWriter.java index a50515f..301bb61 100644 --- a/src/main/java/org/zwobble/couscous/backends/SourceCodeWriter.java +++ b/src/main/java/org/zwobble/couscous/backends/SourceCodeWriter.java @@ -78,6 +78,10 @@ public class SourceCodeWriter { } private void startStatement() { + writeIndentation(); + } + + public void writeIndentation() { builder.append(Strings.repeat(" ", depth * SPACES_PER_INDENT)); } 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 f3c946f..680e93f 100644 --- a/src/main/java/org/zwobble/couscous/backends/csharp/CsharpSerializer.java +++ b/src/main/java/org/zwobble/couscous/backends/csharp/CsharpSerializer.java @@ -15,7 +15,8 @@ public class CsharpSerializer implements NodeVisitor { writer2.writeSymbol("{"); }, (writer2) -> { - writer2.writeStatement(() -> writer2.writeSymbol("}")); + writer2.writeIndentation(); + writer2.writeSymbol("}"); } ); CsharpSerializer serializer = new CsharpSerializer(writer); @@ -196,7 +197,24 @@ public class CsharpSerializer implements NodeVisitor { @Override public void visit(IfStatementNode ifStatement) { - throw new UnsupportedOperationException(); + writer.writeStatement(() -> { + writer.writeKeyword("if"); + writer.writeSpace(); + writer.writeSymbol("("); + write(ifStatement.getCondition()); + writer.writeSymbol(")"); + + writer.startBlock(); + writeAll(ifStatement.getTrueBranch()); + writer.endBlock(); + + writer.writeSpace(); + writer.writeKeyword("else"); + + writer.startBlock(); + writeAll(ifStatement.getFalseBranch()); + writer.endBlock(); + }); } @Override @@ -263,24 +281,26 @@ public class CsharpSerializer implements NodeVisitor { @Override public void visit(ClassNode classNode) { - writer.writeKeyword("namespace"); - writer.writeSpace(); - writer.writeIdentifier(classNode.getName().getPackage().get()); - writer.startBlock(); writer.writeStatement(() -> { - writer.writeKeyword("internal"); - writer.writeSpace(); - writer.writeKeyword("class"); + writer.writeKeyword("namespace"); writer.writeSpace(); - writer.writeIdentifier(classNode.getSimpleName()); + writer.writeIdentifier(classNode.getName().getPackage().get()); writer.startBlock(); - writeAll(classNode.getFields()); - writeConstructor(classNode, classNode.getConstructor()); - writeAll(classNode.getMethods()); + writer.writeStatement(() -> { + writer.writeKeyword("internal"); + writer.writeSpace(); + writer.writeKeyword("class"); + writer.writeSpace(); + writer.writeIdentifier(classNode.getSimpleName()); + writer.startBlock(); + writeAll(classNode.getFields()); + writeConstructor(classNode, classNode.getConstructor()); + writeAll(classNode.getMethods()); + writer.endBlock(); + }); + writer.endBlock(); }); - - writer.endBlock(); } private void writeConstructor(ClassNode classNode, ConstructorNode constructor) { diff --git a/src/test/java/org/zwobble/couscous/tests/BackendMethodTests.java b/src/test/java/org/zwobble/couscous/tests/BackendMethodTests.java index 38887bd..0bc0219 100644 --- a/src/test/java/org/zwobble/couscous/tests/BackendMethodTests.java +++ b/src/test/java/org/zwobble/couscous/tests/BackendMethodTests.java @@ -96,6 +96,7 @@ public abstract class BackendMethodTests { @Test public void whenConditionIsTrueIfStatementExecutesTrueBranch() { MethodNode.Builder method = staticMethod("hello") + .returns(StringValue.REF) .statement(ifStatement( literal(true), list(returns(literal("[true]"))), @@ -106,6 +107,7 @@ public abstract class BackendMethodTests { @Test public void whenConditionIsFalseIfStatementExecutesTrueBranch() { MethodNode.Builder method = staticMethod("hello") + .returns(StringValue.REF) .statement(ifStatement( literal(false), list(returns(literal("[true]"))), 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 34bb2b1..fcacda0 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 @@ -23,16 +23,6 @@ public class CsharpCompilerMethodTests extends BackendMethodTests { @Ignore @Test - public void whenConditionIsTrueIfStatementExecutesTrueBranch() { - } - - @Ignore - @Test - public void whenConditionIsFalseIfStatementExecutesTrueBranch() { - } - - @Ignore - @Test public void whileLoopIsExecutedWhileConditionIsTrue() { } 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 bac5723..22da6d2 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 @@ -12,6 +12,7 @@ import static org.zwobble.couscous.ast.ConstructorCallNode.constructorCall; import static org.zwobble.couscous.ast.ExpressionStatementNode.expressionStatement; import static org.zwobble.couscous.ast.FieldAccessNode.fieldAccess; import static org.zwobble.couscous.ast.FormalArgumentNode.formalArg; +import static org.zwobble.couscous.ast.IfStatementNode.ifStatement; import static org.zwobble.couscous.ast.LiteralNode.literal; import static org.zwobble.couscous.ast.MethodCallNode.methodCall; import static org.zwobble.couscous.ast.MethodCallNode.staticMethodCall; @@ -158,6 +159,15 @@ public class CsharpSerializerTests { } @Test + public void ifElseStatementPrintsBothBranches() { + String output = serialize(ifStatement( + literal(true), + list(returns(literal(1))), + list(returns(literal(2))))); + assertEquals("if (true) {\n return 1;\n} else {\n return 2;\n}\n", output); + } + + @Test public void methodCanHaveVoidReturnType() { String output = serialize(MethodNode.staticMethod("nothing") .returns(TypeName.of("void")) |
