aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2016-01-16 16:15:51 +0000
committerMichael Williamson <mike@zwobble.org>2016-01-16 16:15:51 +0000
commitb332717af88b5b613d60ec72af820b696e7e2c7a (patch)
tree058eee425567060eb456935711140aa6e232244b /src
parente886b0ddb09f1bc247858c3ff5405651c66f0ae8 (diff)
Add support for custom constructors
Diffstat (limited to 'src')
-rw-r--r--src/main/java/org/zwobble/couscous/backends/csharp/CsharpSerializer.java31
-rw-r--r--src/test/java/org/zwobble/couscous/tests/BackendEvalTests.java1
-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.java15
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"))