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(