aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/main/java/org/zwobble/couscous/backends/csharp/CsharpSerializer.java24
-rw-r--r--src/test/java/org/zwobble/couscous/tests/backends/csharp/CsharpSerializerTests.java18
2 files changed, 35 insertions, 7 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 e66d114..fd7f953 100644
--- a/src/main/java/org/zwobble/couscous/backends/csharp/CsharpSerializer.java
+++ b/src/main/java/org/zwobble/couscous/backends/csharp/CsharpSerializer.java
@@ -88,7 +88,7 @@ public class CsharpSerializer implements NodeVisitor {
@Override
public void visit(ThisReferenceNode reference) {
- throw new UnsupportedOperationException();
+ writer.writeKeyword("this");
}
@Override
@@ -231,7 +231,14 @@ public class CsharpSerializer implements NodeVisitor {
@Override
public void visit(FieldDeclarationNode declaration) {
- throw new UnsupportedOperationException();
+ writer.writeStatement(() -> {
+ writer.writeKeyword("internal");
+ writer.writeSpace();
+ writeTypeReference(declaration.getType());
+ writer.writeSpace();
+ writer.writeIdentifier(declaration.getName());
+ writer.writeSymbol(";");
+ });
}
@Override
@@ -251,17 +258,20 @@ public class CsharpSerializer implements NodeVisitor {
writer.writeSpace();
writer.writeIdentifier(classNode.getSimpleName());
writer.startBlock();
-
- for (MethodNode method : classNode.getMethods()) {
- write(method);
- }
-
+ writeAll(classNode.getFields());
+ writeAll(classNode.getMethods());
writer.endBlock();
});
writer.endBlock();
}
+ private void writeAll(List<? extends Node> nodes) {
+ for (Node method : nodes) {
+ write(method);
+ }
+ }
+
private void writeTypeReference(TypeName value) {
// TODO: process the nodes before serialization
if (PRIMITIVES.containsKey(value)) {
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 95696c7..8c3162b 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
@@ -14,6 +14,7 @@ import static org.zwobble.couscous.ast.MethodCallNode.methodCall;
import static org.zwobble.couscous.ast.MethodCallNode.staticMethodCall;
import static org.zwobble.couscous.ast.ReturnNode.returns;
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.util.ExtraLists.list;
@@ -53,6 +54,12 @@ public class CsharpSerializerTests {
}
@Test
+ public void thisReferenceUsesThisKeyword() {
+ String output = serialize(thisReference(TypeName.of("X")));
+ assertEquals("this", output);
+ }
+
+ @Test
public void ternaryConditionalWritesConditionAndBranches() {
String output = serialize(ternaryConditional(literal(true), literal(1), literal(2)));
assertEquals("true ? 1 : 2", output);
@@ -173,6 +180,17 @@ public class CsharpSerializerTests {
assertEquals("namespace Couscous.com.example {\n internal class Example {\n }\n}\n", output);
}
+ @Test
+ public void classWithFields() {
+ ClassNode classNode = ClassNode.builder("com.example.Example")
+ .field("x", TypeName.of("X"))
+ .build();
+
+ String output = serialize(classNode);
+
+ assertEquals("namespace Couscous.com.example {\n internal class Example {\n internal Couscous.X x;\n }\n}\n", output);
+ }
+
private String serialize(Node node) {
return CsharpSerializer.serialize(node, "Couscous");
}