aboutsummaryrefslogtreecommitdiff
path: root/src/main
diff options
context:
space:
mode:
Diffstat (limited to 'src/main')
-rw-r--r--src/main/java/org/zwobble/couscous/backends/SourceCodeWriter.java15
-rw-r--r--src/main/java/org/zwobble/couscous/backends/csharp/CsharpSerializer.java18
-rw-r--r--src/main/java/org/zwobble/couscous/backends/python/PythonSerializer.java26
3 files changed, 36 insertions, 23 deletions
diff --git a/src/main/java/org/zwobble/couscous/backends/SourceCodeWriter.java b/src/main/java/org/zwobble/couscous/backends/SourceCodeWriter.java
index 3f135de..a50515f 100644
--- a/src/main/java/org/zwobble/couscous/backends/SourceCodeWriter.java
+++ b/src/main/java/org/zwobble/couscous/backends/SourceCodeWriter.java
@@ -3,6 +3,11 @@ package org.zwobble.couscous.backends;
import com.google.common.base.Strings;
import org.zwobble.couscous.util.Action;
+import java.util.List;
+import java.util.function.Consumer;
+
+import static com.google.common.collect.Iterables.skip;
+
public class SourceCodeWriter {
public interface WriterAction {
void run(SourceCodeWriter writer);
@@ -85,4 +90,14 @@ public class SourceCodeWriter {
private void runAction(WriterAction action) {
action.run(this);
}
+
+ public <T> void writeWithSeparator(List<T> values, Consumer<T> writeValue, Action separator) {
+ if (!values.isEmpty()) {
+ writeValue.accept(values.get(0));
+ for (T value : skip(values, 1)) {
+ separator.run();
+ writeValue.accept(value);
+ }
+ }
+ }
}
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 f034975..187a44a 100644
--- a/src/main/java/org/zwobble/couscous/backends/csharp/CsharpSerializer.java
+++ b/src/main/java/org/zwobble/couscous/backends/csharp/CsharpSerializer.java
@@ -5,6 +5,8 @@ import org.zwobble.couscous.ast.visitors.NodeVisitor;
import org.zwobble.couscous.backends.SourceCodeWriter;
import org.zwobble.couscous.values.PrimitiveValueVisitor;
+import java.util.List;
+
public class CsharpSerializer implements NodeVisitor {
public static String serialize(Node node, String namespace) {
SourceCodeWriter writer = new SourceCodeWriter(
@@ -103,8 +105,7 @@ public class CsharpSerializer implements NodeVisitor {
write(methodCall.getReceiver());
writer.writeSymbol(".");
writer.writeIdentifier(methodCall.getMethodName());
- writer.writeSymbol("(");
- writer.writeSymbol(")");
+ writeArguments(methodCall.getArguments());
}
@Override
@@ -112,7 +113,12 @@ public class CsharpSerializer implements NodeVisitor {
writer.writeKeyword("new");
writer.writeSpace();
writeTypeReference(call.getType());
+ writeArguments(call.getArguments());
+ }
+
+ private void writeArguments(List<? extends ExpressionNode> arguments) {
writer.writeSymbol("(");
+ writer.writeWithSeparator(arguments, this::write, () -> writer.writeSymbol(", "));
writer.writeSymbol(")");
}
@@ -203,6 +209,14 @@ public class CsharpSerializer implements NodeVisitor {
writer.writeSpace();
writer.writeIdentifier(method.getName());
writer.writeSymbol("(");
+ writer.writeWithSeparator(
+ method.getArguments(),
+ argument -> {
+ writer.writeKeyword("dynamic");
+ writer.writeSpace();
+ writer.writeIdentifier(argument.getName());
+ },
+ () -> writer.writeSymbol(", "));
writer.writeSymbol(")");
writer.startBlock();
for (StatementNode statement : method.getBody()) {
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 fa71656..d3771d3 100644
--- a/src/main/java/org/zwobble/couscous/backends/python/PythonSerializer.java
+++ b/src/main/java/org/zwobble/couscous/backends/python/PythonSerializer.java
@@ -3,12 +3,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;
-
-import java.util.List;
-import java.util.function.Consumer;
-
-import static com.google.common.collect.Iterables.skip;
public class PythonSerializer implements PythonNodeVisitor {
public static String serialize(PythonNode node) {
@@ -75,7 +69,7 @@ public class PythonSerializer implements PythonNodeVisitor {
public void visit(PythonCallNode call) {
writeParenthesised(call.getCallee(), call);
writer.writeSymbol("(");
- writeWithSeparator(call.getArguments(), this::write, () -> {
+ writer.writeWithSeparator(call.getArguments(), this::write, () -> {
writer.writeSymbol(",");
writer.writeSpace();
});
@@ -86,7 +80,7 @@ public class PythonSerializer implements PythonNodeVisitor {
public void visit(PythonGetSliceNode getSlice) {
writeParenthesised(getSlice.getReceiver(), getSlice);
writer.writeSymbol("[");
- writeWithSeparator(getSlice.getArguments(), this::write, () -> {
+ writer.writeWithSeparator(getSlice.getArguments(), this::write, () -> {
writer.writeSymbol(":");
});
writer.writeSymbol("]");
@@ -170,7 +164,7 @@ public class PythonSerializer implements PythonNodeVisitor {
writer.writeSpace();
writer.writeKeyword("import");
writer.writeSpace();
- writeWithSeparator(importNode.getAliases(), alias -> {
+ writer.writeWithSeparator(importNode.getAliases(), alias -> {
writer.writeIdentifier(alias.getName());
}, () -> {
writer.writeSymbol(",");
@@ -215,22 +209,12 @@ public class PythonSerializer implements PythonNodeVisitor {
}
private void writeArgumentNames(PythonFunctionDefinitionNode functionDefinition) {
- writeWithSeparator(functionDefinition.getArgumentNames(), writer::writeIdentifier, () -> {
+ writer.writeWithSeparator(functionDefinition.getArgumentNames(), writer::writeIdentifier, () -> {
writer.writeSymbol(",");
writer.writeSpace();
});
}
-
- private <T> void writeWithSeparator(List<T> values, Consumer<T> writeValue, Action separator) {
- if (!values.isEmpty()) {
- writeValue.accept(values.get(0));
- for (T value : skip(values, 1)) {
- separator.run();
- writeValue.accept(value);
- }
- }
- }
-
+
@Override
public void visit(PythonModuleNode module) {
for (PythonStatementNode statement : module.getStatements()) {