aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2016-02-06 12:53:08 +0000
committerMichael Williamson <mike@zwobble.org>2016-02-06 12:53:08 +0000
commit552beeaab859156ce4aea3e9a27783ec69b965c3 (patch)
tree8d98f77d9ca8f7c89e4d089f13870629120b5d27 /src
parentbfe06980f1e0e5f3597b710f458819eedc190954 (diff)
Implement if statements for C# backend
Diffstat (limited to 'src')
-rw-r--r--src/main/java/org/zwobble/couscous/backends/SourceCodeWriter.java4
-rw-r--r--src/main/java/org/zwobble/couscous/backends/csharp/CsharpSerializer.java50
-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.java10
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"))