aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2016-04-01 10:50:28 +0100
committerMichael Williamson <mike@zwobble.org>2016-04-01 10:50:28 +0100
commitd1e7efbf5adab7516a19fd35c9fa9a3fdca2e769 (patch)
treeb767d5de3b8953b0c773d1228c1c285d0f2776e2 /src/main/java
parente855df09f88d1e18e99d8a1d8be75fb944a19a99 (diff)
Mangle reserved identifiers in C# backend
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/zwobble/couscous/backends/SourceCodeWriter.java13
-rw-r--r--src/main/java/org/zwobble/couscous/backends/csharp/CsharpSerializer.java105
-rw-r--r--src/main/java/org/zwobble/couscous/backends/python/PythonSerializer.java6
-rw-r--r--src/main/java/org/zwobble/couscous/util/ExtraSets.java4
4 files changed, 121 insertions, 7 deletions
diff --git a/src/main/java/org/zwobble/couscous/backends/SourceCodeWriter.java b/src/main/java/org/zwobble/couscous/backends/SourceCodeWriter.java
index 393cdc2..57959fd 100644
--- a/src/main/java/org/zwobble/couscous/backends/SourceCodeWriter.java
+++ b/src/main/java/org/zwobble/couscous/backends/SourceCodeWriter.java
@@ -1,9 +1,11 @@
package org.zwobble.couscous.backends;
+import com.google.common.base.Function;
import com.google.common.base.Strings;
import org.zwobble.couscous.util.Action;
import java.util.Iterator;
+import java.util.Set;
import java.util.function.Consumer;
public class SourceCodeWriter {
@@ -16,11 +18,15 @@ public class SourceCodeWriter {
private final WriterAction blockStart;
private final WriterAction blockEnd;
+ private final Set<String> reservedIdentifiers;
+ private final Function<String, String> mangleReservedIdentifier;
private int depth = 0;
- public SourceCodeWriter(WriterAction blockStart, WriterAction blockEnd) {
+ public SourceCodeWriter(WriterAction blockStart, WriterAction blockEnd, Set<String> reservedIdentifiers, Function<String, String> mangleReservedIdentifier) {
this.blockStart = blockStart;
this.blockEnd = blockEnd;
+ this.reservedIdentifiers = reservedIdentifiers;
+ this.mangleReservedIdentifier = mangleReservedIdentifier;
}
public String asString() {
@@ -51,7 +57,10 @@ public class SourceCodeWriter {
}
public void writeIdentifier(String name) {
- builder.append(name);
+ String nameToWrite = reservedIdentifiers.contains(name)
+ ? mangleReservedIdentifier.apply(name)
+ : name;
+ builder.append(nameToWrite);
}
public void writeSymbol(String symbol) {
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 d33dafa..b396f77 100644
--- a/src/main/java/org/zwobble/couscous/backends/csharp/CsharpSerializer.java
+++ b/src/main/java/org/zwobble/couscous/backends/csharp/CsharpSerializer.java
@@ -1,5 +1,6 @@
package org.zwobble.couscous.backends.csharp;
+import com.google.common.collect.ImmutableSet;
import org.zwobble.couscous.ast.*;
import org.zwobble.couscous.ast.visitors.NodeVisitor;
import org.zwobble.couscous.backends.SourceCodeWriter;
@@ -8,10 +9,100 @@ import org.zwobble.couscous.util.Action;
import org.zwobble.couscous.values.PrimitiveValue;
import java.util.List;
+import java.util.Set;
import static org.zwobble.couscous.util.ExtraLists.list;
+import static org.zwobble.couscous.util.ExtraSets.set;
public class CsharpSerializer implements NodeVisitor {
+ private static final Set<String> RESERVED_TYPE_IDENTIFIERS = set(
+ "bool",
+ "byte",
+ "char",
+ "decimal",
+ "double",
+ "float",
+ "int",
+ "long",
+ "object",
+ "sbyte",
+ "short",
+ "string",
+ "uint",
+ "ulong",
+ "ushort",
+ "void");
+
+ private static final Set<String> RESERVED_IDENTIFIERS;
+
+ static {
+ ImmutableSet.Builder<String> builder = ImmutableSet.builder();
+ builder.add("abstract",
+ "as",
+ "base",
+ "break",
+ "case",
+ "catch",
+ "checked",
+ "class",
+ "const",
+ "continue",
+ "default",
+ "delegate",
+ "do",
+ "else",
+ "enum",
+ "event",
+ "explicit",
+ "extern",
+ "false",
+ "finally",
+ "fixed",
+ "for",
+ "foreach",
+ "goto",
+ "if",
+ "implicit",
+ "in",
+ "interface",
+ "internal",
+ "is",
+ "lock",
+ "namespace",
+ "new",
+ "null",
+ "operator",
+ "out",
+ "out (generic modifier)",
+ "override",
+ "params",
+ "private",
+ "protected",
+ "public",
+ "readonly",
+ "ref",
+ "return",
+ "sealed",
+ "sizeof",
+ "stackalloc",
+ "static",
+ "struct",
+ "switch",
+ "this",
+ "throw",
+ "true",
+ "try",
+ "typeof",
+ "unchecked",
+ "unsafe",
+ "using",
+ "virtual",
+ "volatile",
+ "while");
+ builder.addAll(RESERVED_TYPE_IDENTIFIERS);
+ RESERVED_IDENTIFIERS = builder.build();
+ } ;
+
public static String serialize(Node node) {
SourceCodeWriter writer = new SourceCodeWriter(
(writer2) -> {
@@ -21,7 +112,9 @@ public class CsharpSerializer implements NodeVisitor {
(writer2) -> {
writer2.writeIndentation();
writer2.writeSymbol("}");
- }
+ },
+ RESERVED_IDENTIFIERS,
+ identifier -> "@" + identifier
);
CsharpSerializer serializer = new CsharpSerializer(writer);
@@ -428,7 +521,11 @@ public class CsharpSerializer implements NodeVisitor {
value.accept(new Type.Visitor<Void>() {
@Override
public Void visit(ScalarType type) {
- writer.writeIdentifier(typeReference(type));
+ if (isReservedTypeIdentifier(type)) {
+ writer.writeKeyword(type.getQualifiedName());
+ } else {
+ writer.writeIdentifier(typeReference(type));
+ }
return null;
}
@@ -457,6 +554,10 @@ public class CsharpSerializer implements NodeVisitor {
});
}
+ private static boolean isReservedTypeIdentifier(ScalarType type) {
+ return RESERVED_TYPE_IDENTIFIERS.contains(type.getQualifiedName());
+ }
+
private String typeReference(ScalarType value) {
return value.getQualifiedName();
}
diff --git a/src/main/java/org/zwobble/couscous/backends/python/PythonSerializer.java b/src/main/java/org/zwobble/couscous/backends/python/PythonSerializer.java
index 36d4a34..3f6f2e4 100644
--- a/src/main/java/org/zwobble/couscous/backends/python/PythonSerializer.java
+++ b/src/main/java/org/zwobble/couscous/backends/python/PythonSerializer.java
@@ -5,11 +5,15 @@ import org.zwobble.couscous.backends.python.ast.*;
import org.zwobble.couscous.backends.python.ast.visitors.PythonExpressionStatement;
import org.zwobble.couscous.backends.python.ast.visitors.PythonNodeVisitor;
+import static org.zwobble.couscous.util.ExtraSets.set;
+
public class PythonSerializer implements PythonNodeVisitor {
public static String serialize(PythonNode node) {
SourceCodeWriter writer = new SourceCodeWriter(
(writer2) -> writer2.writeSymbol(":"),
- (writer2) -> {}
+ (writer2) -> {},
+ set(),
+ identifier -> identifier
);
PythonSerializer serializer = new PythonSerializer(writer);
serializer.write(node);
diff --git a/src/main/java/org/zwobble/couscous/util/ExtraSets.java b/src/main/java/org/zwobble/couscous/util/ExtraSets.java
index 3012da5..6e807c6 100644
--- a/src/main/java/org/zwobble/couscous/util/ExtraSets.java
+++ b/src/main/java/org/zwobble/couscous/util/ExtraSets.java
@@ -15,7 +15,7 @@ public class ExtraSets {
return ImmutableSet.of(value1);
}
- public static <T> Set<T> set(T value1, T value2) {
- return ImmutableSet.of(value1, value2);
+ public static <T> Set<T> set(T... values) {
+ return ImmutableSet.copyOf(values);
}
}