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()); + } }