Remove unused methods from FieldAccessInfo

Change-Id: Ia6489a54552540edb1369d62c045f4d7da545e06
diff --git a/src/main/java/com/android/tools/r8/graph/AbstractAccessContexts.java b/src/main/java/com/android/tools/r8/graph/AbstractAccessContexts.java
index 0c52979..c3a7531 100644
--- a/src/main/java/com/android/tools/r8/graph/AbstractAccessContexts.java
+++ b/src/main/java/com/android/tools/r8/graph/AbstractAccessContexts.java
@@ -218,25 +218,14 @@
           "Should only be querying the number of access contexts after flattening");
     }
 
-    ProgramMethod getUniqueAccessContext() {
-      if (accessesWithContexts != null && accessesWithContexts.size() == 1) {
-        ProgramMethodSet contexts = accessesWithContexts.values().iterator().next();
-        if (contexts.size() == 1) {
-          return contexts.iterator().next();
-        }
-      }
-      return null;
-    }
-
     @Override
-    @SuppressWarnings("ReferenceEquality")
     void flattenAccessContexts(DexField field) {
       if (accessesWithContexts != null) {
         ProgramMethodSet flattenedAccessContexts =
             accessesWithContexts.computeIfAbsent(field, ignore -> ProgramMethodSet.create());
         accessesWithContexts.forEach(
             (access, contexts) -> {
-              if (access != field) {
+              if (access.isNotIdenticalTo(field)) {
                 flattenedAccessContexts.addAll(contexts);
               }
             });
@@ -244,7 +233,6 @@
         if (!flattenedAccessContexts.isEmpty()) {
           accessesWithContexts.put(field, flattenedAccessContexts);
         }
-        assert accessesWithContexts.size() <= 1;
       }
     }
 
@@ -283,7 +271,6 @@
      * Returns true if this field is written by a method in the program other than {@param method}.
      */
     @Override
-    @SuppressWarnings("ReferenceEquality")
     public boolean isAccessedOutside(DexEncodedMethod method) {
       for (ProgramMethodSet encodedWriteContexts : accessesWithContexts.values()) {
         for (ProgramMethod encodedWriteContext : encodedWriteContexts) {
@@ -317,7 +304,6 @@
     }
 
     @Override
-    @SuppressWarnings("ReferenceEquality")
     ConcreteAccessContexts rewrittenWithLens(DexDefinitionSupplier definitions, GraphLens lens) {
       Map<DexField, ProgramMethodSet> rewrittenAccessesWithContexts = null;
       for (Entry<DexField, ProgramMethodSet> entry : accessesWithContexts.entrySet()) {
@@ -327,7 +313,7 @@
         ProgramMethodSet contexts = entry.getValue();
         ProgramMethodSet rewrittenContexts = contexts.rewrittenWithLens(definitions, lens);
 
-        if (rewrittenField == field && rewrittenContexts == contexts) {
+        if (rewrittenField.isIdenticalTo(field) && rewrittenContexts == contexts) {
           if (rewrittenAccessesWithContexts == null) {
             continue;
           }
diff --git a/src/main/java/com/android/tools/r8/graph/FieldAccessInfo.java b/src/main/java/com/android/tools/r8/graph/FieldAccessInfo.java
index 34b3f2b..126a0d0 100644
--- a/src/main/java/com/android/tools/r8/graph/FieldAccessInfo.java
+++ b/src/main/java/com/android/tools/r8/graph/FieldAccessInfo.java
@@ -4,8 +4,6 @@
 
 package com.android.tools.r8.graph;
 
-import com.android.tools.r8.utils.collections.ProgramMethodSet;
-import java.util.function.BiConsumer;
 import java.util.function.Consumer;
 import java.util.function.Predicate;
 
@@ -16,28 +14,20 @@
 
   DexField getField();
 
-  int getNumberOfReadContexts();
-
   int getNumberOfWriteContexts();
 
   AbstractAccessContexts getReadsWithContexts();
 
   AbstractAccessContexts getWritesWithContexts();
 
-  ProgramMethod getUniqueReadContext();
-
   boolean hasKnownReadContexts();
 
   boolean hasKnownWriteContexts();
 
   void forEachIndirectAccess(Consumer<DexField> consumer);
 
-  void forEachIndirectAccessWithContexts(BiConsumer<DexField, ProgramMethodSet> consumer);
-
   void forEachAccessContext(Consumer<ProgramMethod> consumer);
 
-  void forEachReadContext(Consumer<ProgramMethod> consumer);
-
   void forEachWriteContext(Consumer<ProgramMethod> consumer);
 
   boolean hasReflectiveAccess();
diff --git a/src/main/java/com/android/tools/r8/graph/FieldAccessInfoImpl.java b/src/main/java/com/android/tools/r8/graph/FieldAccessInfoImpl.java
index 7bbc78d..a09751b 100644
--- a/src/main/java/com/android/tools/r8/graph/FieldAccessInfoImpl.java
+++ b/src/main/java/com/android/tools/r8/graph/FieldAccessInfoImpl.java
@@ -8,13 +8,9 @@
 import com.android.tools.r8.graph.AbstractAccessContexts.ConcreteAccessContexts;
 import com.android.tools.r8.graph.lens.GraphLens;
 import com.android.tools.r8.shaking.Enqueuer.FieldAccessKind;
-import com.android.tools.r8.utils.collections.ProgramMethodSet;
 import com.android.tools.r8.utils.timing.Timing;
 import com.google.common.collect.Sets;
-import java.util.IdentityHashMap;
-import java.util.Map;
 import java.util.Set;
-import java.util.function.BiConsumer;
 import java.util.function.Consumer;
 import java.util.function.Predicate;
 
@@ -35,7 +31,7 @@
   public static final int FLAG_IS_READ_FROM_RECORD_INVOKE_DYNAMIC = 1 << 5;
 
   // A direct reference to the definition of the field.
-  private DexField field;
+  private final DexField field;
 
   // If this field is accessed from a method handle or has a reflective access.
   private int flags;
@@ -106,23 +102,11 @@
   }
 
   @Override
-  public int getNumberOfReadContexts() {
-    return readsWithContexts.getNumberOfAccessContexts();
-  }
-
-  @Override
   public int getNumberOfWriteContexts() {
     return writesWithContexts.getNumberOfAccessContexts();
   }
 
   @Override
-  public ProgramMethod getUniqueReadContext() {
-    return readsWithContexts.isConcrete()
-        ? readsWithContexts.asConcrete().getUniqueAccessContext()
-        : null;
-  }
-
-  @Override
   public boolean hasKnownReadContexts() {
     return !readsWithContexts.isTop();
   }
@@ -159,51 +143,12 @@
   }
 
   @Override
-  @SuppressWarnings("ReferenceEquality")
-  public void forEachIndirectAccessWithContexts(BiConsumer<DexField, ProgramMethodSet> consumer) {
-    Map<DexField, ProgramMethodSet> indirectAccessesWithContexts = new IdentityHashMap<>();
-    addAccessesWithContextsToMap(
-        readsWithContexts, access -> access != field, indirectAccessesWithContexts);
-    addAccessesWithContextsToMap(
-        writesWithContexts, access -> access != field, indirectAccessesWithContexts);
-    indirectAccessesWithContexts.forEach(consumer);
-  }
-
-  private static void addAccessesWithContextsToMap(
-      AbstractAccessContexts accessesWithContexts,
-      Predicate<DexField> predicate,
-      Map<DexField, ProgramMethodSet> out) {
-    if (accessesWithContexts.isBottom()) {
-      return;
-    }
-    if (accessesWithContexts.isConcrete()) {
-      extendAccessesWithContexts(
-          accessesWithContexts.asConcrete().getAccessesWithContexts(), predicate, out);
-      return;
-    }
-    throw new Unreachable("Should never be iterating the indirect accesses when they are unknown");
-  }
-
-  private static void extendAccessesWithContexts(
-      Map<DexField, ProgramMethodSet> accessesWithContexts,
-      Predicate<DexField> predicate,
-      Map<DexField, ProgramMethodSet> out) {
-    accessesWithContexts.forEach(
-        (access, contexts) -> {
-          if (predicate.test(access)) {
-            out.computeIfAbsent(access, ignore -> ProgramMethodSet.create()).addAll(contexts);
-          }
-        });
-  }
-
-  @Override
   public void forEachAccessContext(Consumer<ProgramMethod> consumer) {
     forEachReadContext(consumer);
     forEachWriteContext(consumer);
   }
 
-  @Override
-  public void forEachReadContext(Consumer<ProgramMethod> consumer) {
+  private void forEachReadContext(Consumer<ProgramMethod> consumer) {
     readsWithContexts.forEachAccessContext(consumer);
   }