Don't parse private members on library classes.

Change-Id: I8936e1009a8e875ce38006cdc6be5055404df2bd
diff --git a/src/main/java/com/android/tools/r8/graph/DexEncodedField.java b/src/main/java/com/android/tools/r8/graph/DexEncodedField.java
index 3a1dfc5..1f06ada 100644
--- a/src/main/java/com/android/tools/r8/graph/DexEncodedField.java
+++ b/src/main/java/com/android/tools/r8/graph/DexEncodedField.java
@@ -92,6 +92,10 @@
     return accessFlags.isStatic();
   }
 
+  public boolean isPrivate() {
+    return accessFlags.isPrivate();
+  }
+
   @Override
   public boolean isStaticMember() {
     return isStatic();
diff --git a/src/main/java/com/android/tools/r8/graph/DexLibraryClass.java b/src/main/java/com/android/tools/r8/graph/DexLibraryClass.java
index 2bd517e..759f411 100644
--- a/src/main/java/com/android/tools/r8/graph/DexLibraryClass.java
+++ b/src/main/java/com/android/tools/r8/graph/DexLibraryClass.java
@@ -47,7 +47,10 @@
         annotations,
         origin,
         skipNameValidationForTesting);
-    assert Arrays.stream(directMethods).noneMatch(DexEncodedMethod::isClassInitializer);
+    assert Arrays.stream(directMethods).allMatch(DexLibraryClass::verifyLibraryMethod);
+    assert Arrays.stream(virtualMethods).allMatch(DexLibraryClass::verifyLibraryMethod);
+    assert Arrays.stream(staticFields).allMatch(DexLibraryClass::verifyLibraryField);
+    assert Arrays.stream(instanceFields).allMatch(DexLibraryClass::verifyLibraryField);
     // Set all static field values to unknown. We don't want to use the value from the library
     // at compile time, as it can be different at runtime.
     for (DexEncodedField staticField : staticFields) {
@@ -56,6 +59,19 @@
     assert kind == Kind.CF : "Invalid kind " + kind + " for library-path class " + type;
   }
 
+  private static boolean verifyLibraryMethod(DexEncodedMethod method) {
+    assert !method.isClassInitializer();
+    assert !method.isPrivateMethod();
+    assert !method.hasCode();
+    return true;
+  }
+
+  private static boolean verifyLibraryField(DexEncodedField field) {
+    assert !field.isPrivate();
+    assert !field.isStatic() || !field.hasExplicitStaticValue();
+    return true;
+  }
+
   @Override
   public void collectIndexedItems(IndexedItemCollection indexedItems,
       DexMethod method, int instructionOffset) {
diff --git a/src/main/java/com/android/tools/r8/graph/JarClassFileReader.java b/src/main/java/com/android/tools/r8/graph/JarClassFileReader.java
index eb8d1ce..6a7c0d6 100644
--- a/src/main/java/com/android/tools/r8/graph/JarClassFileReader.java
+++ b/src/main/java/com/android/tools/r8/graph/JarClassFileReader.java
@@ -134,6 +134,10 @@
     return access & ~ACC_SYNTHETIC_ATTRIBUTE & ~ACC_DEPRECATED;
   }
 
+  public static FieldAccessFlags createFieldAccessFlags(int access) {
+    return FieldAccessFlags.fromCfAccessFlags(cleanAccessFlags(access));
+  }
+
   public static MethodAccessFlags createMethodAccessFlags(String name, int access) {
     boolean isConstructor =
         name.equals(Constants.INSTANCE_INITIALIZER_NAME)
@@ -290,7 +294,14 @@
     @Override
     public FieldVisitor visitField(
         int access, String name, String desc, String signature, Object value) {
-      return new CreateFieldVisitor(this, access, name, desc, signature, value);
+      if (classKind == ClassKind.LIBRARY) {
+        FieldAccessFlags flags = createFieldAccessFlags(access);
+        if (flags.isPrivate()) {
+          return null;
+        }
+      }
+      return new CreateFieldVisitor(
+          this, access, name, desc, signature, classKind == ClassKind.LIBRARY ? null : value);
     }
 
     @Override
@@ -298,7 +309,7 @@
         int access, String name, String desc, String signature, String[] exceptions) {
       if (classKind == ClassKind.LIBRARY) {
         MethodAccessFlags flags = createMethodAccessFlags(name, access);
-        if (flags.isStatic() && flags.isConstructor()) {
+        if ((flags.isStatic() && flags.isConstructor()) || flags.isPrivate()) {
           return null;
         }
       }
@@ -462,7 +473,7 @@
 
     @Override
     public void visitEnd() {
-      FieldAccessFlags flags = FieldAccessFlags.fromCfAccessFlags(cleanAccessFlags(access));
+      FieldAccessFlags flags = createFieldAccessFlags(access);
       DexField dexField = parent.application.getField(parent.type, name, desc);
       Wrapper<DexField> signature = FieldSignatureEquivalence.get().wrap(dexField);
       if (parent.fieldSignatures.add(signature)) {