aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main/java/org/zwobble/couscous/backends/csharp/CsharpSerializer.java41
-rw-r--r--src/test/java/org/zwobble/couscous/tests/backends/csharp/CsharpCompilerEvalTests.java5
-rw-r--r--src/test/java/org/zwobble/couscous/tests/backends/csharp/CsharpSerializerTests.java27
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)))