Fixes handling of non-public JsMethods. Change-Id: Ieb58280af7e076820e23ccae0774109562a351e0
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 bf2d791..fc83adf 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
@@ -360,17 +360,10 @@ String name = x.getName(); if (x.needsDynamicDispatch()) { if (polymorphicNames.get(x) == null) { - JsName polyName; - if (x.isPrivate()) { - polyName = interfaceScope.declareName(mangleNameForPrivatePoly(x), name); - } else if (x.isPackagePrivate()) { - polyName = interfaceScope.declareName(mangleNameForPackagePrivatePoly(x), name); - } else { - polyName = - x.getJsMemberType() != JsMemberType.NONE - ? interfaceScope.declareUnobfuscatableName(x.getJsName()) - : interfaceScope.declareName(mangleNameForPoly(x), name); - } + JsName polyName = + x.getJsMemberType() != JsMemberType.NONE + ? interfaceScope.declareUnobfuscatableName(x.getJsName()) + : interfaceScope.declareName(mangleNameForPoly(x), name); polymorphicNames.put(x, polyName); } } @@ -2950,8 +2943,16 @@ } private String mangleNameForPoly(JMethod method) { - assert !method.isPrivate() && !method.isStatic(); + if (method.isPrivate()) { + return mangleNameForPrivatePoly(method); + } else if (method.isPackagePrivate()) { + return mangleNameForPackagePrivatePoly(method); + } else { + return mangleNameForPublicPoly(method); + } + } + private String mangleNameForPublicPoly(JMethod method) { return StringInterner.get().intern( JjsUtils.constructManglingSignature(method, JjsUtils.mangledNameString(method))); }
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 8f8f4f3..d54b64c 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
@@ -770,8 +770,16 @@ // Methods that only differ in return types are Java overrides and need to be considered so // for local name collision checking. JMethod potentiallyOverriddenMethod = (JMethod) potentiallyOverriddenMember; - return method.getJsniSignature(false, false) - .equals(potentiallyOverriddenMethod.getJsniSignature(false, false)); + + // TODO(goktug): make this more precise to handle package visibilities. + boolean visibilitiesMatchesForOverride = + !method.isPackagePrivate() && !method.isPrivate() + && !potentiallyOverriddenMethod.isPackagePrivate() + && !potentiallyOverriddenMethod.isPrivate(); + + return visibilitiesMatchesForOverride + && method.getJsniSignature(false, false) + .equals(potentiallyOverriddenMethod.getJsniSignature(false, false)); } private static String getDescription(HasSourceInfo hasSourceInfo) {
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 719d98a..63b6205 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
@@ -645,6 +645,21 @@ + "both use the same JavaScript name 'foo'."); } + public void testShadowedSuperclassJsMethodFails() { + addSnippetImport("jsinterop.annotations.JsMethod"); + addSnippetClassDecl( + "public static class ParentBuggy {", + " @JsMethod private void foo() {}", + "}", + "public static class Buggy extends ParentBuggy {", + " @JsMethod private void foo() {}", + "}"); + + assertBuggyFails( + "Line 8: 'void EntryPoint.Buggy.foo()' and 'void EntryPoint.ParentBuggy.foo()' cannot " + + "both use the same JavaScript name 'foo'."); + } + public void testRenamedSuperclassJsMethodFails() { addSnippetImport("jsinterop.annotations.JsType"); addSnippetImport("jsinterop.annotations.JsMethod");
diff --git a/user/test/com/google/gwt/core/client/interop/JsTypeTest.java b/user/test/com/google/gwt/core/client/interop/JsTypeTest.java index 242c9a3..9628a1c 100644 --- a/user/test/com/google/gwt/core/client/interop/JsTypeTest.java +++ b/user/test/com/google/gwt/core/client/interop/JsTypeTest.java
@@ -25,6 +25,7 @@ import javaemul.internal.annotations.DoNotInline; import jsinterop.annotations.JsFunction; +import jsinterop.annotations.JsMethod; import jsinterop.annotations.JsOverlay; import jsinterop.annotations.JsPackage; import jsinterop.annotations.JsProperty; @@ -539,4 +540,17 @@ SomeConcreteSubclass o = new SomeConcreteSubclass(); assertEquals(o, o.m()); } + + static class NonPublicJsMethodClass { + @JsMethod private String foo() { return "foo"; } + @JsMethod String bar() { return "bar"; } + } + + public void testJsMethodWithDifferentVisiblities() { + NonPublicJsMethodClass instance = new NonPublicJsMethodClass(); + assertEquals("foo", instance.foo()); + assertEquals("bar", instance.bar()); + assertEquals("foo", callFunction(instance, "foo", null)); + assertEquals("bar", callFunction(instance, "bar", null)); + } }