Ban switching of JsProperty/JsMethod on overrides

Change-Id: I8a32ab3f901d6dab047b329fc60455b9a27a0e24
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 f6bd3fd..8f8f4f3 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
@@ -745,7 +745,7 @@
         }
         return new JsMember(member, member, jsMember == null ? null : jsMember.getter);
       default:
-        if (jsMember != null) {
+        if (jsMember != null && !jsMember.isPropertyAccessor()) {
           if (overrides(member, jsMember.member)) {
             jsMember.member = member;
             return jsMember;
diff --git a/dev/core/test/com/google/gwt/dev/jjs/impl/JsInteropRestrictionCheckerTest.java b/dev/core/test/com/google/gwt/dev/jjs/impl/JsInteropRestrictionCheckerTest.java
index 8c42740..719d98a 100644
--- a/dev/core/test/com/google/gwt/dev/jjs/impl/JsInteropRestrictionCheckerTest.java
+++ b/dev/core/test/com/google/gwt/dev/jjs/impl/JsInteropRestrictionCheckerTest.java
@@ -240,12 +240,12 @@
             + "cannot both use the same JavaScript name 'x'.");
   }
 
-  public void testCollidingJsTypeAndJsPropertyGetterFails() throws Exception {
-    addSnippetImport("jsinterop.annotations.JsType");
+  public void testCollidingJsMethodAndJsPropertyGetterFails() throws Exception {
+    addSnippetImport("jsinterop.annotations.JsMethod");
     addSnippetImport("jsinterop.annotations.JsProperty");
     addSnippetClassDecl(
-        "@JsType",
         "public static interface IBuggy {",
+        "  @JsMethod",
         "  boolean x(boolean foo);",
         "  @JsProperty",
         "  int getX();",
@@ -262,12 +262,12 @@
             + "cannot both use the same JavaScript name 'x'.");
   }
 
-  public void testCollidingJsTypeAndJsPropertySetterFails() throws Exception {
-    addSnippetImport("jsinterop.annotations.JsType");
+  public void testCollidingJsMethodAndJsPropertySetterFails() throws Exception {
+    addSnippetImport("jsinterop.annotations.JsMethod");
     addSnippetImport("jsinterop.annotations.JsProperty");
     addSnippetClassDecl(
-        "@JsType",
         "public static interface IBuggy {",
+        "  @JsMethod",
         "  boolean x(boolean foo);",
         "  @JsProperty",
         "  void setX(int a);",
@@ -859,6 +859,28 @@
     assertBuggySucceeds();
   }
 
+  public void testMixingJsMethodJsPropertyFails()
+      throws Exception {
+    addSnippetImport("jsinterop.annotations.JsMethod");
+    addSnippetImport("jsinterop.annotations.JsProperty");
+    addSnippetClassDecl(
+        "public static class Super {",
+        "  @JsMethod public int getY() { return 5; }",
+        "  @JsProperty public void setZ(int z) {}",
+        "}",
+
+        "public static class Buggy extends Super {",
+        "  @JsProperty(name = \"getY\") public int getY() { return 6; }",
+        "  @JsMethod(name = \"z\") public void setZ(int z) {}",
+        "}");
+
+    assertBuggyFails(
+        "Line 10: 'int EntryPoint.Buggy.getY()' and 'int EntryPoint.Super.getY()' cannot "
+            + "both use the same JavaScript name 'getY'.",
+        "Line 11: 'void EntryPoint.Buggy.setZ(int)' and 'void EntryPoint.Super.setZ(int)' cannot "
+           + "both use the same JavaScript name 'z'.");
+  }
+
   public void testMultiplePrivateConstructorsExportSucceeds() throws Exception {
     addSnippetImport("jsinterop.annotations.JsType");
     addSnippetClassDecl(