Remove remaining jsPrototype references.
Change-Id: I6162fa34d9ea11e0dec5693ebb4b581366dc5fe1
Review-Link: https://gwt-review.googlesource.com/#/c/13571/
diff --git a/dev/core/src/com/google/gwt/dev/javac/JsInteropUtil.java b/dev/core/src/com/google/gwt/dev/javac/JsInteropUtil.java
index 455eed5..a5bdaec 100644
--- a/dev/core/src/com/google/gwt/dev/javac/JsInteropUtil.java
+++ b/dev/core/src/com/google/gwt/dev/javac/JsInteropUtil.java
@@ -42,10 +42,16 @@
public static void maybeSetJsInteropProperties(JDeclaredType type, Annotation... annotations) {
AnnotationBinding jsType = JdtUtil.getAnnotation(annotations, JSTYPE_CLASS);
- String jsPrototype = JdtUtil.getAnnotationParameterString(jsType, "prototype");
String namespace = maybeGetJsNamespace(annotations);
String exportName = maybeGetJsExportName(annotations, "");
- type.setJsTypeInfo(jsType != null, namespace, exportName, exportName != null, jsPrototype);
+ String jsPrototype = JdtUtil.getAnnotationParameterString(jsType, "prototype");
+ boolean isJsNative = jsPrototype != null;
+ if (isJsNative) {
+ int indexOf = jsPrototype.lastIndexOf(".");
+ namespace = indexOf == -1 ? "" : jsPrototype.substring(0, indexOf);
+ exportName = jsPrototype.substring(indexOf + 1);
+ }
+ type.setJsTypeInfo(jsType != null, isJsNative, namespace, exportName, exportName != null);
type.setJsFunctionInfo(JdtUtil.getAnnotation(annotations, JSFUNCTION_CLASS) != null);
}
diff --git a/dev/core/src/com/google/gwt/dev/jjs/ast/HasJsInfo.java b/dev/core/src/com/google/gwt/dev/jjs/ast/HasJsInfo.java
index afd2e9f..a35adcb 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/ast/HasJsInfo.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/ast/HasJsInfo.java
@@ -24,7 +24,7 @@
String getJsName();
- String getExportNamespace();
+ String getJsNamespace();
- String getQualifiedExportName();
+ String getQualifiedJsName();
}
diff --git a/dev/core/src/com/google/gwt/dev/jjs/ast/JDeclaredType.java b/dev/core/src/com/google/gwt/dev/jjs/ast/JDeclaredType.java
index 400b3c4..58d6551 100755
--- a/dev/core/src/com/google/gwt/dev/jjs/ast/JDeclaredType.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/ast/JDeclaredType.java
@@ -53,9 +53,9 @@
private boolean isJsFunction;
private boolean isJsType;
private boolean isClassWideExport;
+ private boolean isJsNative;
private String jsNamespace = null;
private String jsName = null;
- private String jsPrototype;
/**
* The types of nested classes, https://docs.oracle.com/javase/tutorial/java/javaOO/nested.html
@@ -376,13 +376,9 @@
return false;
}
- public String getJsPrototype() {
- return jsPrototype;
- }
-
@Override
public boolean isJsNative() {
- return jsPrototype != null;
+ return isJsNative;
}
/**
@@ -442,16 +438,15 @@
assert JType.replaces(resolvedInterfaces, superInterfaces);
superInterfaces = Lists.normalize(resolvedInterfaces);
if (jsNamespace == null) {
- jsNamespace = computeExportNamespace(pkgInfo);
+ jsNamespace = computeJsNamespace(pkgInfo);
}
}
- private String computeExportNamespace(JDeclaredType pkgInfo) {
+ private String computeJsNamespace(JDeclaredType pkgInfo) {
if (enclosingType != null) {
- return enclosingType.getQualifiedExportName();
+ return enclosingType.getQualifiedJsName();
}
- return pkgInfo != null && pkgInfo.jsNamespace != null ? pkgInfo.jsNamespace
- : getPackageName();
+ return pkgInfo != null && pkgInfo.jsNamespace != null ? pkgInfo.jsNamespace : getPackageName();
}
/**
@@ -467,13 +462,13 @@
this.isExternal = isExternal;
}
- public void setJsTypeInfo(boolean isJsType, String jsNamespace, String jsName,
- boolean isClassWideExport, String jsPrototype) {
+ public void setJsTypeInfo(boolean isJsType, boolean isJsNative, String jsNamespace,
+ String jsName, boolean isClassWideExport) {
this.isJsType = isJsType;
+ this.isJsNative = isJsNative;
this.jsNamespace = jsNamespace;
this.jsName = jsName;
this.isClassWideExport = isClassWideExport;
- this.jsPrototype = jsPrototype;
}
public void setJsFunctionInfo(boolean isJsFunction) {
@@ -587,9 +582,9 @@
return null;
}
- public String getQualifiedExportName() {
- String simpleExportName = Strings.isNullOrEmpty(jsName) ? getSimpleName() : jsName;
- return jsNamespace.isEmpty() ? simpleExportName : jsNamespace + "." + simpleExportName;
+ public String getQualifiedJsName() {
+ String simpleJsName = Strings.isNullOrEmpty(jsName) ? getSimpleName() : jsName;
+ return jsNamespace.isEmpty() ? simpleJsName : jsNamespace + "." + simpleJsName;
}
public NestedClassDisposition getClassDisposition() {
diff --git a/dev/core/src/com/google/gwt/dev/jjs/ast/JField.java b/dev/core/src/com/google/gwt/dev/jjs/ast/JField.java
index 6c1cf35..90ffce5 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/ast/JField.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/ast/JField.java
@@ -81,7 +81,7 @@
JReferenceType.NULL_TYPE, false, Disposition.FINAL);
private String jsName;
- private String exportNamespace;
+ private String jsNamespace;
private boolean exported;
private final JDeclaredType enclosingType;
private final boolean isCompileTimeConstant;
@@ -133,7 +133,7 @@
@Override
public void setJsMemberInfo(String namespace, String name, boolean exported) {
this.jsName = name;
- this.exportNamespace = namespace;
+ this.jsNamespace = namespace;
this.exported = exported;
}
@@ -146,13 +146,13 @@
}
@Override
- public String getExportNamespace() {
- return exportNamespace == null ? enclosingType.getQualifiedExportName() : exportNamespace;
+ public String getJsNamespace() {
+ return jsNamespace == null ? enclosingType.getQualifiedJsName() : jsNamespace;
}
@Override
- public String getQualifiedExportName() {
- String namespace = getExportNamespace();
+ public String getQualifiedJsName() {
+ String namespace = getJsNamespace();
return namespace.isEmpty() ? jsName : namespace + "." + jsName;
}
diff --git a/dev/core/src/com/google/gwt/dev/jjs/ast/JMethod.java b/dev/core/src/com/google/gwt/dev/jjs/ast/JMethod.java
index d345b66..331388c 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/ast/JMethod.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/ast/JMethod.java
@@ -59,7 +59,7 @@
private String jsName;
private boolean exported;
- private String exportNamespace;
+ private String jsNamespace;
private JsPropertyAccessorType jsPropertyType;
private Specialization specialization;
private InliningMode inliningMode = InliningMode.NORMAL;
@@ -70,7 +70,7 @@
@Override
public void setJsMemberInfo(String namespace, String name, boolean exported) {
this.jsName = name;
- this.exportNamespace = namespace;
+ this.jsNamespace = namespace;
this.exported = exported;
}
@@ -103,22 +103,24 @@
}
@Override
- public String getExportNamespace() {
- if (exportNamespace == null) {
- exportNamespace = enclosingType.getQualifiedExportName();
+ public String getJsNamespace() {
+ if (jsNamespace == null) {
+ jsNamespace = enclosingType.getQualifiedJsName();
}
- return exportNamespace;
+ return jsNamespace;
}
@Override
- public String getQualifiedExportName() {
- String namespace = getExportNamespace();
+ public String getQualifiedJsName() {
+ String namespace = getJsNamespace();
if (jsName.isEmpty()) {
+ assert !needsVtable();
return namespace;
} else if (namespace.isEmpty()) {
+ assert !needsVtable();
return jsName;
} else {
- return namespace + "." + jsName;
+ return namespace + (isStatic() ? "." : ".prototype.") + jsName;
}
}
diff --git a/dev/core/src/com/google/gwt/dev/jjs/ast/JTypeOracle.java b/dev/core/src/com/google/gwt/dev/jjs/ast/JTypeOracle.java
index 0156519..20df880 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/ast/JTypeOracle.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/ast/JTypeOracle.java
@@ -416,23 +416,11 @@
* True if the type is a JSO or interface implemented by JSO or a JsType without prototype.
*/
public boolean canCrossCastLikeJso(JType type) {
- return canBeJavaScriptObject(type) || isJsTypeInterfaceWithoutPrototype(type);
+ return canBeJavaScriptObject(type) || isNonNativeJsTypeInterface(type);
}
- public boolean isJsTypeInterfaceWithoutPrototype(JType type) {
- return isJsTypeInterface(type, false);
- }
-
- public boolean isJsTypeInterfaceWithPrototype(JType type) {
- return isJsTypeInterface(type, true);
- }
-
- private boolean isJsTypeInterface(JType type, boolean hasPrototype) {
- if (!type.isJsType() || !(type instanceof JInterfaceType)) {
- return false;
- }
- String prototype = ((JInterfaceType) type).getJsPrototype();
- return hasPrototype ? prototype != null : prototype == null;
+ public boolean isNonNativeJsTypeInterface(JType type) {
+ return type.isJsType() && type instanceof JInterfaceType && !type.isJsNative();
}
public boolean castFailsTrivially(JReferenceType fromType, JReferenceType toType) {
diff --git a/dev/core/src/com/google/gwt/dev/jjs/impl/ClosureJsInteropExportsGenerator.java b/dev/core/src/com/google/gwt/dev/jjs/impl/ClosureJsInteropExportsGenerator.java
index f955fa1..a88df95 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/impl/ClosureJsInteropExportsGenerator.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/impl/ClosureJsInteropExportsGenerator.java
@@ -69,7 +69,7 @@
@Override
public void exportType(JDeclaredType x) {
// Note that synthesized constructors use the name of the declared types.
- generateExport(x.getQualifiedExportName(), x.getQualifiedExportName(),
+ generateExport(x.getQualifiedJsName(), x.getQualifiedJsName(),
names.get(x).makeRef(x.getSourceInfo()), x.getSourceInfo());
}
@@ -83,7 +83,7 @@
*/
@Override
public void exportMember(JMember member, JsExpression bridgeMethodOrAlias) {
- generateExport(member.getExportNamespace(), member.getQualifiedExportName(),
+ generateExport(member.getJsNamespace(), member.getQualifiedJsName(),
bridgeMethodOrAlias, member.getSourceInfo());
}
diff --git a/dev/core/src/com/google/gwt/dev/jjs/impl/DefaultJsInteropExportsGenerator.java b/dev/core/src/com/google/gwt/dev/jjs/impl/DefaultJsInteropExportsGenerator.java
index 346ae1a..a131f2b 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/impl/DefaultJsInteropExportsGenerator.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/impl/DefaultJsInteropExportsGenerator.java
@@ -86,7 +86,7 @@
}
private void ensureProvideNamespace(JMember member, JsExpression ctor) {
- String namespace = member.getExportNamespace();
+ String namespace = member.getJsNamespace();
if (namespace.equals(lastExportedNamespace)) {
return;
}
diff --git a/dev/core/src/com/google/gwt/dev/jjs/impl/GenerateJavaScriptAST.java b/dev/core/src/com/google/gwt/dev/jjs/impl/GenerateJavaScriptAST.java
index d6b8e70..923aa99 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/impl/GenerateJavaScriptAST.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/impl/GenerateJavaScriptAST.java
@@ -1427,13 +1427,8 @@
// the method target should be on a class that ends with $Prototype and implements a JsType
// TODO: if should be an assert instead
if (!(method instanceof JConstructor) && method.isOrOverridesJsMethod()) {
- JsNameRef protoRef = prototype.makeRef(x.getSourceInfo());
- JsNameRef methodName = new JsNameRef(x.getSourceInfo(), method.getName());
// add qualifier so we have jsPrototype.prototype.methodName.call(this, args)
- String jsPrototype = method.getEnclosingType().getJsPrototype();
- protoRef.setQualifier(createJsQualifier(jsPrototype, x.getSourceInfo()));
- methodName.setQualifier(protoRef);
- qualifier.setQualifier(methodName);
+ qualifier.setQualifier(createJsQualifier(method.getQualifiedJsName(), x.getSourceInfo()));
return jsInvocation;
}
@@ -1479,7 +1474,7 @@
popList(newOp.getArguments(), x.getArgs().size()); // args
JsExpression newExpr = newOp;
if (ctor.isJsNative()) {
- String nativeName = ctor.getEnclosingType().getJsPrototype();
+ String nativeName = ctor.getQualifiedJsName();
newExpr = new JsNew(sourceInfo, createJsQualifier(nativeName, sourceInfo));
} else if (x.getClassType().isJsFunctionImplementation()) {
// Foo.prototype.samMethod
@@ -2487,7 +2482,7 @@
}
JClassType superClass = x.getSuperClass();
if (superClass != null && superClass.isJsNative()) {
- return superClass.getJsPrototype();
+ return superClass.getQualifiedJsName();
}
return null;
}
@@ -2732,12 +2727,12 @@
private void collectExports(JDeclaredType x) {
if (x.isJsType() && !x.getClassDisposition().isLocalType()) {
// only types with explicit source names in Java may have an exported prototype
- exportedMembersByExportName.put(x.getQualifiedExportName(), x);
+ exportedMembersByExportName.put(x.getQualifiedJsName(), x);
}
for (JMethod m : x.getMethods()) {
if (m.isJsInteropEntryPoint()) {
- exportedMembersByExportName.put(m.getQualifiedExportName(), m);
+ exportedMembersByExportName.put(m.getQualifiedJsName(), m);
}
}
@@ -2748,7 +2743,7 @@
+ f.getQualifiedName() + ". Due to the way exporting works, the value of the"
+ " exported field will not be reflected across Java/JavaScript border.");
}
- exportedMembersByExportName.put(f.getQualifiedExportName(), f);
+ exportedMembersByExportName.put(f.getQualifiedJsName(), f);
}
}
}
diff --git a/dev/core/src/com/google/gwt/dev/jjs/impl/ImplementCastsAndTypeChecks.java b/dev/core/src/com/google/gwt/dev/jjs/impl/ImplementCastsAndTypeChecks.java
index 553a1a4..866b49d 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/impl/ImplementCastsAndTypeChecks.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/impl/ImplementCastsAndTypeChecks.java
@@ -263,7 +263,7 @@
assert targetTypeCategory == TypeCategory.TYPE_JS_PROTOTYPE;
call.addArg(program.getStringLiteral(sourceInfo,
- ((JDeclaredType) targetType).getJsPrototype()));
+ ((JDeclaredType) targetType).getQualifiedJsName()));
}
return call;
}
diff --git a/dev/core/src/com/google/gwt/dev/jjs/impl/JsInteropRestrictionChecker.java b/dev/core/src/com/google/gwt/dev/jjs/impl/JsInteropRestrictionChecker.java
index c110927..2c8ed05 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/impl/JsInteropRestrictionChecker.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/impl/JsInteropRestrictionChecker.java
@@ -210,11 +210,11 @@
}
private void checkExportName(JMember x) {
- boolean success = minimalRebuildCache.addExportedGlobalName(x.getQualifiedExportName(),
+ boolean success = minimalRebuildCache.addExportedGlobalName(x.getQualifiedJsName(),
currentType.getName());
if (!success) {
logError("Member '%s' can't be exported because the global name '%s' is already taken.",
- x.getQualifiedName(), x.getQualifiedExportName());
+ x.getQualifiedName(), x.getQualifiedJsName());
}
}
diff --git a/dev/core/src/com/google/gwt/dev/jjs/impl/TypeCategory.java b/dev/core/src/com/google/gwt/dev/jjs/impl/TypeCategory.java
index e81da83..570d21b 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/impl/TypeCategory.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/impl/TypeCategory.java
@@ -65,7 +65,7 @@
} else if (program.typeOracle.isEffectivelyJavaScriptObject(type)) {
return TypeCategory.TYPE_JSO;
} else if (program.typeOracle.isDualJsoInterface(type)
- || program.typeOracle.isJsTypeInterfaceWithoutPrototype(type)) {
+ || program.typeOracle.isNonNativeJsTypeInterface(type)) {
return TypeCategory.TYPE_JAVA_OBJECT_OR_JSO;
} else if (type.isJsNative()) {
return TypeCategory.TYPE_JS_PROTOTYPE;
diff --git a/user/test/com/google/gwt/core/client/interop/JsTypeTest.java b/user/test/com/google/gwt/core/client/interop/JsTypeTest.java
index 836c428..7af64fb 100644
--- a/user/test/com/google/gwt/core/client/interop/JsTypeTest.java
+++ b/user/test/com/google/gwt/core/client/interop/JsTypeTest.java
@@ -227,7 +227,7 @@
assertTrue(object instanceof ElementLikeJsInterface);
assertFalse(object instanceof ElementLikeJsInterfaceImpl);
assertTrue(object instanceof MyJsInterfaceWithOnlyInstanceofReference);
- assertFalse(object instanceof MyJsInterfaceWithPrototypeAndOnlyInstanceofReference);
+ assertTrue(object instanceof MyJsInterfaceWithPrototypeAndOnlyInstanceofReference);
assertFalse(object instanceof MyJsClassWithPrototypeAndOnlyInstanceofReference);
assertFalse(object instanceof ConcreteJsType);
}
@@ -263,7 +263,7 @@
assertTrue(object instanceof ElementLikeJsInterface);
assertFalse(object instanceof ElementLikeJsInterfaceImpl);
assertTrue(object instanceof MyJsInterfaceWithOnlyInstanceofReference);
- assertTrue(object instanceof MyJsInterfaceWithPrototypeAndOnlyInstanceofReference);
+ assertFalse(object instanceof MyJsInterfaceWithPrototypeAndOnlyInstanceofReference);
assertTrue(object instanceof MyJsClassWithPrototypeAndOnlyInstanceofReference);
assertFalse(object instanceof ConcreteJsType);
}
@@ -339,7 +339,7 @@
assertFalse(object instanceof ElementLikeJsInterface);
assertFalse(object instanceof ElementLikeJsInterfaceImpl);
assertFalse(object instanceof MyJsInterfaceWithOnlyInstanceofReference);
- assertTrue(object instanceof MyJsInterfaceWithPrototypeAndOnlyInstanceofReference);
+ assertFalse(object instanceof MyJsInterfaceWithPrototypeAndOnlyInstanceofReference);
assertTrue(object instanceof MyJsClassWithPrototypeAndOnlyInstanceofReference);
assertFalse(object instanceof ConcreteJsType);
}
diff --git a/user/test/com/google/gwt/core/client/interop/MyJsInterfaceWithPrototypeAndOnlyInstanceofReference.java b/user/test/com/google/gwt/core/client/interop/MyJsInterfaceWithPrototypeAndOnlyInstanceofReference.java
index d8e7b69..a5a7d7e 100644
--- a/user/test/com/google/gwt/core/client/interop/MyJsInterfaceWithPrototypeAndOnlyInstanceofReference.java
+++ b/user/test/com/google/gwt/core/client/interop/MyJsInterfaceWithPrototypeAndOnlyInstanceofReference.java
@@ -20,6 +20,6 @@
/**
* A test class marked with JsType but isn't referenced from any Java code except instanceof.
*/
-@JsType(prototype = "HTMLButtonElement")
+@JsType(prototype = "MyJsInterface")
public interface MyJsInterfaceWithPrototypeAndOnlyInstanceofReference {
}