aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-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
-rw-r--r--src/test/java/org/zwobble/couscous/tests/backends/csharp/CsharpCompilerEvalTests.java5
-rw-r--r--src/test/java/org/zwobble/couscous/tests/backends/csharp/CsharpSerializerTests.java31
5 files changed, 67 insertions, 28 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()) {
diff --git a/src/test/java/org/zwobble/couscous/tests/backends/csharp/CsharpCompilerEvalTests.java b/src/test/java/org/zwobble/couscous/tests/backends/csharp/CsharpCompilerEvalTests.java
index 2348acf..b8aa1b4 100644
--- a/src/test/java/org/zwobble/couscous/tests/backends/csharp/CsharpCompilerEvalTests.java
+++ b/src/test/java/org/zwobble/couscous/tests/backends/csharp/CsharpCompilerEvalTests.java
@@ -47,11 +47,6 @@ public class CsharpCompilerEvalTests extends BackendEvalTests {
@Test
@Ignore
- public void canCallInstanceMethodWithArgumentsOnUserDefinedClass() {
- }
-
- @Test
- @Ignore
public void constructorIsExecutedOnConstruction() {
}
diff --git a/src/test/java/org/zwobble/couscous/tests/backends/csharp/CsharpSerializerTests.java b/src/test/java/org/zwobble/couscous/tests/backends/csharp/CsharpSerializerTests.java
index 1139e3c..377712c 100644
--- a/src/test/java/org/zwobble/couscous/tests/backends/csharp/CsharpSerializerTests.java
+++ b/src/test/java/org/zwobble/couscous/tests/backends/csharp/CsharpSerializerTests.java
@@ -7,6 +7,7 @@ import org.zwobble.couscous.tests.TestIds;
import static org.junit.Assert.assertEquals;
import static org.zwobble.couscous.ast.ConstructorCallNode.constructorCall;
+import static org.zwobble.couscous.ast.FormalArgumentNode.formalArg;
import static org.zwobble.couscous.ast.LiteralNode.literal;
import static org.zwobble.couscous.ast.MethodCallNode.methodCall;
import static org.zwobble.couscous.ast.ReturnNode.returns;
@@ -66,6 +67,16 @@ public class CsharpSerializerTests {
}
@Test
+ public void methodCallWithArguments() {
+ String output = serialize(methodCall(
+ reference(var(TestIds.ANY_ID, "x", TypeName.of("X"))),
+ "y",
+ list(literal(1), literal(2)),
+ TypeName.of("Y")));
+ assertEquals("x.y(1, 2)", output);
+ }
+
+ @Test
public void constructorCallWithNoArguments() {
String output = serialize(constructorCall(
TypeName.of("X"),
@@ -74,6 +85,14 @@ public class CsharpSerializerTests {
}
@Test
+ public void constructorCallWithArguments() {
+ String output = serialize(constructorCall(
+ TypeName.of("X"),
+ list(literal(1), literal(2))));
+ assertEquals("new Couscous.X(1, 2)", output);
+ }
+
+ @Test
public void returnStatementUsesReturnStatement() {
String output = serialize(returns(literal(true)));
assertEquals("return true;", output);
@@ -92,6 +111,18 @@ public class CsharpSerializerTests {
}
@Test
+ public void methodWithArguments() {
+ MethodNode methodNode = MethodNode.staticMethod("nothing")
+ .argument(formalArg(var(TestIds.id("x"), "x", TypeName.of("X"))))
+ .argument(formalArg(var(TestIds.id("y"), "y", TypeName.of("Y"))))
+ .build();
+
+ String output = serialize(methodNode);
+
+ assertEquals("internal static dynamic nothing(dynamic x, dynamic y) {\n}\n", output);
+ }
+
+ @Test
public void methodHasSerializedBody() {
MethodNode method = MethodNode.staticMethod("nothing")
.statement(returns(literal(true)))