From 45a87e8fa907a86b5eab48fe37189bf539b38403 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sat, 9 Apr 2016 16:19:26 +0100 Subject: Write method call type parameters in C# backend --- .../java/org/zwobble/couscous/ast/MethodCallNode.java | 4 ++++ .../couscous/backends/csharp/CsharpSerializer.java | 9 +++++++++ .../tests/backends/csharp/CsharpSerializerTests.java | 17 ++++++++++++++++- 3 files changed, 29 insertions(+), 1 deletion(-) (limited to 'src') 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 getTypeParameters() { + return typeParameters; + } public List 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 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 { @@ -145,6 +148,18 @@ public class CsharpSerializerTests { assertEquals("x.y(1, 2)", output); } + @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()", output); + } + @Test public void constructorCallWithNoArguments() { String output = serialize(constructorCall( -- cgit v1.2.3