Mike, too bad our different time zones slow down communication so much...

Ah yes, this is about the [Native] annotation we discussed in this other
thread.
Jangaroo needs the ActionScript API of all the built-in classes (JavaScript
globals), so when using String, it actually parses String.as and finds the
[Native] annotation. It then uses a different AMD module name, using the
"native" plugin that, instead of loading a script, just retrieves the
global JavaScript object.

In the meantime, [Native] can do even more:

   - Using [Native(amd="path/library")] on a class com.acme.Foo, you tell
   the compiler to not generate any code for this class, but whenever it is
   used, load the AMD module "path/library". This allows to implement an
   ActionScript API "natively" in JavaScript. The corresponding "native!"
   notation would be "native!com.acme.Foo@path/library". If you just write
   [Native(amd)], the module name is derived from the class name as usual, in
   this case the generated code would require "classes/com/acme/Foo" (*no*
   native! plugin!).
   - Using [Native(global="Ext.Panel")] on a class ext.Panel allows to
   define a mapping from ActionScript identifier (ext.Panel) to JavaScript
   global name (upper-case "package" Ext.Panel). If no "global" is given, the
   ActionScript name must be exactly the same as the JavaScript name.
   - You can even combine "amd" and "global", to integrate with non-AMD
   libraries and to define a fine-grained API for a library that ships as one
   big script. For example, the ActionScript class ext.Panel which represents
   Ext JS's Ext.Panel would be annotated as [Native(amd="ext-js/ext-all",
   global="Ext.Panel")] (notation: "native!Ext.Panel@ext-js/ext-all"), and
   Ext.form.TextField  would be defined as class ext.form.TextField and
   annotated as [Native(amd="ext-js/ext-all", global="Ext.form.TextField")]
   (notation: "native!Ext.form.TextField@ext-js/ext-all"). The script is
   only loaded once, but the "native!" plugin retrieves different global
   objects.


What all [Native] classes have in common is that there is no "_" property,
i.e. no indirection to allow for static code in the compilation unit. If we
stumble across a native JavaScript library that needs lazy initialization,
we can still add another annotation like [Lazy(init="<init-method-name>")].

We really should optimize the special case you asked for, where a
non-aliased, non-namespaced global like "String" or "parseInt" is assigned
to a parameter via the "native!" plugin. While it does speed up access to
"String" and "parseInt" a tiny bit, it produces unnecessary code overhead.
I am going to change that in Jangaroo and in the as-js-runtime-prototype
accordingly.

Oh, I did it again, concise question, lengthy response, so here comes...

*tl;dr*: if a referenced class is [Native] and top-level, access it as a
global JavaScript object. If it is [Native] but not top-level, use
define(["native!<qualified-name>"], function(<short-name>) { ... }) similar
to non-native classes. There are some advanced usages ("amd", "global") we
can care about later. For reference, you can use the ActionScript standard
classes defined in branch "jangaroo-3" of the
jangaroo-runtime<https://github.com/CoreMedia/jangaroo-tools/tree/jangaroo-3/jangaroo/jangaroo-runtime/src/main/joo>
.

Greetings
-Frank-

Reply via email to