aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main/java/org/zwobble/couscous/ast/LiteralNode.java2
-rw-r--r--src/main/java/org/zwobble/couscous/backends/csharp/CsharpSerializer.java7
-rw-r--r--src/test/java/org/zwobble/couscous/tests/backends/csharp/CsharpCompilerMethodTests.java7
-rw-r--r--src/test/java/org/zwobble/couscous/tests/backends/csharp/CsharpMethodRunner.java33
-rw-r--r--src/test/java/org/zwobble/couscous/tests/backends/csharp/CsharpSerializerTests.java6
5 files changed, 36 insertions, 19 deletions
diff --git a/src/main/java/org/zwobble/couscous/ast/LiteralNode.java b/src/main/java/org/zwobble/couscous/ast/LiteralNode.java
index 923bb2f..a76ca80 100644
--- a/src/main/java/org/zwobble/couscous/ast/LiteralNode.java
+++ b/src/main/java/org/zwobble/couscous/ast/LiteralNode.java
@@ -7,6 +7,8 @@ import org.zwobble.couscous.values.*;
import static org.zwobble.couscous.values.PrimitiveValues.value;
public class LiteralNode implements ExpressionNode {
+ public static final ExpressionNode UNIT = literal(PrimitiveValues.UNIT);
+
public static LiteralNode literal(PrimitiveValue value) {
return new LiteralNode(value, value.getType());
}
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 0292320..e47b732 100644
--- a/src/main/java/org/zwobble/couscous/backends/csharp/CsharpSerializer.java
+++ b/src/main/java/org/zwobble/couscous/backends/csharp/CsharpSerializer.java
@@ -4,6 +4,7 @@ import org.zwobble.couscous.ast.*;
import org.zwobble.couscous.ast.visitors.NodeVisitor;
import org.zwobble.couscous.backends.SourceCodeWriter;
import org.zwobble.couscous.values.PrimitiveValueVisitor;
+import org.zwobble.couscous.values.UnitValue;
import java.util.List;
@@ -176,8 +177,10 @@ public class CsharpSerializer implements NodeVisitor {
public void visit(ReturnNode returnNode) {
writer.writeStatement(() -> {
writer.writeKeyword("return");
- writer.writeSpace();
- write(returnNode.getValue());
+ if (!returnNode.getValue().getType().equals(UnitValue.REF)) {
+ writer.writeSpace();
+ write(returnNode.getValue());
+ }
writer.writeSymbol(";");
});
}
diff --git a/src/test/java/org/zwobble/couscous/tests/backends/csharp/CsharpCompilerMethodTests.java b/src/test/java/org/zwobble/couscous/tests/backends/csharp/CsharpCompilerMethodTests.java
index 8817644..41c57a7 100644
--- a/src/test/java/org/zwobble/couscous/tests/backends/csharp/CsharpCompilerMethodTests.java
+++ b/src/test/java/org/zwobble/couscous/tests/backends/csharp/CsharpCompilerMethodTests.java
@@ -1,16 +1,9 @@
package org.zwobble.couscous.tests.backends.csharp;
-import org.junit.Ignore;
-import org.junit.Test;
import org.zwobble.couscous.tests.BackendMethodTests;
import org.zwobble.couscous.tests.MethodRunner;
public class CsharpCompilerMethodTests extends BackendMethodTests {
- @Ignore
- @Test
- public void methodWithNoStatementsReturnsUnit() {
- }
-
@Override
protected MethodRunner buildMethodRunner() {
return new CsharpMethodRunner();
diff --git a/src/test/java/org/zwobble/couscous/tests/backends/csharp/CsharpMethodRunner.java b/src/test/java/org/zwobble/couscous/tests/backends/csharp/CsharpMethodRunner.java
index 5d9c27d..3915482 100644
--- a/src/test/java/org/zwobble/couscous/tests/backends/csharp/CsharpMethodRunner.java
+++ b/src/test/java/org/zwobble/couscous/tests/backends/csharp/CsharpMethodRunner.java
@@ -1,6 +1,7 @@
package org.zwobble.couscous.tests.backends.csharp;
import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Iterables;
import com.google.common.collect.Iterators;
import org.hamcrest.Matchers;
import org.zwobble.couscous.Backend;
@@ -14,9 +15,7 @@ import org.zwobble.couscous.backends.python.PythonCodeGenerator;
import org.zwobble.couscous.tests.MethodRunner;
import org.zwobble.couscous.tests.backends.Processes;
import org.zwobble.couscous.util.ExtraLists;
-import org.zwobble.couscous.values.ObjectValues;
-import org.zwobble.couscous.values.PrimitiveValue;
-import org.zwobble.couscous.values.StringValue;
+import org.zwobble.couscous.values.*;
import java.io.IOException;
import java.nio.file.Files;
@@ -41,7 +40,11 @@ public class CsharpMethodRunner implements MethodRunner {
Backend compiler = new CsharpBackend(directoryPath, NAMESPACE);
try {
compiler.compile(classNodes);
- return runFunction(directoryPath, className, methodName, arguments);
+ ClassNode classNode = Iterables.find(classNodes, c -> c.getName().equals(className));
+ boolean isVoid = Iterables.find(classNode.getMethods(), method -> method.getName().equals(methodName))
+ .getReturnType()
+ .equals(UnitValue.REF);
+ return runFunction(directoryPath, className, methodName, arguments, isVoid);
} finally {
deleteRecursively(directoryPath.toFile());
}
@@ -50,11 +53,12 @@ public class CsharpMethodRunner implements MethodRunner {
}
}
- public static PrimitiveValue runFunction(
+ private static PrimitiveValue runFunction(
Path directoryPath,
TypeName className,
String methodName,
- List<PrimitiveValue> arguments)
+ List<PrimitiveValue> arguments,
+ boolean isVoid)
throws IOException, InterruptedException
{
// TODO: use arguments
@@ -68,12 +72,17 @@ public class CsharpMethodRunner implements MethodRunner {
eagerMap(arguments, LiteralNode::literal),
// TODO: pass in return type
ObjectValues.OBJECT));
+
+ String body = isVoid
+ ? value + ";"
+ : "var value = " + value + ";" +
+ " System.Console.WriteLine(value.GetType());" +
+ " System.Console.WriteLine(value);";
+
String program =
"public class MethodRunnerExample { " +
" public static void Main() { " +
- " var value = " + value + ";" +
- " System.Console.WriteLine(value.GetType());" +
- " System.Console.WriteLine(value);" +
+ " " + body +
" }" +
"}";
Files.write(directoryPath.resolve("MethodRunnerExample.cs"), list(program));
@@ -83,7 +92,11 @@ public class CsharpMethodRunner implements MethodRunner {
findCsharpFiles(directoryPath)),
directoryPath);
String output = Processes.run(list("mono", "MethodRunnerExample.exe"), directoryPath);
- return readPrimitive(output);
+ if (isVoid) {
+ return PrimitiveValues.UNIT;
+ } else {
+ return readPrimitive(output);
+ }
}
private static List<String> findCsharpFiles(Path directoryPath) throws IOException {
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 3f4ef60..6bc191c 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
@@ -155,6 +155,12 @@ public class CsharpSerializerTests {
}
@Test
+ public void noValueIsSpecifiedWhenReturningUnit() {
+ String output = serialize(returns(LiteralNode.UNIT));
+ assertEquals("return;\n", output);
+ }
+
+ @Test
public void expressionStatementWritesExpression() {
String output = serialize(expressionStatement(literal(true)));
assertEquals("true;\n", output);