aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2016-04-17 15:47:28 +0100
committerMichael Williamson <mike@zwobble.org>2016-04-17 15:47:28 +0100
commita5f76463dfc74d9b126f65416a51905a995c711d (patch)
treeb1f1970250c5d8fb080c5d2f888d411b95ea68be /src
parentac60bfdc353f27253282224f5bc6b34b587643f0 (diff)
C# serializer: serialize try statements
Diffstat (limited to 'src')
-rw-r--r--src/main/java/org/zwobble/couscous/ast/ExceptionHandlerNode.java28
-rw-r--r--src/main/java/org/zwobble/couscous/ast/TryNode.java2
-rw-r--r--src/main/java/org/zwobble/couscous/backends/csharp/CsharpSerializer.java16
-rw-r--r--src/test/java/org/zwobble/couscous/tests/backends/csharp/CsharpSerializerTests.java14
4 files changed, 48 insertions, 12 deletions
diff --git a/src/main/java/org/zwobble/couscous/ast/ExceptionHandlerNode.java b/src/main/java/org/zwobble/couscous/ast/ExceptionHandlerNode.java
index a7e307b..5e80fcf 100644
--- a/src/main/java/org/zwobble/couscous/ast/ExceptionHandlerNode.java
+++ b/src/main/java/org/zwobble/couscous/ast/ExceptionHandlerNode.java
@@ -5,30 +5,38 @@ import org.zwobble.couscous.types.Type;
import java.util.List;
public class ExceptionHandlerNode {
- public static ExceptionHandlerNode exceptionhandler(Type type, List<StatementNode> body) {
- return new ExceptionHandlerNode(type, body);
+ public static ExceptionHandlerNode exceptionhandler(VariableDeclaration declaration, List<StatementNode> body) {
+ return new ExceptionHandlerNode(declaration, body);
}
- private final Type type;
+ private final VariableDeclaration declaration;
private final List<StatementNode> body;
- public ExceptionHandlerNode(Type type, List<StatementNode> body) {
- this.type = type;
+ public ExceptionHandlerNode(VariableDeclaration declaration, List<StatementNode> body) {
+ this.declaration = declaration;
this.body = body;
}
- public Type getExceptionType() {
- return type;
+ public VariableDeclaration getDeclaration() {
+ return declaration;
}
public List<StatementNode> getBody() {
return body;
}
+ public Type getExceptionType() {
+ return declaration.getType();
+ }
+
+ public String getExceptionName() {
+ return declaration.getName();
+ }
+
@Override
public String toString() {
return "ExceptionHandlerNode(" +
- "type=" + type +
+ "declaration=" + declaration +
", body=" + body +
')';
}
@@ -40,14 +48,14 @@ public class ExceptionHandlerNode {
ExceptionHandlerNode that = (ExceptionHandlerNode) o;
- if (!type.equals(that.type)) return false;
+ if (!declaration.equals(that.declaration)) return false;
return body.equals(that.body);
}
@Override
public int hashCode() {
- int result = type.hashCode();
+ int result = declaration.hashCode();
result = 31 * result + body.hashCode();
return result;
}
diff --git a/src/main/java/org/zwobble/couscous/ast/TryNode.java b/src/main/java/org/zwobble/couscous/ast/TryNode.java
index 643e65c..af0a892 100644
--- a/src/main/java/org/zwobble/couscous/ast/TryNode.java
+++ b/src/main/java/org/zwobble/couscous/ast/TryNode.java
@@ -38,7 +38,7 @@ public class TryNode implements StatementNode {
return new TryNode(
transformer.transformStatements(body),
eagerMap(exceptionHandlers, handler -> new ExceptionHandlerNode(
- transformer.transform(handler.getExceptionType()),
+ transformer.transform(handler.getDeclaration()),
transformer.transformStatements(handler.getBody()))));
}
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 954e03a..c334334 100644
--- a/src/main/java/org/zwobble/couscous/backends/csharp/CsharpSerializer.java
+++ b/src/main/java/org/zwobble/couscous/backends/csharp/CsharpSerializer.java
@@ -385,7 +385,21 @@ public class CsharpSerializer implements NodeVisitor {
@Override
public void visit(TryNode tryStatement) {
- throw new UnsupportedOperationException();
+ writer.writeStatement(() -> {
+ writer.writeKeyword("try");
+ writeBlock(tryStatement.getBody());
+ for (ExceptionHandlerNode handler : tryStatement.getExceptionHandlers()) {
+ writer.writeSpace();
+ writer.writeKeyword("catch");
+ writer.writeSpace();
+ writer.writeSymbol("(");
+ writeTypeReference(handler.getExceptionType());
+ writer.writeSpace();
+ writer.writeIdentifier(handler.getExceptionName());
+ writer.writeSymbol(")");
+ writeBlock(handler.getBody());
+ }
+ });
}
@Override
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 1286415..8b6ce84 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
@@ -14,6 +14,7 @@ import static org.zwobble.couscous.ast.AssignmentNode.assign;
import static org.zwobble.couscous.ast.CastNode.cast;
import static org.zwobble.couscous.ast.ConstructorCallNode.constructorCall;
import static org.zwobble.couscous.ast.EnumNode.declareEnum;
+import static org.zwobble.couscous.ast.ExceptionHandlerNode.exceptionhandler;
import static org.zwobble.couscous.ast.ExpressionStatementNode.expressionStatement;
import static org.zwobble.couscous.ast.FieldAccessNode.fieldAccess;
import static org.zwobble.couscous.ast.FormalArgumentNode.formalArg;
@@ -30,6 +31,7 @@ import static org.zwobble.couscous.ast.ReturnNode.returns;
import static org.zwobble.couscous.ast.TernaryConditionalNode.ternaryConditional;
import static org.zwobble.couscous.ast.ThisReferenceNode.thisReference;
import static org.zwobble.couscous.ast.ThrowNode.throwNode;
+import static org.zwobble.couscous.ast.TryNode.tryStatement;
import static org.zwobble.couscous.ast.VariableDeclaration.var;
import static org.zwobble.couscous.ast.VariableReferenceNode.reference;
import static org.zwobble.couscous.ast.WhileNode.whileLoop;
@@ -300,6 +302,18 @@ public class CsharpSerializerTests {
}
@Test
+ public void tryStatementCanHaveBodyAndMultipleHandlers() {
+ VariableDeclaration varX = var(TestIds.variable("x"), "x", ScalarType.of("X"));
+ VariableDeclaration varY = var(TestIds.variable("y"), "y", ScalarType.of("Y"));
+ String output = serialize(tryStatement(
+ list(returns(literal(1))),
+ list(
+ exceptionhandler(varX, list(returns(reference(varX)))),
+ exceptionhandler(varY, list(returns(reference(varY)))))));
+ assertEquals("try {\n return 1;\n} catch (X x) {\n return x;\n} catch (Y y) {\n return y;\n}\n", output);
+ }
+
+ @Test
public void methodCanHaveVoidReturnType() {
String output = serialize(MethodNode.staticMethod("nothing")
.returns(ScalarType.of("void"))