From fa0e5ad5e621fb6a65ecc70a357bb20c14b0e796 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sat, 21 Nov 2015 13:40:52 +0000 Subject: Support simple for-loops --- .../frontends/java/JavaStatementReader.java | 30 ++++++++++++++++++++++ 1 file changed, 30 insertions(+) (limited to 'src/main/java/org/zwobble/couscous/frontends') 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 a766cce..97a235e 100644 --- a/src/main/java/org/zwobble/couscous/frontends/java/JavaStatementReader.java +++ b/src/main/java/org/zwobble/couscous/frontends/java/JavaStatementReader.java @@ -7,6 +7,7 @@ import org.zwobble.couscous.values.BooleanValue; import java.util.List; import java.util.Optional; import java.util.stream.Collectors; +import java.util.stream.Stream; import static java.util.Arrays.asList; import static org.zwobble.couscous.ast.ExpressionStatementNode.expressionStatement; @@ -15,6 +16,8 @@ import static org.zwobble.couscous.ast.WhileNode.whileLoop; import static org.zwobble.couscous.frontends.java.JavaExpressionReader.readExpression; import static org.zwobble.couscous.frontends.java.JavaExpressionReader.readExpressionWithoutBoxing; import static org.zwobble.couscous.frontends.java.JavaTypes.typeOf; +import static org.zwobble.couscous.util.ExtraLists.append; +import static org.zwobble.couscous.util.ExtraLists.concat; import static org.zwobble.couscous.util.ExtraLists.eagerMap; class JavaStatementReader { @@ -41,6 +44,9 @@ class JavaStatementReader { case ASTNode.WHILE_STATEMENT: return asList(readWhileStatement((WhileStatement)statement)); + case ASTNode.FOR_STATEMENT: + return readForStatement((ForStatement)statement); + case ASTNode.VARIABLE_DECLARATION_STATEMENT: return readVariableDeclarationStatement((VariableDeclarationStatement)statement); @@ -78,10 +84,34 @@ class JavaStatementReader { readStatement(statement.getBody())); } + private List readForStatement(ForStatement statement) { + List javaInitialisers = statement.initializers(); + if (javaInitialisers.size() != 1) { + throw new UnsupportedOperationException(); + } + VariableDeclarationExpression javaDeclaration = (VariableDeclarationExpression) javaInitialisers.get(0); + @SuppressWarnings("unchecked") + List fragments = javaDeclaration.fragments(); + @SuppressWarnings("unchecked") + List updaters = statement.updaters(); + + return append( + readDeclarationFragments(fragments, typeOf(javaDeclaration.getType())), + whileLoop( + readExpression(BooleanValue.REF, statement.getExpression()), + concat( + readStatement(statement.getBody()), + eagerMap(updaters, updater -> expressionStatement(readExpressionWithoutBoxing(updater)))))); + } + private static List readVariableDeclarationStatement(VariableDeclarationStatement statement) { @SuppressWarnings("unchecked") List fragments = statement.fragments(); TypeName type = typeOf(statement.getType()); + return readDeclarationFragments(fragments, type); + } + + private static List readDeclarationFragments(List fragments, TypeName type) { return eagerMap(fragments, fragment -> localVariableDeclaration( fragment.resolveBinding().getKey(), -- cgit v1.2.3