diff options
| author | Michael Williamson <mike@zwobble.org> | 2016-04-17 15:47:28 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2016-04-17 15:47:28 +0100 |
| commit | a5f76463dfc74d9b126f65416a51905a995c711d (patch) | |
| tree | b1f1970250c5d8fb080c5d2f888d411b95ea68be /src | |
| parent | ac60bfdc353f27253282224f5bc6b34b587643f0 (diff) | |
C# serializer: serialize try statements
Diffstat (limited to 'src')
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")) |
