diff options
| -rw-r--r-- | src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java | 28 | ||||
| -rw-r--r-- | src/test/java/org/zwobble/couscous/tests/frontends/java/JavaReaderTests.java | 12 |
2 files changed, 38 insertions, 2 deletions
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 a47c4e9..c75205d 100644 --- a/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java +++ b/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java @@ -8,6 +8,7 @@ import java.util.stream.IntStream; import org.eclipse.jdt.core.dom.ASTNode; import org.eclipse.jdt.core.dom.Assignment; +import org.eclipse.jdt.core.dom.Block; import org.eclipse.jdt.core.dom.BooleanLiteral; import org.eclipse.jdt.core.dom.ClassInstanceCreation; import org.eclipse.jdt.core.dom.CompilationUnit; @@ -21,6 +22,7 @@ import org.eclipse.jdt.core.dom.IBinding; import org.eclipse.jdt.core.dom.IMethodBinding; import org.eclipse.jdt.core.dom.ITypeBinding; import org.eclipse.jdt.core.dom.IVariableBinding; +import org.eclipse.jdt.core.dom.IfStatement; import org.eclipse.jdt.core.dom.InfixExpression; import org.eclipse.jdt.core.dom.InfixExpression.Operator; import org.eclipse.jdt.core.dom.MethodDeclaration; @@ -45,6 +47,7 @@ import org.zwobble.couscous.ast.ClassNodeBuilder.MethodBuilder; import org.zwobble.couscous.ast.ConstructorCallNode; import org.zwobble.couscous.ast.ExpressionNode; import org.zwobble.couscous.ast.FieldAccessNode; +import org.zwobble.couscous.ast.IfStatementNode; import org.zwobble.couscous.ast.LiteralNode; import org.zwobble.couscous.ast.MethodCallNode; import org.zwobble.couscous.ast.ReturnNode; @@ -128,21 +131,35 @@ public class JavaReader { private static List<StatementNode> readStatement(Statement statement) { switch (statement.getNodeType()) { + case ASTNode.BLOCK: + return readBlock((Block)statement); + case ASTNode.RETURN_STATEMENT: return asList(readReturnStatement((ReturnStatement)statement)); case ASTNode.EXPRESSION_STATEMENT: return asList(readExpressionStatement((ExpressionStatement)statement)); + + case ASTNode.IF_STATEMENT: + return asList(readIfStatement((IfStatement)statement)); case ASTNode.VARIABLE_DECLARATION_STATEMENT: return readVariableDeclarationStatement((VariableDeclarationStatement)statement); - + default: throw new RuntimeException("Unsupported statement: " + statement.getClass()); } } - + + private static List<StatementNode> readBlock(Block block) { + @SuppressWarnings("unchecked") + List<Statement> statements = block.statements(); + return statements.stream() + .flatMap(statement -> readStatement(statement).stream()) + .collect(Collectors.toList()); + } + private static StatementNode readReturnStatement(ReturnStatement statement) { // TODO: set target type return ReturnNode.returns(readExpressionWithoutBoxing(statement.getExpression())); @@ -152,6 +169,13 @@ public class JavaReader { return expressionStatement(readExpressionWithoutBoxing(statement.getExpression())); } + private static StatementNode readIfStatement(IfStatement statement) { + return IfStatementNode.ifStatement( + readExpression(BooleanValue.REF, statement.getExpression()), + readStatement(statement.getThenStatement()), + readStatement(statement.getElseStatement())); + } + private static List<StatementNode> readVariableDeclarationStatement(VariableDeclarationStatement statement) { @SuppressWarnings("unchecked") List<VariableDeclarationFragment> fragments = statement.fragments(); 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 b8309b3..629a815 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 @@ -32,9 +32,11 @@ import static org.zwobble.couscous.ast.ConstructorCallNode.constructorCall; import static org.zwobble.couscous.ast.ExpressionStatementNode.expressionStatement; import static org.zwobble.couscous.ast.FieldAccessNode.fieldAccess; import static org.zwobble.couscous.ast.FieldDeclarationNode.field; +import static org.zwobble.couscous.ast.IfStatementNode.ifStatement; import static org.zwobble.couscous.ast.LiteralNode.literal; import static org.zwobble.couscous.ast.MethodCallNode.methodCall; import static org.zwobble.couscous.ast.MethodCallNode.not; +import static org.zwobble.couscous.ast.ReturnNode.returns; import static org.zwobble.couscous.ast.StaticMethodCallNode.boxBoolean; import static org.zwobble.couscous.ast.StaticMethodCallNode.boxInt; import static org.zwobble.couscous.ast.StaticMethodCallNode.same; @@ -356,6 +358,16 @@ public class JavaReaderTests { } @Test + public void canReadIfStatements() { + assertEquals( + ifStatement( + literal(true), + asList(returns(literal(1))), + asList(returns(literal(2)))), + readStatement("if (true) { return 1; } else { return 2; }")); + } + + @Test public void canDeclareConstructor() { ClassNode classNode = readClass( "private final String name;" + |
