aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2016-04-09 16:19:26 +0100
committerMichael Williamson <mike@zwobble.org>2016-04-09 16:19:26 +0100
commit45a87e8fa907a86b5eab48fe37189bf539b38403 (patch)
tree08010050dbf8de09ea9914abbca4cce235a26cc1 /src
parent828f7b76300cfd803917aa3b780074b5535f45ab (diff)
Write method call type parameters in C# backend
Diffstat (limited to 'src')
-rw-r--r--src/main/java/org/zwobble/couscous/ast/MethodCallNode.java4
-rw-r--r--src/main/java/org/zwobble/couscous/backends/csharp/CsharpSerializer.java9
-rw-r--r--src/test/java/org/zwobble/couscous/tests/backends/csharp/CsharpSerializerTests.java17
3 files changed, 29 insertions, 1 deletions
diff --git a/src/main/java/org/zwobble/couscous/ast/MethodCallNode.java b/src/main/java/org/zwobble/couscous/ast/MethodCallNode.java
index 7e3675b..c0f2c6f 100644
--- a/src/main/java/org/zwobble/couscous/ast/MethodCallNode.java
+++ b/src/main/java/org/zwobble/couscous/ast/MethodCallNode.java
@@ -135,6 +135,10 @@ public class MethodCallNode implements ExpressionNode {
public String getMethodName() {
return methodName;
}
+
+ public List<Type> getTypeParameters() {
+ return typeParameters;
+ }
public List<ExpressionNode> getArguments() {
return arguments;
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 d93f2df..194349f 100644
--- a/src/main/java/org/zwobble/couscous/backends/csharp/CsharpSerializer.java
+++ b/src/main/java/org/zwobble/couscous/backends/csharp/CsharpSerializer.java
@@ -220,9 +220,18 @@ public class CsharpSerializer implements NodeVisitor {
write(methodCall.getReceiver());
writer.writeSymbol(".");
writer.writeIdentifier(methodCall.getMethodName());
+ writeTypeParameters(methodCall.getTypeParameters());
writeArguments(methodCall.getArguments());
}
+ private void writeTypeParameters(List<Type> typeParameters) {
+ if (!typeParameters.isEmpty()) {
+ writer.writeSymbol("<");
+ writer.writeCommaSeparated(typeParameters, this::writeTypeReference);
+ writer.writeSymbol(">");
+ }
+ }
+
@Override
public void visit(ConstructorCallNode call) {
writer.writeKeyword("new");
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 30b4768..6248aa5 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
@@ -3,9 +3,9 @@ package org.zwobble.couscous.tests.backends.csharp;
import org.junit.Test;
import org.zwobble.couscous.ast.*;
import org.zwobble.couscous.ast.identifiers.Identifiers;
-import org.zwobble.couscous.types.ScalarType;
import org.zwobble.couscous.backends.csharp.CsharpSerializer;
import org.zwobble.couscous.tests.TestIds;
+import org.zwobble.couscous.types.ScalarType;
import org.zwobble.couscous.types.Types;
import static org.junit.Assert.assertEquals;
@@ -18,10 +18,12 @@ import static org.zwobble.couscous.ast.FieldAccessNode.fieldAccess;
import static org.zwobble.couscous.ast.FormalArgumentNode.formalArg;
import static org.zwobble.couscous.ast.FormalTypeParameterNode.formalTypeParameter;
import static org.zwobble.couscous.ast.IfStatementNode.ifStatement;
+import static org.zwobble.couscous.ast.InstanceReceiver.instanceReceiver;
import static org.zwobble.couscous.ast.LiteralNode.literal;
import static org.zwobble.couscous.ast.LocalVariableDeclarationNode.localVariableDeclaration;
import static org.zwobble.couscous.ast.MethodCallNode.methodCall;
import static org.zwobble.couscous.ast.MethodCallNode.staticMethodCall;
+import static org.zwobble.couscous.ast.MethodSignature.signature;
import static org.zwobble.couscous.ast.Operations.not;
import static org.zwobble.couscous.ast.ReturnNode.returns;
import static org.zwobble.couscous.ast.TernaryConditionalNode.ternaryConditional;
@@ -29,6 +31,7 @@ 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.ast.WhileNode.whileLoop;
+import static org.zwobble.couscous.types.TypeParameter.typeParameter;
import static org.zwobble.couscous.util.ExtraLists.list;
public class CsharpSerializerTests {
@@ -146,6 +149,18 @@ public class CsharpSerializerTests {
}
@Test
+ public void methodCallWithTypeParameters() {
+ String output = serialize(methodCall(
+ instanceReceiver(reference(var(TestIds.ANY_ID, "x", ScalarType.of("X")))),
+ "y",
+ list(ScalarType.of("Z")),
+ list(),
+ ScalarType.of("Y"),
+ signature("y", list(typeParameter(Identifiers.method(Identifiers.forType("X"), "y"), "T")), list(), ScalarType.of("Y"))));
+ assertEquals("x.y<Z>()", output);
+ }
+
+ @Test
public void constructorCallWithNoArguments() {
String output = serialize(constructorCall(
ScalarType.of("X"),