When looking up JSNI references, ignore private fields and methods in superclasses. Review at http://gwt-code-reviews.appspot.com/279802 Review by: scottb@google.com git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@7850 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/dev/core/src/com/google/gwt/dev/jjs/impl/JsniRefLookup.java b/dev/core/src/com/google/gwt/dev/jjs/impl/JsniRefLookup.java index a212d59..7225e63 100644 --- a/dev/core/src/com/google/gwt/dev/jjs/impl/JsniRefLookup.java +++ b/dev/core/src/com/google/gwt/dev/jjs/impl/JsniRefLookup.java
@@ -183,7 +183,8 @@ */ private static void findMostDerivedMembers( LinkedHashMap<String, LinkedHashMap<String, HasEnclosingType>> matchesBySig, - JDeclaredType targetType, String memberName, boolean addConstructors) { + JDeclaredType targetType, String memberName, + boolean addConstructorsAndPrivates) { /* * Analyze superclasses and interfaces first. More derived members will thus * be seen later. @@ -202,10 +203,16 @@ // Get the methods on this class/interface. for (JMethod method : targetType.getMethods()) { if (method.getName().equals(memberName)) { - if (addConstructors || !method.getName().equals(JsniRef.NEW)) { - addMember(matchesBySig, method, getJsniSignature(method, false)); - addMember(matchesBySig, method, getJsniSignature(method, true)); + if (!addConstructorsAndPrivates) { + if (method.getName().equals(JsniRef.NEW)) { + continue; + } + if (method.isPrivate()) { + continue; + } } + addMember(matchesBySig, method, getJsniSignature(method, false)); + addMember(matchesBySig, method, getJsniSignature(method, true)); } }
diff --git a/dev/core/test/com/google/gwt/dev/jjs/impl/JsniRefLookupTest.java b/dev/core/test/com/google/gwt/dev/jjs/impl/JsniRefLookupTest.java index ad63932..e394d54 100644 --- a/dev/core/test/com/google/gwt/dev/jjs/impl/JsniRefLookupTest.java +++ b/dev/core/test/com/google/gwt/dev/jjs/impl/JsniRefLookupTest.java
@@ -124,10 +124,39 @@ } }); + sourceOracle.addOrReplace(new MockJavaResource("test.PrivateSup") { + @Override + protected CharSequence getContent() { + StringBuffer code = new StringBuffer(); + code.append("package test;\n"); + code.append("public class PrivateSup {\n"); + code.append(" private static int field;\n"); + code.append(" private static int method() { return 0; }\n"); + code.append(" private static int fieldSup;\n"); + code.append(" private static int methodSuP() { return 0; }\n"); + code.append("}\n"); + return code; + } + }); + + sourceOracle.addOrReplace(new MockJavaResource("test.PrivateSub") { + @Override + protected CharSequence getContent() { + StringBuffer code = new StringBuffer(); + code.append("package test;\n"); + code.append("public class PrivateSub extends PrivateSup {\n"); + code.append(" private static float field;\n"); + code.append(" private static float method() { return 0; }\n"); + code.append(" private static float methodSub() { return 0; }\n"); + code.append("}\n"); + return code; + } + }); + try { // The snippet must reference the classes so they will be compiled in program = compileSnippet("void", - "new test.Foo(); new test.Bar(); new ClassWithBridge();"); + "new test.Foo(); new test.Bar(); new ClassWithBridge(); new PrivateSub();"); } catch (UnableToCompleteException e) { throw new RuntimeException(e); } @@ -401,6 +430,36 @@ } } + public void testPrivate() { + // test private entries in the requested class + { + MockErrorReporter errors = new MockErrorReporter(); + JMethod res = (JMethod) lookup("test.PrivateSub::method()", errors); + errors.assertNoError(); + assertEquals("test.PrivateSub", res.getEnclosingType().getName()); + assertEquals("method", res.getName()); + } + { + MockErrorReporter errors = new MockErrorReporter(); + JField res = (JField) lookup("test.PrivateSub::field", errors); + errors.assertNoError(); + assertEquals("test.PrivateSub", res.getEnclosingType().getName()); + assertEquals("field", res.getName()); + } + + // test private entries in the superclass + { + MockErrorReporter errors = new MockErrorReporter(); + JMethod res = (JMethod) lookup("test.PrivateSub::methodSup()", errors); + errors.assertHasError(); + } + { + MockErrorReporter errors = new MockErrorReporter(); + JField res = (JField) lookup("test.PrivateSub::fieldSup", errors); + errors.assertHasError(); + } + } + public void testWildcardLookups() { { MockErrorReporter errors = new MockErrorReporter();