Properly preserve names in overrides of native methods.
Change-Id: I17f95a8c147c72055b6f9b1f294f6c403d370d7d
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 c9d561c..cecef6a 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
@@ -83,7 +83,7 @@
return false;
}
for (JMethod method : getOverriddenMethodsIncludingSelf()) {
- if (method.exported || method.isJsFunctionMethod()) {
+ if (method.exported || method.isJsFunctionMethod() || method.isJsNative()) {
return true;
}
}
@@ -199,13 +199,13 @@
* an existing non-JsMember inside a class.
*/
public boolean exposesNonJsMember() {
- if (isInterfaceMethod() || enclosingType.isJsNative() || !JjsUtils.exposesJsName(this)) {
+ if (isInterfaceMethod() || enclosingType.isJsNative() || !JjsUtils.requiresJsName(this)) {
return false;
}
boolean hasNonJsMemberParent = false;
for (JMethod overriddenMethod : overriddenMethods) {
- if (!JjsUtils.exposesJsName(overriddenMethod)) {
+ if (!JjsUtils.requiresJsName(overriddenMethod)) {
hasNonJsMemberParent = true;
}
if (overriddenMethod.exposesNonJsMember()) {
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 f96c3d8..c9cf9a4 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
@@ -247,7 +247,7 @@
if (x.isStatic()) {
jsName = topScope.declareName(mangleName(x), x.getName());
} else {
- jsName = JjsUtils.exposesJsName(x)
+ jsName = JjsUtils.requiresJsName(x)
? scopeStack.peek().declareUnobfuscatableName(x.getJsName())
: scopeStack.peek().declareName(mangleName(x), x.getName());
}
@@ -371,7 +371,7 @@
String name = x.getName();
if (x.needsDynamicDispatch()) {
if (polymorphicNames.get(x) == null) {
- JsName polyName = JjsUtils.exposesJsName(x)
+ JsName polyName = JjsUtils.requiresJsName(x)
? interfaceScope.declareUnobfuscatableName(x.getJsName())
: interfaceScope.declareName(mangleNameForPoly(x), name);
polymorphicNames.put(x, polyName);
diff --git a/dev/core/src/com/google/gwt/dev/jjs/impl/JjsUtils.java b/dev/core/src/com/google/gwt/dev/jjs/impl/JjsUtils.java
index e0a878e..7b2f3f7 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/impl/JjsUtils.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/impl/JjsUtils.java
@@ -672,10 +672,10 @@
/**
* Whether or not to use the JsName when implementing this member.
*
- * <p>A member should only expose a JsName when a JsName has been assigned and the compilation
+ * <p>A member should only require a JsName when a JsName has been assigned and the compilation
* has been configured to honor those names.
* */
- public static boolean exposesJsName(JMember member) {
+ public static boolean requiresJsName(JMember member) {
// JsFunction interfaces and implementations do not have JsNames but canBeReferencedExternally
// or canBeImplementedExternally.
return member.getJsMemberType() != JsMemberType.NONE
diff --git a/user/test/com/google/gwt/dev/jjs/test/NoGenerateJsInteropExportsTest.java b/user/test/com/google/gwt/dev/jjs/test/NoGenerateJsInteropExportsTest.java
index 073d63d..838ace2 100644
--- a/user/test/com/google/gwt/dev/jjs/test/NoGenerateJsInteropExportsTest.java
+++ b/user/test/com/google/gwt/dev/jjs/test/NoGenerateJsInteropExportsTest.java
@@ -37,13 +37,14 @@
@JsType
static class A {
@JsMethod(name = "method")
- public void m() {
+ public int m() {
+ return 1;
}
}
@JsType(isNative = true)
interface ObjectWithMethod {
- void method();
+ int method();
}
public void testJsMethodNameNotHonored() {
@@ -56,4 +57,14 @@
} catch (JavaScriptException expected) {
}
}
+
+ public void testHonorJsMethodNameInOverrides() {
+ assertEquals(3,
+ ((ObjectWithMethod) new ObjectWithMethod() {
+ @Override
+ public int method() {
+ return 3;
+ }
+ }).method());
+ }
}