From d1e7efbf5adab7516a19fd35c9fa9a3fdca2e769 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Fri, 1 Apr 2016 10:50:28 +0100 Subject: Mangle reserved identifiers in C# backend --- .../couscous/backends/SourceCodeWriter.java | 13 ++- .../couscous/backends/csharp/CsharpSerializer.java | 105 ++++++++++++++++++++- .../couscous/backends/python/PythonSerializer.java | 6 +- .../java/org/zwobble/couscous/util/ExtraSets.java | 4 +- 4 files changed, 121 insertions(+), 7 deletions(-) (limited to 'src/main/java/org') 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 reservedIdentifiers; + private final Function mangleReservedIdentifier; private int depth = 0; - public SourceCodeWriter(WriterAction blockStart, WriterAction blockEnd) { + public SourceCodeWriter(WriterAction blockStart, WriterAction blockEnd, Set reservedIdentifiers, Function 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 RESERVED_TYPE_IDENTIFIERS = set( + "bool", + "byte", + "char", + "decimal", + "double", + "float", + "int", + "long", + "object", + "sbyte", + "short", + "string", + "uint", + "ulong", + "ushort", + "void"); + + private static final Set RESERVED_IDENTIFIERS; + + static { + ImmutableSet.Builder 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() { @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 Set set(T value1, T value2) { - return ImmutableSet.of(value1, value2); + public static Set set(T... values) { + return ImmutableSet.copyOf(values); } } -- cgit v1.2.3