From dc5c7603640767bdecde81801f6478c7604b550d Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Wed, 25 May 2016 22:17:22 +0100 Subject: Get forEach test working on Python backend --- .../couscous/backends/python/PythonBackend.java | 1 + .../frontends/java/JavaStatementReader.java | 3 ++- .../zwobble/couscous/frontends/java/JavaTypes.java | 6 +++++- .../backends/python/runtime/java/util/Arrays.py | 25 ++++++++++++++++++++++ 4 files changed, 33 insertions(+), 2 deletions(-) create mode 100644 src/main/resources/org/zwobble/couscous/backends/python/runtime/java/util/Arrays.py (limited to 'src/main') 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 -- cgit v1.2.3