diff options
| author | Michael Williamson <mike@zwobble.org> | 2015-11-15 14:20:06 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2015-11-15 14:20:06 +0000 |
| commit | 549099039ef76a04ed524448c070a0c5328c52b2 (patch) | |
| tree | 14c8eea1b8874d339282d854c612622c73a844e7 /src/main/java/org | |
| parent | f4019f5ed78b0d9c0eb7c7a1b4d97e5c83003ff1 (diff) | |
Handle boxing for return statements
Diffstat (limited to 'src/main/java/org')
3 files changed, 22 insertions, 10 deletions
diff --git a/src/main/java/org/zwobble/couscous/backends/python/PythonBackend.java b/src/main/java/org/zwobble/couscous/backends/python/PythonBackend.java index 39bd058..5cd55d2 100644 --- a/src/main/java/org/zwobble/couscous/backends/python/PythonBackend.java +++ b/src/main/java/org/zwobble/couscous/backends/python/PythonBackend.java @@ -19,6 +19,7 @@ import static org.zwobble.couscous.backends.python.PythonSerializer.serialize; public class PythonBackend implements Backend { private static final List<String> RUNTIME_FILES = asList( "java.lang.Object", + "java.lang.Boolean", "java.lang.Integer", "_couscous"); 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 a54ca55..4f07149 100644 --- a/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java +++ b/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java @@ -4,11 +4,12 @@ import org.eclipse.jdt.core.dom.*; import org.zwobble.couscous.ast.ClassNode; import org.zwobble.couscous.ast.ClassNodeBuilder; import org.zwobble.couscous.ast.StatementNode; +import org.zwobble.couscous.ast.TypeName; import java.io.IOException; import java.nio.file.Path; +import java.util.Optional; -import static org.zwobble.couscous.frontends.java.JavaStatementReader.readStatement; import static org.zwobble.couscous.frontends.java.JavaTypes.typeOf; public class JavaReader { @@ -63,8 +64,12 @@ public class JavaReader { SingleVariableDeclaration parameter = (SingleVariableDeclaration)parameterObject; builder.argument(parameter.resolveBinding().getKey(), parameter.getName().getIdentifier(), typeOf(parameter.resolveBinding())); } + Optional<TypeName> returnType = method.getReturnType2() == null + ? Optional.empty() + : Optional.of(typeOf(method.getReturnType2())); + JavaStatementReader statementReader = new JavaStatementReader(returnType); for (Object statement : method.getBody().statements()) { - for (StatementNode intermediateStatement : readStatement((Statement)statement)) { + for (StatementNode intermediateStatement : statementReader.readStatement((Statement)statement)) { builder.statement(intermediateStatement); } } 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 c5194b4..a766cce 100644 --- a/src/main/java/org/zwobble/couscous/frontends/java/JavaStatementReader.java +++ b/src/main/java/org/zwobble/couscous/frontends/java/JavaStatementReader.java @@ -5,6 +5,7 @@ import org.zwobble.couscous.ast.*; import org.zwobble.couscous.values.BooleanValue; import java.util.List; +import java.util.Optional; import java.util.stream.Collectors; import static java.util.Arrays.asList; @@ -16,8 +17,14 @@ import static org.zwobble.couscous.frontends.java.JavaExpressionReader.readExpre import static org.zwobble.couscous.frontends.java.JavaTypes.typeOf; import static org.zwobble.couscous.util.ExtraLists.eagerMap; -public class JavaStatementReader { - static List<StatementNode> readStatement(Statement statement) { +class JavaStatementReader { + private final Optional<TypeName> returnType; + + JavaStatementReader(Optional<TypeName> returnType) { + this.returnType = returnType; + } + + List<StatementNode> readStatement(Statement statement) { switch (statement.getNodeType()) { case ASTNode.BLOCK: return readBlock((Block)statement); @@ -42,7 +49,7 @@ public class JavaStatementReader { } } - private static List<StatementNode> readBlock(Block block) { + private List<StatementNode> readBlock(Block block) { @SuppressWarnings("unchecked") List<Statement> statements = block.statements(); return statements.stream() @@ -50,23 +57,22 @@ public class JavaStatementReader { .collect(Collectors.toList()); } - private static StatementNode readReturnStatement(ReturnStatement statement) { - // TODO: set target type - return ReturnNode.returns(readExpressionWithoutBoxing(statement.getExpression())); + private StatementNode readReturnStatement(ReturnStatement statement) { + return ReturnNode.returns(readExpression(returnType.get(), statement.getExpression())); } private static StatementNode readExpressionStatement(ExpressionStatement statement) { return expressionStatement(readExpressionWithoutBoxing(statement.getExpression())); } - private static StatementNode readIfStatement(IfStatement statement) { + private StatementNode readIfStatement(IfStatement statement) { return IfStatementNode.ifStatement( readExpression(BooleanValue.REF, statement.getExpression()), readStatement(statement.getThenStatement()), readStatement(statement.getElseStatement())); } - private static WhileNode readWhileStatement(WhileStatement statement) { + private WhileNode readWhileStatement(WhileStatement statement) { return whileLoop( readExpression(BooleanValue.REF, statement.getExpression()), readStatement(statement.getBody())); |
