aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2016-04-03 13:38:53 +0100
committerMichael Williamson <mike@zwobble.org>2016-04-03 13:38:53 +0100
commit3c42c0a7c1196cc290dbcdc55dcb84379ad523e4 (patch)
treef746640db075a3d613f21581d0c392b16d024439 /src/main/java
parent26f7b223ebfcf3e514ffa8c2b81ccaaa7a6605cc (diff)
C# backend: Implement for-each loops
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/zwobble/couscous/backends/csharp/CsharpBackend.java6
-rw-r--r--src/main/java/org/zwobble/couscous/frontends/java/JavaStatementReader.java21
-rw-r--r--src/main/java/org/zwobble/couscous/frontends/java/JavaTypes.java10
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));
+ }
}