aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/org')
-rw-r--r--src/main/java/org/zwobble/couscous/backends/SourceCodeWriter.java (renamed from src/main/java/org/zwobble/couscous/backends/python/PythonWriter.java)31
-rw-r--r--src/main/java/org/zwobble/couscous/backends/csharp/CsharpSerializer.java31
-rw-r--r--src/main/java/org/zwobble/couscous/backends/csharp/CsharpWriter.java38
-rw-r--r--src/main/java/org/zwobble/couscous/backends/python/PythonSerializer.java7
4 files changed, 51 insertions, 56 deletions
diff --git a/src/main/java/org/zwobble/couscous/backends/python/PythonWriter.java b/src/main/java/org/zwobble/couscous/backends/SourceCodeWriter.java
index 9112381..3cb4e64 100644
--- a/src/main/java/org/zwobble/couscous/backends/python/PythonWriter.java
+++ b/src/main/java/org/zwobble/couscous/backends/SourceCodeWriter.java
@@ -1,13 +1,31 @@
-package org.zwobble.couscous.backends.python;
+package org.zwobble.couscous.backends;
+import com.google.common.base.Strings;
import org.zwobble.couscous.util.Action;
-import com.google.common.base.Strings;
+public class SourceCodeWriter {
+ public interface WriterAction {
+ void run(SourceCodeWriter writer, int indentation);
+ }
-public class PythonWriter {
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();
@@ -45,13 +63,14 @@ public class PythonWriter {
}
public void startBlock() {
+ runAction(blockStart);
depth++;
- writeSymbol(":");
builder.append("\n");
}
public void endBlock() {
depth--;
+ runAction(blockEnd);
}
public void writeStatement(Action action) {
@@ -69,4 +88,8 @@ public class PythonWriter {
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<Void>() {
@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;
}