aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/main/java/org/zwobble/couscous/backends/csharp/CsharpSerializer.java16
-rw-r--r--src/test/java/org/zwobble/couscous/tests/backends/csharp/CsharpSerializerTests.java32
2 files changed, 43 insertions, 5 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 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
@@ -57,6 +57,18 @@ public class CsharpSerializerTests {
}
@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"))));
assertEquals("x", output);
@@ -305,6 +317,26 @@ public class CsharpSerializerTests {
}
@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")
.addTypeParameter("T")