aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2016-05-25 22:17:22 +0100
committerMichael Williamson <mike@zwobble.org>2016-05-25 22:17:22 +0100
commitdc5c7603640767bdecde81801f6478c7604b550d (patch)
tree060c78a2b363c9373135000ab81e009df685eff3 /src
parent72481354e76184dc44b32587cc7f82e53334b080 (diff)
Get forEach test working on Python backend
Diffstat (limited to 'src')
-rw-r--r--src/main/java/org/zwobble/couscous/backends/python/PythonBackend.java1
-rw-r--r--src/main/java/org/zwobble/couscous/frontends/java/JavaStatementReader.java3
-rw-r--r--src/main/java/org/zwobble/couscous/frontends/java/JavaTypes.java6
-rw-r--r--src/main/resources/org/zwobble/couscous/backends/python/runtime/java/util/Arrays.py25
-rw-r--r--src/test/java/org/zwobble/couscous/tests/JavaToPythonTests.java11
5 files changed, 35 insertions, 11 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 a6c6772..2a3701e 100644
--- a/src/main/java/org/zwobble/couscous/backends/python/PythonBackend.java
+++ b/src/main/java/org/zwobble/couscous/backends/python/PythonBackend.java
@@ -21,6 +21,7 @@ public class PythonBackend implements Backend {
"java.lang.Object",
"java.lang.Integer",
"java.lang.String",
+ "java.util.Arrays",
"_couscous");
private final Path root;
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 6b71684..512030d 100644
--- a/src/main/java/org/zwobble/couscous/frontends/java/JavaStatementReader.java
+++ b/src/main/java/org/zwobble/couscous/frontends/java/JavaStatementReader.java
@@ -23,6 +23,7 @@ import static org.zwobble.couscous.ast.VariableReferenceNode.reference;
import static org.zwobble.couscous.ast.WhileNode.whileLoop;
import static org.zwobble.couscous.ast.sugar.SwitchCaseNode.switchCase;
import static org.zwobble.couscous.frontends.java.JavaTypes.typeOf;
+import static org.zwobble.couscous.types.BoundTypeParameter.boundTypeParameter;
import static org.zwobble.couscous.util.ExtraLists.*;
import static org.zwobble.couscous.util.Fold.foldRight;
import static org.zwobble.couscous.util.Tails.tail;
@@ -234,7 +235,7 @@ class JavaStatementReader {
LocalVariableDeclarationNode iterator = scope.temporaryVariable(iteratorValue);
ExpressionNode hasNext = methodCall(reference(iterator), "hasNext", list(), Types.BOOLEAN);
- ExpressionNode next = methodCall(reference(iterator), "next", list(), elementType);
+ ExpressionNode next = methodCall(reference(iterator), "next", list(), boundTypeParameter(JavaTypes.ITERATOR_TYPE_PARAMETER, elementType));
IVariableBinding parameterBinding = parameter.resolveBinding();
WhileNode loop = whileLoop(hasNext, cons(
scope.localVariable(parameterBinding.getKey(), parameterBinding.getName(), elementType, next),
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 9b634b9..37cee36 100644
--- a/src/main/java/org/zwobble/couscous/frontends/java/JavaTypes.java
+++ b/src/main/java/org/zwobble/couscous/frontends/java/JavaTypes.java
@@ -17,6 +17,7 @@ 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.TypeParameter.typeParameter;
import static org.zwobble.couscous.types.Types.erasure;
import static org.zwobble.couscous.util.Casts.tryCast;
import static org.zwobble.couscous.util.ExtraLists.eagerMap;
@@ -142,7 +143,10 @@ public class JavaTypes {
return parameterizedType(ScalarType.of("java.lang.Iterable"), list(elementType));
}
+ private static final ScalarType RAW_ITERATOR = ScalarType.of("java.util.Iterator");
+ public static TypeParameter ITERATOR_TYPE_PARAMETER = typeParameter(Identifiers.type(Identifiers.TOP, RAW_ITERATOR.getQualifiedName()), "T");
+
public static Type iterator(Type elementType) {
- return parameterizedType(ScalarType.of("java.util.Iterator"), list(elementType));
+ return parameterizedType(RAW_ITERATOR, list(elementType));
}
}
diff --git a/src/main/resources/org/zwobble/couscous/backends/python/runtime/java/util/Arrays.py b/src/main/resources/org/zwobble/couscous/backends/python/runtime/java/util/Arrays.py
new file mode 100644
index 0000000..e65f25b
--- /dev/null
+++ b/src/main/resources/org/zwobble/couscous/backends/python/runtime/java/util/Arrays.py
@@ -0,0 +1,25 @@
+class Arrays(object):
+ def asList__array__List(array):
+ return ListAdapter(array)
+
+
+class ListAdapter(object):
+ def __init__(self, elements):
+ self._elements = elements
+
+ def iterator__Iterator(self):
+ return ListIterator(self._elements)
+
+
+class ListIterator(object):
+ def __init__(self, elements):
+ self._elements = elements
+ self._next_index = 0
+
+ def hasNext__boolean(self):
+ return self._next_index < len(self._elements)
+
+ def next__java_util_Iterator_T(self):
+ value = self._elements[self._next_index]
+ self._next_index += 1
+ return value
diff --git a/src/test/java/org/zwobble/couscous/tests/JavaToPythonTests.java b/src/test/java/org/zwobble/couscous/tests/JavaToPythonTests.java
index ba2e8b4..8d4ee35 100644
--- a/src/test/java/org/zwobble/couscous/tests/JavaToPythonTests.java
+++ b/src/test/java/org/zwobble/couscous/tests/JavaToPythonTests.java
@@ -1,12 +1,10 @@
package org.zwobble.couscous.tests;
-import org.junit.Ignore;
-import org.junit.Test;
import org.zwobble.couscous.CouscousCompiler;
-import org.zwobble.couscous.types.ScalarType;
import org.zwobble.couscous.backends.python.PythonBackend;
import org.zwobble.couscous.frontends.java.JavaFrontend;
import org.zwobble.couscous.tests.backends.python.PythonMethodRunner;
+import org.zwobble.couscous.types.ScalarType;
import org.zwobble.couscous.values.PrimitiveValue;
import java.io.IOException;
@@ -18,11 +16,6 @@ import static org.zwobble.couscous.tests.util.ExtraFiles.deleteRecursively;
import static org.zwobble.couscous.util.ExtraLists.list;
public class JavaToPythonTests extends CompilerTests {
- @Test
- @Ignore("WIP")
- public void forEach() throws Exception {
- }
-
protected PrimitiveValue execProgram(
Path directory,
ScalarType type,
@@ -41,4 +34,4 @@ public class JavaToPythonTests extends CompilerTests {
deleteRecursively(directoryPath.toFile());
}
}
-} \ No newline at end of file
+}