From aa02301717037a48b1fdfbadd26e341213df15b5 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sat, 16 Jan 2016 14:52:18 +0000 Subject: Combine Python and C# writers --- .../couscous/backends/SourceCodeWriter.java | 95 ++++++++++++++++++++++ .../couscous/backends/csharp/CsharpSerializer.java | 31 ++++--- .../couscous/backends/csharp/CsharpWriter.java | 38 --------- .../couscous/backends/python/PythonSerializer.java | 7 +- .../couscous/backends/python/PythonWriter.java | 72 ---------------- 5 files changed, 119 insertions(+), 124 deletions(-) create mode 100644 src/main/java/org/zwobble/couscous/backends/SourceCodeWriter.java delete mode 100644 src/main/java/org/zwobble/couscous/backends/csharp/CsharpWriter.java delete mode 100644 src/main/java/org/zwobble/couscous/backends/python/PythonWriter.java (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 new file mode 100644 index 0000000..3cb4e64 --- /dev/null +++ b/src/main/java/org/zwobble/couscous/backends/SourceCodeWriter.java @@ -0,0 +1,95 @@ +package org.zwobble.couscous.backends; + +import com.google.common.base.Strings; +import org.zwobble.couscous.util.Action; + +public class SourceCodeWriter { + public interface WriterAction { + void run(SourceCodeWriter writer, int indentation); + } + + private static final int SPACES_PER_INDENT = 4; + private final StringBuilder builder = new StringBuilder(); + + private final WriterAction blockStart; + private final WriterAction blockEnd; + private int depth = 0; + + public SourceCodeWriter() { + this( + (writer, indentation) -> writer.writeSymbol(":"), + (writer, indentation) -> {} + ); + } + + public SourceCodeWriter(WriterAction blockStart, WriterAction blockEnd) { + this.blockStart = blockStart; + this.blockEnd = blockEnd; + } + + public String asString() { + return builder.toString(); + } + + public void writeInteger(int value) { + builder.append(value); + } + + public void writeStringLiteral(String value) { + builder.append("\""); + builder.append(value + .replace("\\", "\\\\") + .replace("\"", "\\\"") + .replace("\n", "\\n") + .replace("\r", "\\r") + .replace("\t", "\\t")); + builder.append("\""); + } + + public void writeKeyword(String keyword) { + builder.append(keyword); + } + + public void writeSpace() { + builder.append(" "); + } + + public void writeIdentifier(String name) { + builder.append(name); + } + + public void writeSymbol(String symbol) { + builder.append(symbol); + } + + public void startBlock() { + runAction(blockStart); + depth++; + builder.append("\n"); + } + + public void endBlock() { + depth--; + runAction(blockEnd); + } + + public void writeStatement(Action action) { + startStatement(); + action.run(); + endStatement(); + } + + private void startStatement() { + builder.append(Strings.repeat(" ", depth * SPACES_PER_INDENT)); + } + + private void endStatement() { + if (builder.charAt(builder.length() - 1) != '\n') { + builder.append("\n"); + } + } + + private void runAction(WriterAction action) { + action.run(this, depth * SPACES_PER_INDENT); + } +} 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 8f7e137..43e6611 100644 --- a/src/main/java/org/zwobble/couscous/backends/csharp/CsharpSerializer.java +++ b/src/main/java/org/zwobble/couscous/backends/csharp/CsharpSerializer.java @@ -1,21 +1,33 @@ package org.zwobble.couscous.backends.csharp; +import com.google.common.base.Strings; import org.zwobble.couscous.ast.*; import org.zwobble.couscous.ast.visitors.NodeVisitor; +import org.zwobble.couscous.backends.SourceCodeWriter; import org.zwobble.couscous.values.PrimitiveValueVisitor; public class CsharpSerializer implements NodeVisitor { public static String serialize(Node node, String namespace) { - CsharpWriter writer = new CsharpWriter(); + SourceCodeWriter writer = new SourceCodeWriter( + (writer2, indentation) -> { + writer2.writeSpace(); + writer2.writeSymbol("{"); + }, + (writer2, indentation) -> { + writer2.writeSymbol(Strings.repeat(" ", indentation)); + writer2.writeSymbol("}"); + writer2.writeSymbol("\n"); + } + ); CsharpSerializer serializer = new CsharpSerializer(writer, namespace); serializer.write(node); return writer.asString(); } - private final CsharpWriter writer; + private final SourceCodeWriter writer; private final String namespace; - private CsharpSerializer(CsharpWriter writer, String namespace) { + private CsharpSerializer(SourceCodeWriter writer, String namespace) { this.writer = writer; this.namespace = namespace; } @@ -29,7 +41,7 @@ public class CsharpSerializer implements NodeVisitor { literal.getValue().accept(new PrimitiveValueVisitor() { @Override public Void visitInteger(int value) { - writer.writeIntegerLiteral(value); + writer.writeInteger(value); return null; } @@ -41,7 +53,7 @@ public class CsharpSerializer implements NodeVisitor { @Override public Void visitBoolean(boolean value) { - writer.writeBooleanLiteral(value); + writer.writeKeyword(value ? "true" : "false"); return null; } @@ -165,14 +177,11 @@ public class CsharpSerializer implements NodeVisitor { writer.writeIdentifier(method.getName()); writer.writeSymbol("("); writer.writeSymbol(")"); - writer.writeSpace(); - writer.writeSymbol("{"); + writer.startBlock(); for (StatementNode statement : method.getBody()) { - writer.writeSymbol("\n "); - write(statement); + writer.writeStatement(() -> write(statement)); } - writer.writeSymbol("\n"); - writer.writeSymbol("}"); + writer.endBlock(); } @Override diff --git a/src/main/java/org/zwobble/couscous/backends/csharp/CsharpWriter.java b/src/main/java/org/zwobble/couscous/backends/csharp/CsharpWriter.java deleted file mode 100644 index d3cfce2..0000000 --- a/src/main/java/org/zwobble/couscous/backends/csharp/CsharpWriter.java +++ /dev/null @@ -1,38 +0,0 @@ -package org.zwobble.couscous.backends.csharp; - -public class CsharpWriter { - private final StringBuilder builder = new StringBuilder(); - - public String asString() { - return builder.toString(); - } - - public void writeIntegerLiteral(int value) { - builder.append(Integer.toString(value)); - } - - public void writeStringLiteral(String value) { - // TODO: escaping - builder.append("\"" + value + "\""); - } - - public void writeBooleanLiteral(boolean value) { - builder.append(value ? "true" : "false"); - } - - public void writeKeyword(String keyword) { - builder.append(keyword); - } - - public void writeSymbol(String symbol) { - builder.append(symbol); - } - - public void writeIdentifier(String identifier) { - builder.append(identifier); - } - - public void writeSpace() { - builder.append(" "); - } -} 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 45739da..6105715 100644 --- a/src/main/java/org/zwobble/couscous/backends/python/PythonSerializer.java +++ b/src/main/java/org/zwobble/couscous/backends/python/PythonSerializer.java @@ -1,5 +1,6 @@ package org.zwobble.couscous.backends.python; +import org.zwobble.couscous.backends.SourceCodeWriter; import org.zwobble.couscous.backends.python.ast.*; import org.zwobble.couscous.backends.python.ast.visitors.PythonNodeVisitor; import org.zwobble.couscous.util.Action; @@ -11,15 +12,15 @@ import static com.google.common.collect.Iterables.skip; public class PythonSerializer implements PythonNodeVisitor { public static String serialize(PythonNode node) { - PythonWriter writer = new PythonWriter(); + SourceCodeWriter writer = new SourceCodeWriter(); PythonSerializer serializer = new PythonSerializer(writer); serializer.write(node); return writer.asString(); } - private final PythonWriter writer; + private final SourceCodeWriter writer; - private PythonSerializer(PythonWriter writer) { + private PythonSerializer(SourceCodeWriter writer) { this.writer = writer; } diff --git a/src/main/java/org/zwobble/couscous/backends/python/PythonWriter.java b/src/main/java/org/zwobble/couscous/backends/python/PythonWriter.java deleted file mode 100644 index 9112381..0000000 --- a/src/main/java/org/zwobble/couscous/backends/python/PythonWriter.java +++ /dev/null @@ -1,72 +0,0 @@ -package org.zwobble.couscous.backends.python; - -import org.zwobble.couscous.util.Action; - -import com.google.common.base.Strings; - -public class PythonWriter { - private static final int SPACES_PER_INDENT = 4; - private final StringBuilder builder = new StringBuilder(); - private int depth = 0; - - public String asString() { - return builder.toString(); - } - - public void writeInteger(int value) { - builder.append(value); - } - - public void writeStringLiteral(String value) { - builder.append("\""); - builder.append(value - .replace("\\", "\\\\") - .replace("\"", "\\\"") - .replace("\n", "\\n") - .replace("\r", "\\r") - .replace("\t", "\\t")); - builder.append("\""); - } - - public void writeKeyword(String keyword) { - builder.append(keyword); - } - - public void writeSpace() { - builder.append(" "); - } - - public void writeIdentifier(String name) { - builder.append(name); - } - - public void writeSymbol(String symbol) { - builder.append(symbol); - } - - public void startBlock() { - depth++; - writeSymbol(":"); - builder.append("\n"); - } - - public void endBlock() { - depth--; - } - - public void writeStatement(Action action) { - startStatement(); - action.run(); - endStatement(); - } - - private void startStatement() { - builder.append(Strings.repeat(" ", depth * SPACES_PER_INDENT)); - } - - private void endStatement() { - if (builder.charAt(builder.length() - 1) != '\n') { - builder.append("\n"); - } - } -} -- cgit v1.2.3