We might keep around a Language class for things "every" app will need
(is/as, maybe some coercions).  But trace, sortOn, Vector should be PAYG.

-Alex

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

>Another reason to not add to Language is that it would make Language
>depend on XML.
>
>I’ll try to write these functions today.
>
>I don’t mind breaking up utility classes, but the Language class will
>need changes to the compiler. It looks like it’s more than just replacing
>org.apache.flex.utils.Language with org.apache.flex.utils (or something
>like that) because the compiler needs to know when to add goog.requires
>for each of the utility functions.
>
>> On Jul 18, 2017, at 5:19 AM, Alex Harui <aha...@adobe.com.INVALID>
>>wrote:
>> 
>> IMO, toXML() is more PAYG.  We really shouldn't keep adding to Language.
>> 
>> I'm going to figure out why your standalone functions like callLater,
>> assert, etc, aren't handled correctly then we should seriously think
>>about
>> finding a volunteer to break up these utility classes into utility
>> functions since that would be more PAYG.
>> 
>> -Alex
>> 
>> On 7/17/17, 2:55 PM, "Harbs" <harbs.li...@gmail.com
>><mailto:harbs.li...@gmail.com>> wrote:
>> 
>>> I believe you are right in Flash. Same for XMLList().
>>> 
>>> I’d be happy to write the functions. Should we do a top level toXML()
>>>or
>>> Language.XML() and Language.XMLList()?
>>> 
>>> The latter seems to fit the pattern for the rest of the language
>>>features.
>>> 
>>>> On Jul 18, 2017, at 12:24 AM, Alex Harui <aha...@adobe.com.INVALID>
>>>> wrote:
>>>> 
>>>> 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
>>>> 
>>>> 
>>>> 
>>>>https://na01.safelinks.protection.outlook.com/?url=http%3A%2F%2Fhelp.ad
>>>>ob 
>>>><https://na01.safelinks.protection.outlook.com/?url=http%3A%2F%2Fhelp.a
>>>>dob>
>>>> e.com 
>>>><https://na01.safelinks.protection.outlook.com/?url=http%3A%2F%2Fe.com%
>>>>2F&data=02%7C01%7C%7C5382fcba9a4c46fe99a508d4cd9cc9d1%7Cfa7b1b5a7b34438
>>>>794aed2c178decee1%7C0%7C0%7C636359520659004208&sdata=puTvZn8XbISXRNbPzi
>>>>Kdy2QHDDh6OxiOhJwU4uz%2FtzM%3D&reserved=0>%2Fen_US%2FFlashPlatform%2Fre
>>>>ference%2Factionscript%2F3%2Fpackage&da
>>>> 
>>>>ta=02%7C01%7C%7Ca738e996dd3d4b05159108d4cd5e8cc2%7Cfa7b1b5a7b34438794ae
>>>>d2
>>>> 
>>>>c178decee1%7C0%7C0%7C636359253349448225&sdata=7YC%2B75edAjohFvpCU3Sd4d%
>>>>2B
>>>> RvWJYLlYGpyG5FHK5teQ%3D&reserved=0.
>>>> 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/sr
>>>>>c/
>>>>> 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