Pretty sure in AS for Flash, you can write (without "new"):

  var herbs:XML = XML(someXMLListWithOneElement);

And it will "do the right thing".

I guess we will have to create Language.XML or add a static toXML() on XML
and have the compiler catch the top-level function call and redirect it to
that conversion function.

Thoughts?
-Alex

http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/package.
html#XML()

On 7/17/17, 12:32 PM, "Harbs" <harbs.li...@gmail.com> wrote:

>I just tried to see if it might work, but I get an error. Obviously
>that’s a no-no...
>
>   [java] 
>/Users/harbs/Documents/ApacheFlex/flex-asjs/frameworks/projects/XML/src/ma
>in/flex/XML.as(317): col: 13 A return value is not allowed in a
>constructor.
>     [java]
>     [java]                             return (xml as XMLList).toXML();
>
>> On Jul 17, 2017, at 10:28 PM, Harbs <harbs.li...@gmail.com> wrote:
>> 
>> I don’t think so. Write one where? How? We already have a top level XML
>>constructor.
>> 
>> Wouldn’t the compiler output:
>> XML(myXML)
>> 
>> as:
>> org.apache.flex.utils.Language.as(myXML,XML)?
>> 
>> I’m pretty sure the only way to instantiate an XML object is to use new.
>> 
>> Well, I just tried XML(myXMLList) and it does not call Language.as. It
>>keeps the code exactly as it was and invokes the XML constructor with
>>the XMLList as the parameter.
>> 
>> Of course that goes totally haywire this refers to window and none of
>>the code makes any sense. I have no idea if a constructor can return
>>something else in the middle of it. (i.e. if an XMLList is fed to the
>>XML constructor, call toXML() on the XMLList and return that.)
>> 
>> Harbs
>> 
>>> On Jul 17, 2017, at 10:08 PM, Alex Harui <aha...@adobe.com.INVALID>
>>>wrote:
>>> 
>>> I thought we (you) already wrote one.  If not, we won't we need one?
>>> 
>>> -Alex
>>> 
>>> On 7/17/17, 12:01 PM, "Harbs" <harbs.li...@gmail.com> wrote:
>>> 
>>>> Thanks for the pointer.
>>>> 
>>>> I changed the emitter to output indexed access. It seems to work. :-)
>>>> (committed)
>>>> 
>>>> I’m not sure what you mean about the top level XML function. How does
>>>> that work in Javascript?
>>>> 
>>>>> On Jul 17, 2017, at 7:47 PM, Alex Harui <aha...@adobe.com.INVALID>
>>>>> wrote:
>>>>> 
>>>>> 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
>>>>>>> 
>>>>>> 
>>>>> 
>>>> 
>>> 
>> 
>

Reply via email to