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