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