diff options
Diffstat (limited to 'src/main/java/org')
3 files changed, 36 insertions, 1 deletions
diff --git a/src/main/java/org/zwobble/couscous/backends/csharp/CsharpBackend.java b/src/main/java/org/zwobble/couscous/backends/csharp/CsharpBackend.java index 3cd778b..6e648e6 100644 --- a/src/main/java/org/zwobble/couscous/backends/csharp/CsharpBackend.java +++ b/src/main/java/org/zwobble/couscous/backends/csharp/CsharpBackend.java @@ -18,7 +18,11 @@ public class CsharpBackend implements Backend { private static final List<String> RUNTIME_FILES = ImmutableList.of( "java/lang/Integer.cs", "java/lang/Object.cs", - "java/lang/String.cs"); + "java/lang/String.cs", + "java/util/Arrays.cs", + // TODO: implement Iterable/Iterator in Java + "java/lang/Iterable.cs", + "java/lang/Iterator.cs"); private final Path directoryPath; private final String namespace; 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 4185f88..83c10f4 100644 --- a/src/main/java/org/zwobble/couscous/frontends/java/JavaStatementReader.java +++ b/src/main/java/org/zwobble/couscous/frontends/java/JavaStatementReader.java @@ -61,6 +61,9 @@ class JavaStatementReader { case ASTNode.FOR_STATEMENT: return readForStatement((ForStatement)statement); + case ASTNode.ENHANCED_FOR_STATEMENT: + return readEnhancedForStatement((EnhancedForStatement)statement); + case ASTNode.VARIABLE_DECLARATION_STATEMENT: return readVariableDeclarationStatement((VariableDeclarationStatement)statement); @@ -180,6 +183,24 @@ class JavaStatementReader { eagerMap(updaters, updater -> expressionStatement(readExpressionWithoutBoxing(updater)))))); } + private List<StatementNode> readEnhancedForStatement(EnhancedForStatement statement) { + SingleVariableDeclaration parameter = statement.getParameter(); + Type elementType = typeOf(parameter.getType()); + + ExpressionNode iterableValue = readExpression(JavaTypes.iterable(elementType), statement.getExpression()); + ExpressionNode iteratorValue = methodCall(iterableValue, "iterator", list(), JavaTypes.iterator(elementType)); + LocalVariableDeclarationNode iterator = scope.temporaryVariable(iteratorValue); + + ExpressionNode hasNext = methodCall(reference(iterator), "hasNext", list(), Types.BOOLEAN); + ExpressionNode next = methodCall(reference(iterator), "next", list(), elementType); + IVariableBinding parameterBinding = parameter.resolveBinding(); + WhileNode loop = whileLoop(hasNext, cons( + scope.localVariable(parameterBinding.getKey(), parameterBinding.getName(), elementType, next), + readStatement(statement.getBody()))); + + return list(iterator, loop); + } + private List<StatementNode> readVariableDeclarationStatement(VariableDeclarationStatement statement) { @SuppressWarnings("unchecked") List<VariableDeclarationFragment> fragments = statement.fragments(); diff --git a/src/main/java/org/zwobble/couscous/frontends/java/JavaTypes.java b/src/main/java/org/zwobble/couscous/frontends/java/JavaTypes.java index 0148b9b..d63ec89 100644 --- a/src/main/java/org/zwobble/couscous/frontends/java/JavaTypes.java +++ b/src/main/java/org/zwobble/couscous/frontends/java/JavaTypes.java @@ -14,9 +14,11 @@ import java.util.Set; import static com.google.common.collect.Iterables.transform; import static java.util.Arrays.asList; +import static org.zwobble.couscous.types.ParameterizedType.parameterizedType; import static org.zwobble.couscous.types.Types.erasure; import static org.zwobble.couscous.util.Casts.tryCast; import static org.zwobble.couscous.util.ExtraLists.eagerMap; +import static org.zwobble.couscous.util.ExtraLists.list; public class JavaTypes { static Type typeOf(Expression expression) { @@ -119,4 +121,12 @@ public class JavaTypes { return Optional.empty(); } } + + public static Type iterable(Type elementType) { + return parameterizedType(ScalarType.of("java.lang.Iterable"), list(elementType)); + } + + public static Type iterator(Type elementType) { + return parameterizedType(ScalarType.of("java.lang.Iterator"), list(elementType)); + } } |
