Then +1 from me.

Marcin

On Fri, May 22, 2015 at 8:48 PM, 'Goktug Gokdogan' via GWT Contributors <
[email protected]> wrote:

> Yes, that's correct.
>
> On Fri, May 22, 2015 at 2:43 AM, Marcin Okraszewski <[email protected]>
> wrote:
>
>> Hi,
>> It looks pretty readable to me. Actually my first reaction was also that
>> why export is default false, as initially I thought some of the annotations
>> were used for exporting. So I assume that if for instance I use some JS
>> library, then eg. @JsMethod(name="bar") would specify what JS method is
>> called, regardless of name in Java. Is it correct?
>>
>> Marcin
>>
>>
>> On Wednesday, 20 May 2015 00:18:14 UTC+2, Goktug Gokdogan wrote:
>>
>>> Thanks for the nice summary Ray.
>>>
>>> This is still work in progress but here is the tentative list of
>>> annotations and details of the new semantics. Please play with it and
>>> continue making suggestions.
>>>
>>> *@JsConstructor*
>>> JsConstructor marks a constructor so that it will be the constructor
>>> function for the JavaScript type. Note that, there could be only one
>>> JsConstructor in a type and all other constructors should be delegating to
>>> it.
>>>
>>> public @interface JsConstructor {
>>>   /**
>>>    * If a constructor is exported, then it will be not be pruned by the
>>> compiler.
>>>    */
>>>   boolean export() default false;
>>> }
>>>
>>> *@JsMethod*
>>> JsMethod marks a method in a type as a method that will be directly
>>> translated into a JavaScript method without any obfuscation to its name.
>>> Note that, while instance members are slotted in the prototype, class
>>> members will be defined under the constructor function of the type.
>>>
>>> public @interface JsMethod {
>>>   /**
>>>    * Customizes the name of the method in generated JavaScript. If not
>>> provided, the Java name will
>>>    * be used.
>>>    */
>>>   String name() default "";
>>>
>>>   /**
>>>    * If a method is exported, then it will be not be pruned by the
>>> compiler. Note that if the class
>>>    * is pruned then instance members will also be pruned even they are
>>> exported (i.e. exporting
>>>    * instance members doesn't prevent class pruning).
>>>    */
>>>   boolean export() default false;
>>> }
>>>
>>> *@JsProperty:*
>>> JsProperty marks a field in a type as a method that will be directly
>>> translated into a javascript property without any obfuscation to its name.
>>> If it is applied to a method, it will be treated as a property accessor.
>>> As a result, instead of translating method calls to JsProperty methods as
>>> method calls in JS, they will be translated as property lookups. When a
>>> JsProperty method implemented by a Java class, such methods will be
>>> generated as custom property setter and getter in JavaScript, hence the
>>> property access will trigger the execution of the matching getter or setter
>>> methods.
>>>
>>> JsProperty follows JavaBean style naming convention to extract the
>>> default property name. If the JavaBean convention is not followed, the name
>>> should be set explicitly. For example:
>>>   @JsProperty getX() or @JsProperty isX() translates as <tt>this.x</tt>
>>>   @JsProperty setX(int y) translates as <tt>this.x=y</tt>
>>>
>>> Note that, while non-static member are slotted in the prototype, static
>>> members will be defined under the constructor function of the type.
>>>
>>> public @interface JsProperty {
>>>   /**
>>>    * Customizes the name of the member in generated javascript. If none
>>> is provided;
>>>    * <p>
>>>    * <li>if it is field, the simple Java name will be used.
>>>    * <li>if it is a method, the name will be generated based on JavaBean
>>> conventions.
>>>    */
>>>   String name() default "";
>>>
>>>   /**
>>>    * If a method is exported, then it will be not be pruned by the
>>> compiler. Note that if the class
>>>    * is pruned then non-static members will also be pruned even they are
>>> exported (i.e. exporting
>>>    * non-static methods doesn't prevent class pruning).
>>>    */
>>>   boolean export() default false;
>>> }
>>>
>>> *@JsType:*
>>> JsType is used to describe the JavaScript API of an object, either one
>>> that already exists from the external JavaScript environment, or one that
>>> will be accessible from the external JavaScript environment.
>>>
>>> Marking an object with JsType is similar to marking each public member
>>> of the class with {@link JsProperty}/{@link JsMethod}/{@link JsConstructor}
>>> respectively. In order for this to work correctly the JavaScript name needs
>>> to be unique for each member. Some unobvious ways to cause such name
>>> collisions are:
>>>  * Having method or constructor overloads.
>>>  * Using the same name for a method and a field.
>>>  * Shadowing a field from parent.
>>>
>>> A name collision needs to be avoided by providing a custom name (e.g.
>>> {@link JsProperty#name}) or
>>> by completely ignoring the member using {@link JsIgnore}.
>>>
>>> If the JsType is marked with a prototype reference, then classes extend
>>> from this will use the specified prototype as opposed to the ordinary one
>>> (e.g. java.lang.Object).
>>>
>>> JsTypes act like JavaScriptObject in terms of castability, except when a
>>> prototype is specified, in which case, cast checks and instanceof checks
>>> will be delegated to the native JavaScript instanceof operator.
>>>
>>> public @interface JsType {
>>>   /**
>>>    * Customizes the name of the type in generated javascript. If not
>>> provided, the simple Java name
>>>    * will be used.
>>>    */
>>>   String name() default "";
>>>
>>>   String prototype() default "";
>>>
>>>   /**
>>>    * Setting export here is a shortcut for setting export for each
>>> individual member of the class.
>>>    * TODO: might replace with export={ALL, CLASS_MEMBERS,
>>> INSTANCE_MEMBERS} instead.
>>>    */
>>>   boolean export() default false;
>>> }
>>>
>>> *@JsIgnore:*
>>> Marks a member to be ignored for JsInterop purposes.
>>> This is particularly useful when {@link JsType} applied to a class and
>>> some members are needed to be ignored as they don't comply with
>>> restrictions (e.g. overloading) or shouldn't be exported.
>>>
>>> public @interface JsIgnore {
>>> }
>>>
>>> *@JsNamespace / @JsFunction:* No changes.
>>>
>>> *@JsExport / @JsNoExport:* Deleted.
>>>
>>> On Sat, May 9, 2015 at 6:35 PM, 'Ray Cromwell' via GWT Contributors <
>>> [email protected]> wrote:
>>>
>>> There are multiple things JsInterop needs to accomplish:
>>>
>>> 1) preventing method/field renames
>>> 2) pinning methods (preventing code pruning)
>>> 3) giving a global name/namespace alias to something
>>> 4) auto-converting parameters to allow idiomatic programming
>>> 5) allowing GWT objects to extend native objects
>>>
>>> @JsType actually combines #1/#2/#5 (although it only pins methods if the
>>> object is instantiated)
>>> @JsExport combines #2 and #3 (it not only pins a method, but treats the
>>> type as instantiable, plus it gives it a global alias)
>>>
>>> #4 is handled by @JsConvert/JsAware/JsFunction
>>>
>>> #5 is handled by @JsType(prototype="...")
>>>
>>> Goktug is trying separate out the behavior into the 5 types of interop
>>> semanics:
>>>
>>> 1) a way of indicating a method/field should not be renamed
>>> 2) a way of indicating not to prune something
>>> 3) a way of indicating giving a global alias to something
>>> 4) a way of indicating something extends a native object
>>>
>>> There are cases where you want to prevent renaming, but allow dead code
>>> elimination.
>>>
>>> You could make these separate annotations, that's matter of aesthetics,
>>> e.g.
>>>
>>> @JsPin
>>> @JsExport
>>> @JsName
>>> @JsPrototype
>>>
>>> etc
>>>
>>>
>>>
>>> On Sat, May 9, 2015 at 2:34 PM, Alex White <[email protected]> wrote:
>>>
>>> +1 to keeping the original system. For an interface a finite number of
>>> types > infinite number of String parameters.
>>> Once it gets properly documented on gwtproject.org I doubt people will
>>> consider it confusing. The problem imo is that most of the existing stuff
>>> out there is pseudocode.
>>>
>>> We just started using JsInterop and the only stumbling block we
>>> encountered was that at first we weren't using @JsNamespace.
>>> The other thing we have found is really weird bugs in some of the
>>> nightlies a few days ago, like types deleted from our codebase still
>>> existing and other new types not existing.
>>> It was from about 4-7 days ago and seems to have stopped now. It may be
>>> related to the sourcemaps. The emergent behavior was that after a hard
>>> cache reset Chrome would be trying to fetch a sourcemap for a deleted type.
>>> If we grepped for that symbol in our codebase, we would find references to
>>> it despite it being long gone in a cleanly built proj. Does the gwt
>>> compiler keep some state information hidden somewhere on the hd? Because
>>> that was weird.
>>>
>>>
>>>
>>> On Wednesday, April 22, 2015 at 4:42:10 AM UTC+10, Goktug Gokdogan wrote:
>>>
>>> There is some upcoming changes to JsInteorp in preparation toward v1.0
>>> release.
>>>
>>> The most major change is to the annotations and their meanings. Here is
>>> the doc explaining the changes and the reasoning. We are looking for your
>>> feedback, especially on alternatives.
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>> *Issues with existing design and annotations 1. @JsExport/@JsType
>>> slicing is not intuitive for a lot of people esp. with gwt-exporter
>>> background. People are confused about when to use what.2. There is no
>>> reason to why @JsType doesn’t have any effect on the static methods. That
>>> is only because of the original use cases that the design was tackling only
>>> cared about well formed prototypal structures. Diving deeper into Elemental
>>> and different javascript output styles, ability to define the full class
>>> structure without exporting proves to be useful.3. @JsExport uses @JsType
>>> to define the prototype structure. However this imposes unnecessary
>>> restriction if/when there will be no javascript implementers of the @JsType
>>> contract. @JsType that extends non-JsType is normally ok if it is not
>>> implemented in js.4. You always need to fully qualify the name of the
>>> export even if you just want to change the simple name.The New Annotation
>>> SystemThere will be single annotation called @Js. Applying @Js to a member
>>> is making that member available in javascript without any obfuscation.
>>> However it is not safe from pruning if there are no references in java
>>> code, so one needs to put enable exporting for the type if no pruning
>>> wanted. Applying @Js at class level should considered as a shortcut to
>>> apply @Js to all members. See following chart for the attributes and their
>>> corresponding behavior:@JsType@Js(exports =
>>> INSTANCE_MEMBERS)@JsFunction@Js(mode = FUNCTION)@JsLiteral@Js(mode =
>>> LITERAL)@JsMethod@Js(name = "myName")@JsProperty@Js(property =
>>> true)@Js(name = "myName", property = true)@JsNamespace@Js(namespace =
>>> "mynamespace")@JsExport@Js(exports = STATIC_MEMBERS)@Js(name = “A”, exports
>>> = ALL)@Js(name = “A”, namespace=”a.b.c.”, exports = ALL)// When applied to
>>> a member@Js(export = true)@Js(name = “myName”, export =
>>> true)@JsNoExport@Js(ignore=true)@JsOpaque@Js(opaque=true)See Appendix below
>>> for a complete comparison to existing annotations.Semantics /
>>> Implementation in GWTImplementation: - Apply all Js names as bridge methods
>>> (or the reverse if Js extends Java object case
>>> <https://groups.google.com/a/google.com/d/msg/gwt-users/i5KCHorBC6k/6wkPSuBBXBgJ>
>>> needs to be supported).- Optimize away everything with regular optimization
>>> rules if the member is not exported.- Generate export statements for all
>>> pinned methods/classes.Usage: - Hybrid / Inbox use case needs to use @Js
>>> with exports. This will make the whole object exported and not pruned.-
>>> Regular library importing should use @Js with interfaces (no exports), if
>>> it is a callback the @Js interface should be marked as exported so the
>>> methods are not pruned when the object is not pruned.- Elemental needs to
>>> use not exported Js types with prototype set and native methods.Checks -
>>> mode and exports is only used in types.- export and ignore is only used in
>>> members.- property is only used in methods.- name is only used in members
>>> and types.- namespace is only used in exported static members, types and
>>> packages.- mode=FUNCTION cannot have any attribute set.Considered
>>> AlternativesAlternative 1:We could follow the above design but keep using
>>> old annotations for class level annotations: - @Js(mode=OBJECT) -->
>>> @JsType- @Js(mode=FUNCTION) --> @JsFunction- @Js(mode=LITERAL) -->
>>> @JsLiteral- @Js(namespace=”...”) --> @JsNamespace- @JsMember for the
>>> rest.Pros: - *
>>>
>>> ...
>>
>>  --
>> You received this message because you are subscribed to the Google Groups
>> "GWT Contributors" group.
>> To unsubscribe from this group and stop receiving emails from it, send an
>> email to [email protected].
>> To view this discussion on the web visit
>> https://groups.google.com/d/msgid/google-web-toolkit-contributors/a0979a8f-b56e-4e29-a54c-8972bb908f34%40googlegroups.com
>> <https://groups.google.com/d/msgid/google-web-toolkit-contributors/a0979a8f-b56e-4e29-a54c-8972bb908f34%40googlegroups.com?utm_medium=email&utm_source=footer>
>> .
>>
>> For more options, visit https://groups.google.com/d/optout.
>>
>
>  --
> You received this message because you are subscribed to a topic in the
> Google Groups "GWT Contributors" group.
> To unsubscribe from this topic, visit
> https://groups.google.com/d/topic/google-web-toolkit-contributors/Dwdk-aEHs8Y/unsubscribe
> .
> To unsubscribe from this group and all its topics, send an email to
> [email protected].
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/google-web-toolkit-contributors/CAN%3DyUA0S5%3DS0mvjS-%2BCx_2%2BG5wvLs0FhJ9cDhh80t6HCdRfoZw%40mail.gmail.com
> <https://groups.google.com/d/msgid/google-web-toolkit-contributors/CAN%3DyUA0S5%3DS0mvjS-%2BCx_2%2BG5wvLs0FhJ9cDhh80t6HCdRfoZw%40mail.gmail.com?utm_medium=email&utm_source=footer>
> .
>
> For more options, visit https://groups.google.com/d/optout.
>

-- 
You received this message because you are subscribed to the Google Groups "GWT 
Contributors" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/google-web-toolkit-contributors/CAFrnd49dJe3M-odMztf%3D4J%2BwwDBqkZ9S0%3DkD4MWW8vACo6_a%3DA%40mail.gmail.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to