Ok so to summarize, the trap is that I call each {} on an object that is both, an List/Iterable and an Iterator at the same time. The result is that either of these two is called, and it happens to be random which one. http://docs.groovy-lang.org/docs/groovy-2.5.1/html/api/org/codehaus/groovy/runtime/DefaultGroovyMethods.html#each-java.util.Iterator-groovy.lang.Closure- http://docs.groovy-lang.org/docs/groovy-2.5.1/html/api/org/codehaus/groovy/runtime/DefaultGroovyMethods.html#each-java.lang.Iterable-groovy.lang.Closure-
On Tue, Oct 16, 2018 at 6:59 PM Felix Dorner <felix.dor...@gmail.com> wrote: > I think I "know" what's going on.. I have a hard time trying to figure > actually out which 'each' implementation is called, but if it is > "DefaultGroovyMethods.each", this will not work: The default groovy methods > each calls 'iterator' on the argument, which happens to be defined in the > iterator that I am testing, because that iterator is also a list... (But > the tree iterator contents are actually more than the contents of that > list, because the list is a list of root elements, just imagine a dom tree, > it's the same thing). I'll figure something out. > > > > On Tue, Oct 16, 2018 at 6:17 PM Felix Dorner <felix.dor...@gmail.com> > wrote: > >> If I use hasNext/next in a while loop, I get at the content as expected, >> but not if I use the collection extensions such as 'each'. I don't know >> where the magic fails, but I want to find out.. The iterator that is being >> used is created here: >> >> >> http://git.eclipse.org/c/emf/org.eclipse.emf.git/tree/plugins/org.eclipse.emf.ecore/src/org/eclipse/emf/ecore/impl/BasicEObjectImpl.java#n832 >> and that is an anonymous subtype of >> >> http://git.eclipse.org/c/emf/org.eclipse.emf.git/tree/plugins/org.eclipse.emf.common/src/org/eclipse/emf/common/util/AbstractTreeIterator.java >> >> >> >> >> On Tue, Oct 16, 2018 at 3:21 PM Paul King <pa...@asert.com.au> wrote: >> >>> I'd expect that to work the same as if you used a while loop with >>> hasNext() and next(). If your data structure has further containers and >>> next() doesn't normally walk through the containers, then I'd expect you to >>> have more work to do. Is that not what you are seeing? >>> >>> Cheers, Paul. >>> >>> On Tue, Oct 16, 2018 at 8:23 PM Felix Dorner <felix.dor...@gmail.com> >>> wrote: >>> >>>> Hi, >>>> >>>> I can do: >>>> def a = [1,2,3].iterator() >>>> a.each { >>>> println it >>>> } >>>> >>>> Cool, I can walk EMF EObject trees like this, I thought: >>>> >>>> Iterator i = anEObject.eAllContents() // this gives a TreeIterator, a >>>> subinterface of Iterator >>>> it.each { >>>> println it >>>> } >>>> >>>> But that doesn't work :(. It only prints anEObject, not the whole >>>> content tree. Anyone can explain why? >>>> >>>> >>>> -- >>>> Linux. The choice of a GNU generation. >>>> >>> >> >> -- >> Linux. The choice of a GNU generation. >> > > > -- > Linux. The choice of a GNU generation. > -- Linux. The choice of a GNU generation.