From 6ae81cba8fad9973a53a15e2fbf67835899dc3bc Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Fri, 1 Apr 2016 11:05:34 +0100 Subject: Add mangling when writing C# namespaces --- .../couscous/backends/csharp/CsharpSerializer.java | 16 +++++++---- .../backends/csharp/CsharpSerializerTests.java | 32 ++++++++++++++++++++++ 2 files changed, 43 insertions(+), 5 deletions(-) (limited to 'src') 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 b396f77..48ca7e0 100644 --- a/src/main/java/org/zwobble/couscous/backends/csharp/CsharpSerializer.java +++ b/src/main/java/org/zwobble/couscous/backends/csharp/CsharpSerializer.java @@ -11,6 +11,7 @@ import org.zwobble.couscous.values.PrimitiveValue; import java.util.List; import java.util.Set; +import static java.util.Arrays.asList; import static org.zwobble.couscous.util.ExtraLists.list; import static org.zwobble.couscous.util.ExtraSets.set; @@ -441,7 +442,7 @@ public class CsharpSerializer implements NodeVisitor { writer.writeStatement(() -> { writer.writeKeyword("namespace"); writer.writeSpace(); - writer.writeIdentifier(node.getName().getPackage().get()); + writeQualifiedName(node.getName().getPackage().get()); writer.startBlock(); writer.writeStatement(() -> { writer.writeKeyword("internal"); @@ -524,7 +525,7 @@ public class CsharpSerializer implements NodeVisitor { if (isReservedTypeIdentifier(type)) { writer.writeKeyword(type.getQualifiedName()); } else { - writer.writeIdentifier(typeReference(type)); + writeQualifiedName(type.getQualifiedName()); } return null; } @@ -537,7 +538,7 @@ public class CsharpSerializer implements NodeVisitor { @Override public Void visit(ParameterizedType type) { - writer.writeIdentifier(typeReference(type.getRawType())); + writeTypeReference(type.getRawType()); writer.writeSymbol("<"); writer.writeCommaSeparated( type.getParameters(), @@ -558,7 +559,12 @@ public class CsharpSerializer implements NodeVisitor { return RESERVED_TYPE_IDENTIFIERS.contains(type.getQualifiedName()); } - private String typeReference(ScalarType value) { - return value.getQualifiedName(); + private void writeQualifiedName(String name) { + writer.writeWithSeparator( + asList(name.split("\\.")), + writer::writeIdentifier, + () -> { + writer.writeSymbol("."); + }); } } 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 b16c6b5..781d00a 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 @@ -56,6 +56,18 @@ public class CsharpSerializerTests { assertEquals("typeof(com.example.Example)", output); } + @Test + public void typeLiteralUsesAtSymbolToEscapeReservedIdentifiers() { + String output = serialize(literal(ScalarType.of("internal"))); + assertEquals("typeof(@internal)", output); + } + + @Test + public void typeLiteralDoesntUseAtSymbolForReservedTypeIdentifiers() { + String output = serialize(literal(ScalarType.of("string"))); + assertEquals("typeof(string)", output); + } + @Test public void variableReferenceWritesIdentifier() { String output = serialize(reference(var(TestIds.ANY_ID, "x", ScalarType.of("X")))); @@ -304,6 +316,26 @@ public class CsharpSerializerTests { assertEquals("namespace com.example {\n internal class Example {\n }\n}\n", output); } + @Test + public void namespacePartsInNamespaceDeclarationAreMangledInIfReserved() { + ClassNode classNode = ClassNode.builder("com.example.internal.Example") + .build(); + + String output = serialize(classNode); + + assertEquals("namespace com.example.@internal {\n internal class Example {\n }\n}\n", output); + } + + @Test + public void namespacePartsInNamespaceReferenceAreMangledInIfReserved() { + String output = serialize(localVariableDeclaration( + TestIds.ANY_ID, + "x", + ScalarType.of("com.example.internal.Example"), + literal("[value]"))); + assertEquals("com.example.@internal.Example x = \"[value]\";\n", output); + } + @Test public void classWithTypeParameters() { ClassNode classNode = ClassNode.builder("com.example.Example") -- cgit v1.2.3