diff options
3 files changed, 62 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 702ad12..f034975 100644 --- a/src/main/java/org/zwobble/couscous/backends/csharp/CsharpSerializer.java +++ b/src/main/java/org/zwobble/couscous/backends/csharp/CsharpSerializer.java @@ -63,7 +63,7 @@ public class CsharpSerializer implements NodeVisitor { public Void visitType(TypeName value) { writer.writeKeyword("typeof"); writer.writeSymbol("("); - writer.writeIdentifier(namespace + "." + value.getQualifiedName()); + writeTypeReference(value); writer.writeSymbol(")"); return null; } @@ -100,12 +100,20 @@ public class CsharpSerializer implements NodeVisitor { @Override public void visit(MethodCallNode methodCall) { - throw new UnsupportedOperationException(); + write(methodCall.getReceiver()); + writer.writeSymbol("."); + writer.writeIdentifier(methodCall.getMethodName()); + writer.writeSymbol("("); + writer.writeSymbol(")"); } @Override public void visit(ConstructorCallNode call) { - throw new UnsupportedOperationException(); + writer.writeKeyword("new"); + writer.writeSpace(); + writeTypeReference(call.getType()); + writer.writeSymbol("("); + writer.writeSymbol(")"); } @Override @@ -125,7 +133,18 @@ public class CsharpSerializer implements NodeVisitor { @Override public void visit(InstanceReceiver receiver) { - throw new UnsupportedOperationException(); + receiver.accept(new Receiver.Mapper<Void>() { + @Override + public Void visit(ExpressionNode receiver) { + write(receiver); + return null; + } + + @Override + public Void visit(TypeName receiver) { + throw new UnsupportedOperationException(); + } + }); } @Override @@ -176,8 +195,10 @@ public class CsharpSerializer implements NodeVisitor { writer.writeStatement(() -> { writer.writeKeyword("internal"); writer.writeSpace(); - writer.writeKeyword("static"); - writer.writeSpace(); + if (method.isStatic()) { + writer.writeKeyword("static"); + writer.writeSpace(); + } writer.writeKeyword("dynamic"); writer.writeSpace(); writer.writeIdentifier(method.getName()); @@ -228,4 +249,12 @@ public class CsharpSerializer implements NodeVisitor { writer.endBlock(); } + + private void writeTypeReference(TypeName value) { + writer.writeIdentifier(typeReference(value)); + } + + private String typeReference(TypeName value) { + return namespace + "." + value.getQualifiedName(); + } } diff --git a/src/test/java/org/zwobble/couscous/tests/backends/csharp/CsharpCompilerEvalTests.java b/src/test/java/org/zwobble/couscous/tests/backends/csharp/CsharpCompilerEvalTests.java index 68870f4..2348acf 100644 --- a/src/test/java/org/zwobble/couscous/tests/backends/csharp/CsharpCompilerEvalTests.java +++ b/src/test/java/org/zwobble/couscous/tests/backends/csharp/CsharpCompilerEvalTests.java @@ -47,11 +47,6 @@ public class CsharpCompilerEvalTests extends BackendEvalTests { @Test @Ignore - public void canCallInstanceMethodWithNoArgumentsOnUserDefinedClass() { - } - - @Test - @Ignore public void canCallInstanceMethodWithArgumentsOnUserDefinedClass() { } 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 93456ef..1139e3c 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 @@ -6,11 +6,14 @@ import org.zwobble.couscous.backends.csharp.CsharpSerializer; import org.zwobble.couscous.tests.TestIds; import static org.junit.Assert.assertEquals; +import static org.zwobble.couscous.ast.ConstructorCallNode.constructorCall; import static org.zwobble.couscous.ast.LiteralNode.literal; +import static org.zwobble.couscous.ast.MethodCallNode.methodCall; import static org.zwobble.couscous.ast.ReturnNode.returns; import static org.zwobble.couscous.ast.TernaryConditionalNode.ternaryConditional; import static org.zwobble.couscous.ast.VariableDeclaration.var; import static org.zwobble.couscous.ast.VariableReferenceNode.reference; +import static org.zwobble.couscous.util.ExtraLists.list; public class CsharpSerializerTests { @Test @@ -53,6 +56,24 @@ public class CsharpSerializerTests { } @Test + public void methodCallWithNoArgumentsWritesReceiver() { + String output = serialize(methodCall( + reference(var(TestIds.ANY_ID, "x", TypeName.of("X"))), + "y", + list(), + TypeName.of("Y"))); + assertEquals("x.y()", output); + } + + @Test + public void constructorCallWithNoArguments() { + String output = serialize(constructorCall( + TypeName.of("X"), + list())); + assertEquals("new Couscous.X()", output); + } + + @Test public void returnStatementUsesReturnStatement() { String output = serialize(returns(literal(true))); assertEquals("return true;", output); @@ -65,6 +86,12 @@ public class CsharpSerializerTests { } @Test + public void instanceMethodHasNoStaticKeword() { + String output = serialize(MethodNode.builder("nothing").build()); + assertEquals("internal dynamic nothing() {\n}\n", output); + } + + @Test public void methodHasSerializedBody() { MethodNode method = MethodNode.staticMethod("nothing") .statement(returns(literal(true))) |
