diff options
Diffstat (limited to 'src')
4 files changed, 41 insertions, 11 deletions
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 861caec..ae898f5 100644 --- a/src/main/java/org/zwobble/couscous/backends/csharp/CsharpSerializer.java +++ b/src/main/java/org/zwobble/couscous/backends/csharp/CsharpSerializer.java @@ -219,18 +219,22 @@ public class CsharpSerializer implements NodeVisitor { writeTypeReference(method.getReturnType()); writer.writeSpace(); writer.writeIdentifier(method.getName()); - writer.writeSymbol("("); - writer.writeWithSeparator( - method.getArguments(), - this::write, - () -> writer.writeSymbol(", ")); - writer.writeSymbol(")"); + writeFormalArguments(method.getArguments()); writer.startBlock(); writeAll(method.getBody()); writer.endBlock(); }); } + private void writeFormalArguments(List<FormalArgumentNode> arguments) { + writer.writeSymbol("("); + writer.writeWithSeparator( + arguments, + this::write, + () -> writer.writeSymbol(", ")); + writer.writeSymbol(")"); + } + @Override public void visit(ConstructorNode constructorNode) { throw new UnsupportedOperationException(); @@ -266,6 +270,7 @@ public class CsharpSerializer implements NodeVisitor { writer.writeIdentifier(classNode.getSimpleName()); writer.startBlock(); writeAll(classNode.getFields()); + writeConstructor(classNode, classNode.getConstructor()); writeAll(classNode.getMethods()); writer.endBlock(); }); @@ -273,6 +278,20 @@ public class CsharpSerializer implements NodeVisitor { writer.endBlock(); } + private void writeConstructor(ClassNode classNode, ConstructorNode constructor) { + if (!constructor.equals(ConstructorNode.DEFAULT)) { + writer.writeStatement(() -> { + writer.writeKeyword("internal"); + writer.writeSpace(); + writer.writeIdentifier(classNode.getSimpleName()); + writeFormalArguments(constructor.getArguments()); + writer.startBlock(); + writeAll(constructor.getBody()); + writer.endBlock(); + }); + } + } + private void writeAll(List<? extends Node> nodes) { for (Node method : nodes) { write(method); diff --git a/src/test/java/org/zwobble/couscous/tests/BackendEvalTests.java b/src/test/java/org/zwobble/couscous/tests/BackendEvalTests.java index 3bac39d..41ce893 100644 --- a/src/test/java/org/zwobble/couscous/tests/BackendEvalTests.java +++ b/src/test/java/org/zwobble/couscous/tests/BackendEvalTests.java @@ -210,6 +210,7 @@ public abstract class BackendEvalTests { fieldAccess(constructor.thisReference(), "value", IntegerValue.REF), reference(argument)))) .method("main", method -> method + .returns(IntegerValue.REF) .statement(returns( fieldAccess(method.thisReference(), "value", IntegerValue.REF)))) .build(); 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 b8aa1b4..79c4a6d 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 @@ -45,11 +45,6 @@ public class CsharpCompilerEvalTests extends BackendEvalTests { public void canCallStaticMethodFromUserDefinedStaticMethod() { } - @Test - @Ignore - public void constructorIsExecutedOnConstruction() { - } - @Override protected PrimitiveValue evalExpression(List<ClassNode> classes, ExpressionNode expression) { return new CsharpMethodRunner().evalExpression(classes, expression); 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 30a6f2b..011fcd3 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 @@ -198,6 +198,21 @@ public class CsharpSerializerTests { } @Test + public void constructorHasSerializedBody() { + ConstructorNode constructor = ConstructorNode.constructor( + list(formalArg(var(TestIds.ANY_ID, "x", TypeName.of("X")))), + list(expressionStatement(literal(true)))); + ClassNode classNode = ClassNode.builder("com.example.Example") + .constructor(constructor) + .build(); + + String output = serialize(classNode); + + assertEquals( + "namespace Couscous.com.example {\n internal class Example {\n internal Example(Couscous.X x) {\n true;\n }\n }\n}\n", output); + } + + @Test public void classWithFields() { ClassNode classNode = ClassNode.builder("com.example.Example") .field("x", TypeName.of("X")) |
