The modification is in the master or not yet?

El miércoles, 9 de septiembre de 2015, 23:05:46 (UTC-3), Goktug Gokdogan 
escribió:
>
> If you have followed some jsinterop discussions earlier [1], we decided to 
> drop Prototype class generation in favor of concrete classes with native 
> methods:
>
>  @JsType(prototype="Object")
>  public class JsObject {
>    public static native String[] keys(JsObject obj);
>    public native boolean hasOwnProperty(String prop);
>  }
>
> I'm implementing this and it works well but the prototype attribute is 
> serving a very similar purpose to name and namespace attribute. The 
> attribute is simple there because we cannot differentiate if the type 
> represents a type that is already available in native code or if the type 
> is introduced by java.
>
> Similarly, we hit such ambiguity for interfaces. If you have a JsType 
> interface, it is not clear that if such type is introduced by the app or if 
> it is just a stub for existing type that is already available natively. 
> These affects several stuff like how instanceof works (which is quite 
> problematic) or if we should generate any code for the interface or not 
> (which is more problematic in j2cl).
>
> So the solution we came up with is to remove the prototype attribute and 
> instead introduce isNative attribute. When the attribute is set to true, it 
> basically tells the compiler to assume that the type already exists in 
> native code (similar to the native keyword available for methods).
> The prototype will be equivalent to the fully qualified javascript name 
> (which is calculated based on JsType name/namespace, JsPackage etc). So 
> above code becomes:
>
>  @JsType(namepace=GLOBAL, name="Object", isNative=true)
>  public class JsObject {
>    public static native String[] keys(JsObject obj);
>    public native boolean hasOwnProperty(String prop);
>  }
>
> or if the package-info.java already has @JsPackage(name=GLOBAL), it could 
> be re-written as
>
>  @JsType(isNative=true)
>  public class Object {
>    public static native String[] keys(Object obj);
>    public native boolean hasOwnProperty(String prop);
>  }
>
> Based on this change, we also redefining how the instanceof works for 
> native JsTypes.
> If the native type is concrete, the instanceof will be generated in 
> JavaScript as
>
>   obj instanceof <fully_qualified_js_name>
>
> If the native type is an interface, the instanceof operation will always 
> return true as it simply represents a loose javascript contract. [2]
>
> For all non-native JsTypes, regular java instanceof semantic will apply. 
> That means, for example, if you do (jso instanceof SomeJsTypeInterface), 
> it will return false (earlier it would have returned true).
>
> That's all for now. As always, feel free to send any comments and let me 
> know what you think.
>
> Cheers,
>
> Goktug.
>
>
> PS: Note that due this change, when the new annotations introduced, you 
> will need to add isNative=true for all interfaces that is abstracting some 
> javascript API. If you were using it for just generating unobfuscated names 
> for java APIs then you can keep it as it is.
>
> [1] 
> https://groups.google.com/d/topic/google-web-toolkit-contributors/L6uh96NcZtE/discussion
>
> [2] We may later provide a way for developers to customize this behavior, 
> like providing their own method to be called for instanceof.
>

-- 
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/15b303f2-ab95-4cd0-a611-fabc7647d190%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to