aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org/zwobble/couscous/backends/SourceCodeWriter.java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2016-01-16 14:52:18 +0000
committerMichael Williamson <mike@zwobble.org>2016-01-16 14:52:18 +0000
commitaa02301717037a48b1fdfbadd26e341213df15b5 (patch)
treea46b2dfe88556ead6d78aa6c44d8eebbcbfb8392 /src/main/java/org/zwobble/couscous/backends/SourceCodeWriter.java
parent1825bb87182562003d223c0c74f110406eea36cc (diff)
Combine Python and C# writers
Diffstat (limited to 'src/main/java/org/zwobble/couscous/backends/SourceCodeWriter.java')
-rw-r--r--src/main/java/org/zwobble/couscous/backends/SourceCodeWriter.java95
1 files changed, 95 insertions, 0 deletions
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);
+ }
+}