OK, I think I got this working and pushed it to the JsToAs branch of Falcon.
I’m going to take on allowing keywords to be used for function names and some other places as I noticed it is affecting the JS to AS port as well. -Alex On 9/19/15, 1:57 PM, "Josh Tynjala" <joshtynj...@gmail.com> wrote: >Yeah, changing FalconJX to handle window as a special case would work too. >It would make things easier on other tools, like externc and dts2as. As a >bonus, while it's a simple string that we wanted to avoid, it's actually >valid JS, so it wouldn't have as much potential for conflict. I think I >like this idea. > >In regards to putting variables/properties in packages, it's possible in >AS3. In Feathers, I created a feathers.FEATHERS_VERSION constant a while >back. While I used const there, I assume that var would be valid too. > >package feathers >{ > public const FEATHERS_VERSION:String = "2.2.0"; >} > >https://github.com/BowlerHatLLC/feathers/blob/v2.2.0/source/feathers/FEATH >ERS_VERSION.as > >It even shows up in the API documentation: > >http://feathersui.com/api-reference/feathers/package-detail.html > >I suspect that getters and setters might not work in a package, though. > >- Josh > >On Sat, Sep 19, 2015 at 1:36 PM, Alex Harui <aha...@adobe.com> wrote: > >> Inline as well, gotta scroll way down for my latest proposal. >> >> On 9/19/15, 9:01 AM, "Josh Tynjala" <joshtynj...@gmail.com> wrote: >> >> >Responses inline. >> > >> >- Josh >> > >> >On Sat, Sep 19, 2015 at 8:03 AM, Alex Harui <aha...@adobe.com> wrote: >> > >> >> >> >> Hmm. Maybe, but what does that sort of import really do? Why not >>just >> >> create a global subclass of goog.events.Event? >> >> >> > >> >A global subclass would work only if you were creating all instances. >>If >> >you need to use the class as a method argument, where the arguments >>come >> >from somewhere else that might not be using the subclass, the global >> >subclass would not work: >> > >> >private function listener(event:GoogEvent):void //runtime error >>because it >> >might receive goog.events.Event >> > >> >If what imports do is say, "every time that you find Event, replace it >> >with >> >goog.events.Event", then this new syntax would allow a little more >> >flexibility "every time that you find GoogEvent, replace it with >> >goog.events.Event". >> >> Well, that would be a big and scary change. For some reason I don’t >>know, >> imports open namespaces for multi name lookups at runtime. >> >> What’s interesting about the TS import is it puts you on the slippery >> slope towards preprocessor macros. >> >> > >> > >> >> BTW, I realized that the choices should have had more examples. >>Maybe: >> >> >> >> var foo:.Event; >> >> >> >> doesn’t looks so bad, but once you fill it out further: >> >> >> >> var foo:.Event = new .Event(); >> >> var bar:.Event = foo as .Event(); >> >> var baz:.Event = .Event(foo); >> >> >> >> Do we still like it? I think I have found one place to try to >>change to >> >> make it work. >> >> >> > >> >If the global Event can be used without any qualifier, this wouldn't be >> >necessary. However, yes, I think I still like it the same. I would say >> >that >> >the most difficult thing to read is the colon followed by the dot (:.), >> >but >> >that was in the original example >> > >> >Another option is to throw in some double underscores to try to avoid >> >naming conflicts: >> > >> >__global__.Event >> > >> >I think I'd still prefer .Event, though. >> > >> > >> >> However, my new thought of the day is this: >> >> >> >> For SWFs, we can discourage folks from making conflicts with classes >>in >> >> the “global” package so this is really for JS users. But don’t folks >> >> doing native JS already have the option of using “window” as the >>package >> >> name? >> >> >> >> import window.Event; >> >> var foo:window.Event = new window.Event(); >> >> >> >> Could we auto-replace Event with window.Event when generating externs >> >>and >> >> then require folks to use window.Event when they want the “global” >>ones? >> >> >> > >> >I had never considered window to be like a package before. That's a >>very >> >interesting idea. >> > >> >It's worth noting that window has its own member variables too, so it's >> >not >> >only classes that are stored there. Will there be a conflict if both a >> >window global variable and a window package exist? I guess, since AS3 >> >supports variables and functions inside a package, window wouldn't >> >necessarily need to be a global variable. We could just move everything >> >into the package. >> >> Actually, we’ve already hit this trying to stub GCL for FlexJS. GCL has >> functions and variables on goog.events like goog.events.fireListener, >>and >> then classes like goog.events.EventTarget. I don’t recall any AS >> variables/properties on packages in AS3 because I think packages are not >> objects in AS3 like they are in JS. So we created a class in the goog >> package called events (lower case) and put the same variables GCL puts >>on >> its JS goog.events object. One of my latest commits changes the >>compiler >> to try goog.events as both a package and a class. >> >> So yes, in theory we would have a class in the default package called >> “window” but also classes in the “window” package called Events. >> >> > >> >externc would need to be updated with a new optional argument to say >>that >> >globals should be put into a package. I think that this package name >> >should >> >be configurable, to support other hypothetical JS environments. >> >> Well, that’s true if we do it the “legitimate” way. But that might also >> force everyone using js.swc to start every file with “import windows.*” >> which is acceptable to me, but let me describe a possible “hack”. >> >> I think we could make “window” a special word in FalconJX and when >> creating package namespaces, collapse it down to “” (empty string) which >> is equivalent to the default package. Then, if you are just writing >>plain >> JS and don’t import any other class called Event, you can just use Event >> without any import statement or package prefix and it would just work. >>No >> changes to ExternC or any existing code. >> >> Then, if you import an Event class like goog.events.Event, the >> AmbiguousDefinition logic would look at the file scope to see if there >>was >> an “import window.Event;”. If there isn't, it will assume you meant >> goog.events.Event because not importing window.Event would mean you >>never >> intended to use the class in the default package. >> >> It would be only in the rare case where you import both >>goog.events.Event >> and window.Event that you would start getting AmbiguousDefinition errors >> and have to fully qualify the plain Event as window.Event, and the >>output >> would not be prefixed with “window”. >> >> And what I like more about this sort of hack (or doing it the legitimate >> way) is that it doesn’t introduce new “unexpected” syntax like “.Event”. >> >> Thoughts? >> -Alex >> >>