aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org/zwobble
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/main/java/org/zwobble
parenta5f76463dfc74d9b126f65416a51905a995c711d (diff)
Add reading of try statements
Diffstat (limited to 'src/main/java/org/zwobble')
-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
6 files changed, 28 insertions, 7 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");
}