You can try #2 by changing ForEachEmitter.java. For the general problem, we should probably just use the XML() top-level function to "coerce" XMLList to XML.
My 2 cents, -Alex On 7/17/17, 9:23 AM, "Harbs" <harbs.li...@gmail.com> wrote: >That is a fourth option. > >In terms of overhead, option #2 is probably cheapest and option #4 is >probably most expensive. > >What’s the difference in terms of difficulty of changing the compiler? > >I agree with the general problem. It could be that we should to a >function to XMLList toXML() (or something like that) where it would >return an XML element if it’s a single and throw an error otherwise. Then >anytime there is an XMLList assignment to XML, the compiler could add >.toXML(). > >Harbs > >> On Jul 17, 2017, at 7:11 PM, Alex Harui <aha...@adobe.com.INVALID> >>wrote: >> >> IMO, this points out a generic problem where in ActionScript: >> >> var harbs:XML = SomeXMLListWithOneElement; >> >> would auto-coerce the XMLList to XML by grabbing the one element. So we >> have to deal with that some day. But there is probably a quick fix in >>the >> generated code for "for each" where we just generate: >> >> var foo = foreachiter57_target.child(foreachiter57)[0]; >> >> >> Thoughts? >> -Alex >> >> On 7/17/17, 3:40 AM, "Harbs" <harbs.li...@gmail.com> wrote: >> >>> I discovered an issue with “for each” in the XML classes: >>> >>> Currently, for each does the following: >>> >>> The following AS code: >>> >>> var fooList:XMLList = getFooList(); >>> for each(var foo:XML in fooList){ >>> doSomethingWithFoo(foo); >>> } >>> >>> outputs the following JS: >>> >>> var /** @type {XMLList} */ fooList = this.getFooList(); >>> var foreachiter57_target = fooList; >>> for (var foreachiter57 in foreachiter57_target.elementNames()) >>> { >>> var foo = foreachiter57_target.child(foreachiter57); >>> { >>> this.doSomethingWithFoo(foo); >>> }} >>> >>> The problem is with the line: >>> var foo = foreachiter57_target.child(foreachiter57); >>> >>> foo should be of type XML. According to the ECMA spec for E4X, >>> XML.prototype.child and XMLList.prototype.child both ALWAYS return an >>> XMLList and not an XML object. This is true even if the argument fed >>>into >>> child is an integer. So myXMLList.child(“0”) will return an XMLList >>>with >>> one XML element which is the first element of the original XMLList. We >>> need the actual XML object at the specified index without the XMLList >>> wrapper. >>> >>> There are three ways I can see to fix this problem: >>> >>> 1. Ignore the spec and return an XML object when the argument is an >>> integer. >>> 2. Change the compiler output to: var foo = >>> foreachiter57_target[foreachiter57]; Bracket access to XMLList returns >>>an >>> XML object. >>> 3. Add a new function to use instead of child() (i.e. getChild()). >>> >>> Thoughts? >>> >>> Harbs >> >