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