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 /src/main/java | |
| parent | a5f76463dfc74d9b126f65416a51905a995c711d (diff) | |
Add reading of try statements
Diffstat (limited to 'src/main/java')
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"); } |
