aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main/java/org/zwobble/couscous/ast/ClassNodeBuilder.java9
-rw-r--r--src/main/java/org/zwobble/couscous/ast/MethodNode.java5
-rw-r--r--src/main/java/org/zwobble/couscous/backends/csharp/CsharpSerializer.java11
-rw-r--r--src/test/java/org/zwobble/couscous/tests/BackendEvalTests.java3
-rw-r--r--src/test/java/org/zwobble/couscous/tests/MethodRunner.java1
-rw-r--r--src/test/java/org/zwobble/couscous/tests/backends/csharp/CsharpMethodRunner.java9
-rw-r--r--src/test/java/org/zwobble/couscous/tests/backends/csharp/CsharpSerializerTests.java19
7 files changed, 46 insertions, 11 deletions
diff --git a/src/main/java/org/zwobble/couscous/ast/ClassNodeBuilder.java b/src/main/java/org/zwobble/couscous/ast/ClassNodeBuilder.java
index b41c972..f1240f6 100644
--- a/src/main/java/org/zwobble/couscous/ast/ClassNodeBuilder.java
+++ b/src/main/java/org/zwobble/couscous/ast/ClassNodeBuilder.java
@@ -2,6 +2,7 @@ package org.zwobble.couscous.ast;
import com.google.common.collect.ImmutableList;
import org.zwobble.couscous.ast.identifiers.Identifier;
+import org.zwobble.couscous.values.UnitValue;
import java.util.Optional;
import java.util.function.Function;
@@ -21,7 +22,6 @@ public class ClassNodeBuilder {
this.fields = ImmutableList.builder();
this.constructor = Optional.empty();
this.methods = ImmutableList.builder();
-
}
public ClassNodeBuilder(String name) {
@@ -76,6 +76,7 @@ public class ClassNodeBuilder {
.isStatic(isStatic)
.annotations(builder.annotations.build())
.arguments(builder.arguments.build())
+ .returns(builder.returnType)
.body(builder.statements.build())
.build());
}
@@ -93,6 +94,7 @@ public class ClassNodeBuilder {
private final Function<MethodBuilder<?>, T> build;
private final ImmutableList.Builder<AnnotationNode> annotations;
private final ImmutableList.Builder<FormalArgumentNode> arguments;
+ private TypeName returnType = UnitValue.REF;
private final ImmutableList.Builder<StatementNode> statements;
public MethodBuilder(Function<MethodBuilder<?>, T> build) {
@@ -115,6 +117,11 @@ public class ClassNodeBuilder {
arguments.add(formalArg(var(id, name, type)));
return this;
}
+
+ public MethodBuilder<T> returns(TypeName returnType) {
+ this.returnType = returnType;
+ return this;
+ }
public MethodBuilder<T> argument(FormalArgumentNode argument) {
arguments.add(argument);
diff --git a/src/main/java/org/zwobble/couscous/ast/MethodNode.java b/src/main/java/org/zwobble/couscous/ast/MethodNode.java
index d67bb1e..5ee3a7d 100644
--- a/src/main/java/org/zwobble/couscous/ast/MethodNode.java
+++ b/src/main/java/org/zwobble/couscous/ast/MethodNode.java
@@ -51,6 +51,11 @@ public class MethodNode implements CallableNode {
this.arguments.addAll(arguments);
return this;
}
+
+ public Builder returns(TypeName returnType) {
+ this.returnType = returnType;
+ return this;
+ }
public Builder statement(StatementNode statement) {
this.body.add(statement);
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 ef13854..1d05081 100644
--- a/src/main/java/org/zwobble/couscous/backends/csharp/CsharpSerializer.java
+++ b/src/main/java/org/zwobble/couscous/backends/csharp/CsharpSerializer.java
@@ -4,15 +4,18 @@ import com.google.common.collect.ImmutableMap;
import org.zwobble.couscous.ast.*;
import org.zwobble.couscous.ast.visitors.NodeVisitor;
import org.zwobble.couscous.backends.SourceCodeWriter;
-import org.zwobble.couscous.values.IntegerValue;
-import org.zwobble.couscous.values.PrimitiveValueVisitor;
+import org.zwobble.couscous.values.*;
import java.util.List;
import java.util.Map;
public class CsharpSerializer implements NodeVisitor {
private final static Map<TypeName, String> PRIMITIVES = ImmutableMap.of(
- IntegerValue.REF, "int");
+ IntegerValue.REF, "int",
+ StringValue.REF, "string",
+ BooleanValue.REF, "bool",
+ ObjectValues.CLASS, "System.Type",
+ UnitValue.REF, "void");
public static String serialize(Node node, String namespace) {
SourceCodeWriter writer = new SourceCodeWriter(
@@ -202,7 +205,7 @@ public class CsharpSerializer implements NodeVisitor {
writer.writeKeyword("static");
writer.writeSpace();
}
- writer.writeKeyword("dynamic");
+ writeTypeReference(method.getReturnType());
writer.writeSpace();
writer.writeIdentifier(method.getName());
writer.writeSymbol("(");
diff --git a/src/test/java/org/zwobble/couscous/tests/BackendEvalTests.java b/src/test/java/org/zwobble/couscous/tests/BackendEvalTests.java
index bdd492d..3bac39d 100644
--- a/src/test/java/org/zwobble/couscous/tests/BackendEvalTests.java
+++ b/src/test/java/org/zwobble/couscous/tests/BackendEvalTests.java
@@ -154,6 +154,7 @@ public abstract class BackendEvalTests {
public void canCallStaticMethodFromUserDefinedStaticMethod() {
ClassNode classNode = ClassNode.builder("com.example.Example")
.staticMethod("main", method -> method
+ .returns(IntegerValue.REF)
.statement(returns(staticMethodCall(
"java.lang.Integer",
"parseInt",
@@ -169,6 +170,7 @@ public abstract class BackendEvalTests {
public void canCallInstanceMethodWithNoArgumentsOnUserDefinedClass() {
ClassNode classNode = ClassNode.builder("com.example.Example")
.method("main", method -> method
+ .returns(IntegerValue.REF)
.statement(returns(literal(42))))
.build();
PrimitiveValue result = evalExpression(list(classNode),
@@ -182,6 +184,7 @@ public abstract class BackendEvalTests {
ClassNode classNode = ClassNode.builder("com.example.Example")
.method("main", method -> method
.argument(argument)
+ .returns(IntegerValue.REF)
.statement(returns(reference(argument))))
.build();
diff --git a/src/test/java/org/zwobble/couscous/tests/MethodRunner.java b/src/test/java/org/zwobble/couscous/tests/MethodRunner.java
index 1a856ba..ed486fc 100644
--- a/src/test/java/org/zwobble/couscous/tests/MethodRunner.java
+++ b/src/test/java/org/zwobble/couscous/tests/MethodRunner.java
@@ -19,6 +19,7 @@ public interface MethodRunner {
default PrimitiveValue evalExpression(List<ClassNode> classes, ExpressionNode expression) {
ClassNode programNode = ClassNode.builder("Program")
.method(MethodNode.staticMethod("run")
+ .returns(expression.getType())
.statement(ReturnNode.returns(expression))
.build())
.build();
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 0adb5fc..104308b 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
@@ -13,6 +13,7 @@ import org.zwobble.couscous.tests.MethodRunner;
import org.zwobble.couscous.tests.backends.Processes;
import org.zwobble.couscous.util.ExtraLists;
import org.zwobble.couscous.values.PrimitiveValue;
+import org.zwobble.couscous.values.StringValue;
import java.io.IOException;
import java.nio.file.Files;
@@ -97,8 +98,12 @@ public class CsharpMethodRunner implements MethodRunner {
case "System.Boolean":
return value(value.equals("True"));
case "System.MonoType":
- assertThat(value, Matchers.startsWith(NAMESPACE_PREFIX));
- return value(TypeName.of(value.substring(NAMESPACE_PREFIX.length())));
+ if (value.equals("System.String")) {
+ return value(StringValue.REF);
+ } else {
+ assertThat(value, Matchers.startsWith(NAMESPACE_PREFIX));
+ return value(TypeName.of(value.substring(NAMESPACE_PREFIX.length())));
+ }
default:
throw new RuntimeException("Unhandled type: " + type);
}
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 22eeac0..2ca2917 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
@@ -112,13 +112,24 @@ public class CsharpSerializerTests {
@Test
public void methodHasDynamicReturnType() {
String output = serialize(MethodNode.staticMethod("nothing").build());
- assertEquals("internal static dynamic nothing() {\n}\n", output);
+ assertEquals("internal static void nothing() {\n}\n", output);
}
@Test
public void instanceMethodHasNoStaticKeword() {
String output = serialize(MethodNode.builder("nothing").build());
- assertEquals("internal dynamic nothing() {\n}\n", output);
+ assertEquals("internal void nothing() {\n}\n", output);
+ }
+
+ @Test
+ public void methodWithReturnType() {
+ MethodNode methodNode = MethodNode.staticMethod("nothing")
+ .returns(TypeName.of("X"))
+ .build();
+
+ String output = serialize(methodNode);
+
+ assertEquals("internal static Couscous.X nothing() {\n}\n", output);
}
@Test
@@ -130,7 +141,7 @@ public class CsharpSerializerTests {
String output = serialize(methodNode);
- assertEquals("internal static dynamic nothing(Couscous.X x, Couscous.Y y) {\n}\n", output);
+ assertEquals("internal static void nothing(Couscous.X x, Couscous.Y y) {\n}\n", output);
}
@Test
@@ -139,7 +150,7 @@ public class CsharpSerializerTests {
.statement(returns(literal(true)))
.build();
String output = serialize(method);
- assertEquals("internal static dynamic nothing() {\n return true;\n}\n", output);
+ assertEquals("internal static void nothing() {\n return true;\n}\n", output);
}
@Test