aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2016-04-17 16:00:18 +0100
committerMichael Williamson <mike@zwobble.org>2016-04-17 16:01:50 +0100
commit188051b4be316db4de8b6f48d634f249dd2e4986 (patch)
tree2ba5e06ce66271bf86875c192764af5f20aa6266 /src
parenta5f76463dfc74d9b126f65416a51905a995c711d (diff)
Add reading of try statements
Diffstat (limited to 'src')
-rw-r--r--src/main/java/org/zwobble/couscous/ast/ExceptionHandlerNode.java2
-rw-r--r--src/main/java/org/zwobble/couscous/frontends/java/JavaLambdaExpressionReader.java3
-rw-r--r--src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java3
-rw-r--r--src/main/java/org/zwobble/couscous/frontends/java/JavaStatementReader.java19
-rw-r--r--src/main/java/org/zwobble/couscous/frontends/java/JavaVariableDeclarationReader.java6
-rw-r--r--src/main/java/org/zwobble/couscous/frontends/java/Scope.java2
-rw-r--r--src/test/java/org/zwobble/couscous/tests/backends/csharp/CsharpSerializerTests.java6
-rw-r--r--src/test/java/org/zwobble/couscous/tests/frontends/java/JavaReaderTests.java13
-rw-r--r--src/test/java/org/zwobble/couscous/tests/frontends/java/NodeMatchers.java24
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)));
+ }
}