I’m going to have to do some fancy footwork to get this working. Flash Builder 
is complaining that palyerglobal.swc already exists whe I try to create an XML 
class in the default package.

Any ideas on how to do this?

On Nov 10, 2015, at 9:39 AM, Harbs <harbs.li...@gmail.com> wrote:

> OK. This approach is different than the approach I started on, but it could 
> be workable.
> 
> I was going down the road where there would be a set of single new classes 
> which would proxy to XML and Document in Flash and HTML respectively. You are 
> suggesting we stick with XML and XMLList for Flash and create new JS versions 
> with the same public API as XML and XMLList.
> 
> Where would you go about creating those JS classes? Would I just out it in an 
> “as” folder and wrap the whole class in a COMPILE::JS? Also, what package 
> would this go into? I’m assuming none, since XML and XMLList are both top 
> level classes.
> 
> BTW, I need to read and write XML files, so yeah, converting to JSON is not 
> an option.
> 
> On Nov 10, 2015, at 1:28 AM, Alex Harui <aha...@adobe.com> wrote:
> 
>> Renaming the thread
>> 
>> On 11/9/15, 1:12 PM, "Harbs" <harbs.li...@gmail.com> wrote:
>> 
>>> Well, I’d be interested in your findings.
>>> 
>>> If operator definitions is possible .. will be easier than . operators.
>>> If we allow single dot operators, it will be difficult to differentiate
>>> between E4X syntax and function calls. I’d really like to drop the () on
>>> length and some of the other methods… Those are a course for very common
>>> errors.
>> 
>> Maybe we aren’t talking about the same thing, but let me explain in more
>> detail what I’m saying.
>> 
>> Here is some E4x:
>> 
>> var a:XML = new XML(\"<top attr1='cat'><child attr2='dog'><grandchild
>> attr3='fish'>text</grandchild></child></top>\”);
>> var b:XMLList = a..child;
>> var c:XMLList = a..grandchild.(@attr2 == 'fish');
>> 
>> 
>> (It would be nice to have others add in their favorite or common scenarios
>> if they are different).
>> 
>> The compiler already understands the “..” as well as the “@“.  The way
>> Falcon and FalconJX works is that there is a parsing phase that takes your
>> source code and creates a tree of different kinds of nodes (ClassNodes,
>> FunctionNodes, FunctionCallNodes, OperatorNodes,
>> MemberAccessExpressionNodes, etc).  Falcon then walks the tree and
>> converts these nodes to ABC.  FalconJX walks the tree and outputs
>> JavaScript.
>> 
>> I just ran a test and the above code was parsed into a tree where the “..”
>> was the operator for a MemberAccessExpression. The “@“ was converted into
>> a unary operator for an E4xFilter operator for another
>> MemberAccessExpression.  This is good for FalconJX, because that means we
>> understand the semantics of this syntax and can then generate any
>> JavaScript we want.
>> 
>> IMO, given that folks are already wishing for a more Spark and MX-like
>> component set, I think we should try to mimic as much of E4x as possible
>> as opposed to inventing a new API that folks would have to migrate to.
>> Performance-wise, I still think it would be worth everyone’s time to
>> convert XML to JSON, but there are probably folks who can’t move.
>> 
>> Given that FlexJS leverages the concept of replacing abstractions, if you
>> create an XML and XMLList class in JavaScript and populate them with the
>> same APIs as ActionScript, lots of things should work.  The FalconJX
>> compiler could easily be taught to convert “a..child” into
>> “a.descendants()”.  If the JS version has an extra filter() function, then
>> FalconJX would convert
>> 
>> a..grandchild.(@attr2 == 'fish’)
>> 
>> into 
>> 
>> a.descendants().filter(function (node) { return
>> node.attribute(‘fish’).length() })
>> 
>> or something like that.
>> 
>> I think the part of XML in ActionScript that isn’t practical to do in
>> JavaScript is handling change notifications.  It might be possible to do
>> some of it for known properties but I think it would be fragile.
>> 
>> For example:
>> 
>> var d:XML = a..child[0];
>> d.foo = <bar />;
>> 
>> In ActionScript you can get a change notification when foo is assigned.
>> With a bunch of work, if we know you are setting “foo” (which we do know
>> in this case) I think we could use Object.defineProperty to define a
>> property on d.
>> 
>> What we can’t easily do is:
>> 
>> var d:XML = a..child[0];
>> var s:String = “someRandomPropertyName”;
>> d[s] = <bar />;
>> 
>> If we don’t know what ’s’ is, we can’t define properties early on the XML
>> node.  I suppose with even more code we could generate code for that.
>> 
>> BTW, for any sort of solution, we would have to know that “d” is XML and
>> not Object and that would require more careful type handling in the code
>> our customers write.  If you have:
>> 
>> 
>> public class MyClass extends EventDispatcher
>> {
>>   public var someProp:XML;
>> }
>> 
>> Then in some other class you have:
>> 
>> var instance:MyClass = new MyClass();
>> instance.addEventListener(“someEvent”, myHandler);
>> 
>> function myHandler(event:Event):void
>> {
>>   event.target.someProp.foo = <newnode />;
>> }
>> 
>> We have lost the notion that someProp is XML and not Object because
>> event.target is defined as Object and not MyClass.  Folks will have to fix
>> up their code to be:
>> 
>>   (event.target as MyClass).someProp.foo = <newnode />;
>> 
>> Which won’t be much fun and if you miss one, you won’t get a compile error.
>> 
>> FWIW, we could probably put in a warning if you forget () on “length”,
>> again if we know that length is being access on an XML node and not Object.
>> 
>> HTH,
>> -Alex
>> 
>> 
> 

Reply via email to