JsInterop namespace: assign constructor to last node.
Bug-Link: https://github.com/gwtproject/gwt/issues/9201
Change-Id: I8ffc492bff0a200ac6ad15ac11a4a70096ed10f6
diff --git a/dev/core/super/com/google/gwt/dev/jjs/intrinsic/com/google/gwt/lang/JavaClassHierarchySetupUtil.java b/dev/core/super/com/google/gwt/dev/jjs/intrinsic/com/google/gwt/lang/JavaClassHierarchySetupUtil.java
index 185ac08..687225f 100644
--- a/dev/core/super/com/google/gwt/dev/jjs/intrinsic/com/google/gwt/lang/JavaClassHierarchySetupUtil.java
+++ b/dev/core/super/com/google/gwt/dev/jjs/intrinsic/com/google/gwt/lang/JavaClassHierarchySetupUtil.java
@@ -146,11 +146,8 @@
// Parentheses added to eliminate strict JS warning in Firefox.
for (var part; parts.length && (part = parts.shift());) {
- if (cur[part]) {
- cur = cur[part];
- } else {
- cur = cur[part] = optCtor || {};
- }
+ // assign the constructor to the last node (when parts is empty)
+ cur = cur[part] = cur[part] || !parts.length && optCtor || {};
}
return cur;
}-*/;
diff --git a/user/test/com/google/gwt/core/client/interop/JsExportTest.java b/user/test/com/google/gwt/core/client/interop/JsExportTest.java
index fa5215e..1c044d8 100644
--- a/user/test/com/google/gwt/core/client/interop/JsExportTest.java
+++ b/user/test/com/google/gwt/core/client/interop/JsExportTest.java
@@ -18,6 +18,8 @@
import static com.google.gwt.core.client.ScriptInjector.TOP_WINDOW;
import com.google.gwt.core.client.ScriptInjector;
+import com.google.gwt.core.client.js.JsExport;
+import com.google.gwt.core.client.js.JsNamespace;
import com.google.gwt.junit.client.GWTTestCase;
/**
@@ -144,8 +146,42 @@
return obj.getInstance();
}-*/;
+ @JsExport
+ @JsNamespace("bar.foo.baz")
+ static class MyExportedClassCorrectNamespace {
+ public MyExportedClassCorrectNamespace() { }
+ }
+
+ public void testExportClass_correctNamespace() {
+ assertNull(getGlobalByQualifiedName("bar.MyExportedClassCorrectNamespace"));
+ assertNull(getGlobalByQualifiedName("bar.foo.MyExportedClassCorrectNamespace"));
+ assertTrue(isFunction(getGlobalByQualifiedName("bar.foo.baz.MyExportedClassCorrectNamespace")));
+ Object o = newInstance(getGlobalByQualifiedName("bar.foo.baz.MyExportedClassCorrectNamespace"));
+ assertNotNull(o);
+ assertTrue(o instanceof MyExportedClassCorrectNamespace);
+ }
+
+ private native Object getGlobalByQualifiedName(String qualifiedName) /*-{
+ var components = qualifiedName.split('\.');
+ var scope = $global;
+ for (var i = 0; i < components.length; i++) {
+ scope = scope[components[i]];
+ }
+ return scope;
+ }-*/;
+
+ private native boolean isFunction(Object object) /*-{
+ return typeof object == "function";
+ }-*/;
+
+ private native Object newInstance(Object jsConstructor) /*-{
+ return new jsConstructor;
+ }-*/;
+
public void testExportClass_implicitConstructor() {
- assertNotNull(createMyExportedClassWithImplicitConstructor());
+ Object o = createMyExportedClassWithImplicitConstructor();
+ assertNotNull(o);
+ assertTrue(o instanceof MyExportedClassWithImplicitConstructor);
}
private native Object createMyExportedClassWithImplicitConstructor() /*-{
diff --git a/user/test/com/google/gwt/core/client/interop/MyExportedClassWithImplicitConstructor.java b/user/test/com/google/gwt/core/client/interop/MyExportedClassWithImplicitConstructor.java
index f4d62a5..f74c39f 100644
--- a/user/test/com/google/gwt/core/client/interop/MyExportedClassWithImplicitConstructor.java
+++ b/user/test/com/google/gwt/core/client/interop/MyExportedClassWithImplicitConstructor.java
@@ -23,5 +23,4 @@
*/
@JsExport
public class MyExportedClassWithImplicitConstructor {
-
}