diff options
Diffstat (limited to 'src')
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 |
