diff options
| author | Michael Williamson <mike@zwobble.org> | 2016-04-17 16:00:18 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2016-04-17 16:01:50 +0100 |
| commit | 188051b4be316db4de8b6f48d634f249dd2e4986 (patch) | |
| tree | 2ba5e06ce66271bf86875c192764af5f20aa6266 | |
| parent | a5f76463dfc74d9b126f65416a51905a995c711d (diff) | |
Add reading of try statements
9 files changed, 66 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 5e80fcf..235b485 100644 --- a/src/main/java/org/zwobble/couscous/ast/ExceptionHandlerNode.java +++ b/src/main/java/org/zwobble/couscous/ast/ExceptionHandlerNode.java @@ -5,7 +5,7 @@ import org.zwobble.couscous.types.Type; import java.util.List; public class ExceptionHandlerNode { - public static ExceptionHandlerNode exceptionhandler(VariableDeclaration declaration, List<StatementNode> body) { + public static ExceptionHandlerNode exceptionHandler(VariableDeclaration declaration, List<StatementNode> body) { return new ExceptionHandlerNode(declaration, body); } diff --git a/src/main/java/org/zwobble/couscous/frontends/java/JavaLambdaExpressionReader.java b/src/main/java/org/zwobble/couscous/frontends/java/JavaLambdaExpressionReader.java index 7a4d52b..27a5668 100644 --- a/src/main/java/org/zwobble/couscous/frontends/java/JavaLambdaExpressionReader.java +++ b/src/main/java/org/zwobble/couscous/frontends/java/JavaLambdaExpressionReader.java @@ -12,6 +12,7 @@ import java.util.List; import java.util.Optional; import static org.zwobble.couscous.ast.ExpressionStatementNode.expressionStatement; +import static org.zwobble.couscous.ast.FormalArgumentNode.formalArg; import static org.zwobble.couscous.ast.ReturnNode.returns; import static org.zwobble.couscous.ast.sugar.Lambda.lambda; import static org.zwobble.couscous.frontends.java.JavaTypes.typeOf; @@ -35,7 +36,7 @@ public class JavaLambdaExpressionReader { private FormalArgumentNode readLambdaExpressionParameter(Scope scope, Object parameter) { if (parameter instanceof SingleVariableDeclaration) { - return JavaVariableDeclarationReader.read(scope, (SingleVariableDeclaration) parameter); + return formalArg(JavaVariableDeclarationReader.read(scope, (SingleVariableDeclaration) parameter)); } else { VariableDeclarationFragment fragment = (VariableDeclarationFragment)parameter; return scope.formalArgument( diff --git a/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java b/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java index 3f9217e..08adbcc 100644 --- a/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java +++ b/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java @@ -34,6 +34,7 @@ import static org.zwobble.couscous.ast.AssignmentNode.assignStatement; import static org.zwobble.couscous.ast.ConstructorNode.constructor; import static org.zwobble.couscous.ast.FieldAccessNode.fieldAccess; import static org.zwobble.couscous.ast.FieldDeclarationNode.field; +import static org.zwobble.couscous.ast.FormalArgumentNode.formalArg; import static org.zwobble.couscous.ast.FormalTypeParameterNode.formalTypeParameter; import static org.zwobble.couscous.ast.InstanceReceiver.instanceReceiver; import static org.zwobble.couscous.ast.ReturnNode.returns; @@ -469,7 +470,7 @@ public class JavaReader { private List<FormalArgumentNode> readFormalArguments(Scope scope, MethodDeclaration method) { @SuppressWarnings("unchecked") List<SingleVariableDeclaration> parameters = method.parameters(); - return eagerMap(parameters, parameter -> JavaVariableDeclarationReader.read(scope, parameter)); + return eagerMap(parameters, parameter -> formalArg(JavaVariableDeclarationReader.read(scope, parameter))); } private Optional<List<StatementNode>> readBody(Scope scope, MethodDeclaration method, Optional<Type> returnType) { diff --git a/src/main/java/org/zwobble/couscous/frontends/java/JavaStatementReader.java b/src/main/java/org/zwobble/couscous/frontends/java/JavaStatementReader.java index 0d46c4a..e8483f0 100644 --- a/src/main/java/org/zwobble/couscous/frontends/java/JavaStatementReader.java +++ b/src/main/java/org/zwobble/couscous/frontends/java/JavaStatementReader.java @@ -12,9 +12,11 @@ import java.util.stream.Collectors; import static com.google.common.collect.Iterables.filter; import static com.google.common.collect.Iterables.tryFind; +import static org.zwobble.couscous.ast.ExceptionHandlerNode.exceptionHandler; import static org.zwobble.couscous.ast.ExpressionStatementNode.expressionStatement; import static org.zwobble.couscous.ast.IfStatementNode.ifStatement; import static org.zwobble.couscous.ast.MethodCallNode.methodCall; +import static org.zwobble.couscous.ast.TryNode.tryStatement; import static org.zwobble.couscous.ast.TypeCoercionNode.coerce; import static org.zwobble.couscous.ast.VariableReferenceNode.reference; import static org.zwobble.couscous.ast.WhileNode.whileLoop; @@ -73,6 +75,9 @@ class JavaStatementReader { case ASTNode.SWITCH_STATEMENT: return readSwitchStatement((SwitchStatement)statement); + case ASTNode.TRY_STATEMENT: + return readTryStatement((TryStatement)statement); + default: throw new RuntimeException("Unsupported statement: " + statement.getClass()); } @@ -160,6 +165,20 @@ class JavaStatementReader { return statement.getNodeType() == ASTNode.RETURN_STATEMENT; } + private List<StatementNode> readTryStatement(TryStatement statement) { + @SuppressWarnings("unchecked") + List<CatchClause> catchClauses = statement.catchClauses(); + return list(tryStatement( + readStatement(statement.getBody()), + eagerMap(catchClauses, this::readCatchClause))); + } + + private ExceptionHandlerNode readCatchClause(CatchClause clause) { + return exceptionHandler( + JavaVariableDeclarationReader.read(scope, clause.getException()), + readStatement(clause.getBody())); + } + private List<StatementNode> readStatements(Iterable<Statement> statements) { return eagerFlatMap(statements, this::readStatement); } diff --git a/src/main/java/org/zwobble/couscous/frontends/java/JavaVariableDeclarationReader.java b/src/main/java/org/zwobble/couscous/frontends/java/JavaVariableDeclarationReader.java index 812e5d4..041b9a0 100644 --- a/src/main/java/org/zwobble/couscous/frontends/java/JavaVariableDeclarationReader.java +++ b/src/main/java/org/zwobble/couscous/frontends/java/JavaVariableDeclarationReader.java @@ -1,13 +1,13 @@ package org.zwobble.couscous.frontends.java; import org.eclipse.jdt.core.dom.SingleVariableDeclaration; -import org.zwobble.couscous.ast.FormalArgumentNode; +import org.zwobble.couscous.ast.VariableDeclaration; import static org.zwobble.couscous.frontends.java.JavaTypes.typeOf; class JavaVariableDeclarationReader { - static FormalArgumentNode read(Scope scope, SingleVariableDeclaration parameter) { - return scope.formalArgument( + static VariableDeclaration read(Scope scope, SingleVariableDeclaration parameter) { + return scope.generateVariable( parameter.resolveBinding().getKey(), parameter.getName().getIdentifier(), typeOf(parameter.resolveBinding())); diff --git a/src/main/java/org/zwobble/couscous/frontends/java/Scope.java b/src/main/java/org/zwobble/couscous/frontends/java/Scope.java index 0cc369b..21745c6 100644 --- a/src/main/java/org/zwobble/couscous/frontends/java/Scope.java +++ b/src/main/java/org/zwobble/couscous/frontends/java/Scope.java @@ -97,7 +97,7 @@ public class Scope { return VariableReferenceNode.reference(variable); } - private VariableDeclaration generateVariable(String key, String name, Type type) { + public VariableDeclaration generateVariable(String key, String name, Type type) { if (variablesByKey.containsKey(key)) { throw new IllegalArgumentException(key + " is already mapped"); } 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 8b6ce84..ba69eb4 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,7 +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.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; @@ -308,8 +308,8 @@ public class CsharpSerializerTests { String output = serialize(tryStatement( list(returns(literal(1))), list( - exceptionhandler(varX, list(returns(reference(varX)))), - exceptionhandler(varY, list(returns(reference(varY))))))); + 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); } diff --git a/src/test/java/org/zwobble/couscous/tests/frontends/java/JavaReaderTests.java b/src/test/java/org/zwobble/couscous/tests/frontends/java/JavaReaderTests.java index a3245fa..3aafb56 100644 --- a/src/test/java/org/zwobble/couscous/tests/frontends/java/JavaReaderTests.java +++ b/src/test/java/org/zwobble/couscous/tests/frontends/java/JavaReaderTests.java @@ -33,8 +33,7 @@ import static org.zwobble.couscous.ast.TypeCoercionNode.typeCoercion; import static org.zwobble.couscous.ast.VariableReferenceNode.reference; import static org.zwobble.couscous.ast.WhileNode.whileLoop; import static org.zwobble.couscous.tests.frontends.java.JavaReading.*; -import static org.zwobble.couscous.tests.frontends.java.NodeMatchers.isFormalArgument; -import static org.zwobble.couscous.tests.frontends.java.NodeMatchers.isFormalTypeParameter; +import static org.zwobble.couscous.tests.frontends.java.NodeMatchers.*; import static org.zwobble.couscous.types.TypeParameter.typeParameter; import static org.zwobble.couscous.util.ExtraLists.list; import static org.zwobble.couscous.util.ExtraSets.set; @@ -191,6 +190,16 @@ public class JavaReaderTests { "if (_couscous_tmp_0.equals(\"one\")) { return 0; } return 1;"), readStatements("int", "switch (\"one\") { case \"one\": return 0; } return 1;")); } + + @Test + public void canReadTryStatements() { + assertThat( + readStatement("int", "try { return 1; } catch (Exception exception) { return 2; }"), + isTryStatement( + hasTryBody(list(returns(literal(1)))), + hasExceptionHandlers( + isExceptionHandler(ScalarType.of("java.lang.Exception"), "exception", list(returns(literal(2))))))); + } @Test public void canDeclareConstructor() { diff --git a/src/test/java/org/zwobble/couscous/tests/frontends/java/NodeMatchers.java b/src/test/java/org/zwobble/couscous/tests/frontends/java/NodeMatchers.java index 5ef5344..ba356f8 100644 --- a/src/test/java/org/zwobble/couscous/tests/frontends/java/NodeMatchers.java +++ b/src/test/java/org/zwobble/couscous/tests/frontends/java/NodeMatchers.java @@ -5,7 +5,10 @@ import org.zwobble.couscous.ast.*; import org.zwobble.couscous.ast.identifiers.Identifier; import org.zwobble.couscous.types.Type; +import java.util.List; + import static org.hamcrest.Matchers.allOf; +import static org.hamcrest.Matchers.contains; import static org.hamcrest.Matchers.equalTo; import static org.zwobble.couscous.tests.util.ExtraMatchers.hasFeature; import static org.zwobble.couscous.tests.util.ExtraMatchers.isInstance; @@ -53,4 +56,25 @@ public class NodeMatchers { public static Matcher<ExpressionNode> expressionHasType(Type type) { return hasFeature("type", ExpressionNode::getType, equalTo(type)); } + + @SafeVarargs + public static Matcher<StatementNode> isTryStatement(Matcher<? super TryNode>... matchers) { + return isInstance(TryNode.class, allOf(matchers)); + } + + public static Matcher<TryNode> hasTryBody(List<StatementNode> statements) { + return hasFeature("body", TryNode::getBody, equalTo(statements)); + } + + @SafeVarargs + public static Matcher<TryNode> hasExceptionHandlers(Matcher<ExceptionHandlerNode>... handlers) { + return hasFeature("exception handlers", TryNode::getExceptionHandlers, contains(handlers)); + } + + public static Matcher<ExceptionHandlerNode> isExceptionHandler(Type type, String name, List<StatementNode> body) { + return allOf( + hasFeature("exception type", ExceptionHandlerNode::getExceptionType, equalTo(type)), + hasFeature("exception name", ExceptionHandlerNode::getExceptionName, equalTo(name)), + hasFeature("body", ExceptionHandlerNode::getBody, equalTo(body))); + } } |
