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/FEATHERS_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
>
>

Reply via email to