Introduce a DexClassAndFieldSet

Change-Id: I9ec8e8dd2c56a50986738342008e52d977519611
diff --git a/src/main/java/com/android/tools/r8/utils/DexClassAndFieldEquivalence.java b/src/main/java/com/android/tools/r8/utils/DexClassAndFieldEquivalence.java
new file mode 100644
index 0000000..8b36c33
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/utils/DexClassAndFieldEquivalence.java
@@ -0,0 +1,29 @@
+// Copyright (c) 2020, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package com.android.tools.r8.utils;
+
+import com.android.tools.r8.graph.DexClassAndField;
+import com.google.common.base.Equivalence;
+
+public class DexClassAndFieldEquivalence extends Equivalence<DexClassAndField> {
+
+  private static final DexClassAndFieldEquivalence INSTANCE = new DexClassAndFieldEquivalence();
+
+  private DexClassAndFieldEquivalence() {}
+
+  public static DexClassAndFieldEquivalence get() {
+    return INSTANCE;
+  }
+
+  @Override
+  protected boolean doEquivalent(DexClassAndField field, DexClassAndField other) {
+    return field.getDefinition() == other.getDefinition();
+  }
+
+  @Override
+  protected int doHash(DexClassAndField field) {
+    return field.getReference().hashCode();
+  }
+}
diff --git a/src/main/java/com/android/tools/r8/utils/ProgramFieldEquivalence.java b/src/main/java/com/android/tools/r8/utils/ProgramFieldEquivalence.java
deleted file mode 100644
index 193df46..0000000
--- a/src/main/java/com/android/tools/r8/utils/ProgramFieldEquivalence.java
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright (c) 2020, the R8 project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-package com.android.tools.r8.utils;
-
-import com.android.tools.r8.graph.ProgramField;
-import com.google.common.base.Equivalence;
-
-public class ProgramFieldEquivalence extends Equivalence<ProgramField> {
-
-  private static final ProgramFieldEquivalence INSTANCE = new ProgramFieldEquivalence();
-
-  private ProgramFieldEquivalence() {}
-
-  public static ProgramFieldEquivalence get() {
-    return INSTANCE;
-  }
-
-  @Override
-  protected boolean doEquivalent(ProgramField field, ProgramField other) {
-    return field.getDefinition() == other.getDefinition();
-  }
-
-  @Override
-  protected int doHash(ProgramField field) {
-    return field.getReference().hashCode();
-  }
-}
diff --git a/src/main/java/com/android/tools/r8/utils/collections/DexClassAndFieldMap.java b/src/main/java/com/android/tools/r8/utils/collections/DexClassAndFieldMap.java
new file mode 100644
index 0000000..ab2a69a
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/utils/collections/DexClassAndFieldMap.java
@@ -0,0 +1,30 @@
+// Copyright (c) 2023, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package com.android.tools.r8.utils.collections;
+
+import com.android.tools.r8.graph.DexClassAndField;
+import com.google.common.base.Equivalence.Wrapper;
+import com.google.common.collect.ImmutableMap;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.function.Supplier;
+
+public class DexClassAndFieldMap<V> extends DexClassAndFieldMapBase<DexClassAndField, V> {
+
+  private static final DexClassAndFieldMap<?> EMPTY = new DexClassAndFieldMap<>(ImmutableMap::of);
+
+  private DexClassAndFieldMap(Supplier<Map<Wrapper<DexClassAndField>, V>> backingFactory) {
+    super(backingFactory);
+  }
+
+  public static <V> DexClassAndFieldMap<V> create() {
+    return new DexClassAndFieldMap<>(HashMap::new);
+  }
+
+  @SuppressWarnings("unchecked")
+  public static <V> DexClassAndFieldMap<V> empty() {
+    return (DexClassAndFieldMap<V>) EMPTY;
+  }
+}
diff --git a/src/main/java/com/android/tools/r8/utils/collections/DexClassAndFieldMapBase.java b/src/main/java/com/android/tools/r8/utils/collections/DexClassAndFieldMapBase.java
new file mode 100644
index 0000000..522ff17
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/utils/collections/DexClassAndFieldMapBase.java
@@ -0,0 +1,24 @@
+// Copyright (c) 2023, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package com.android.tools.r8.utils.collections;
+
+import com.android.tools.r8.graph.DexClassAndField;
+import com.android.tools.r8.utils.DexClassAndFieldEquivalence;
+import com.google.common.base.Equivalence.Wrapper;
+import java.util.Map;
+import java.util.function.Supplier;
+
+public abstract class DexClassAndFieldMapBase<K extends DexClassAndField, V>
+    extends DexClassAndMemberMap<K, V> {
+
+  DexClassAndFieldMapBase(Supplier<Map<Wrapper<K>, V>> backingFactory) {
+    super(backingFactory);
+  }
+
+  @Override
+  Wrapper<K> wrap(K field) {
+    return DexClassAndFieldEquivalence.get().wrap(field);
+  }
+}
diff --git a/src/main/java/com/android/tools/r8/utils/collections/ProgramMemberMap.java b/src/main/java/com/android/tools/r8/utils/collections/DexClassAndMemberMap.java
similarity index 88%
rename from src/main/java/com/android/tools/r8/utils/collections/ProgramMemberMap.java
rename to src/main/java/com/android/tools/r8/utils/collections/DexClassAndMemberMap.java
index ebba98d..2a044e5 100644
--- a/src/main/java/com/android/tools/r8/utils/collections/ProgramMemberMap.java
+++ b/src/main/java/com/android/tools/r8/utils/collections/DexClassAndMemberMap.java
@@ -4,7 +4,7 @@
 
 package com.android.tools.r8.utils.collections;
 
-import com.android.tools.r8.graph.ProgramMember;
+import com.android.tools.r8.graph.DexClassAndMember;
 import com.google.common.base.Equivalence.Wrapper;
 import java.util.Map;
 import java.util.function.BiConsumer;
@@ -13,15 +13,15 @@
 import java.util.function.Function;
 import java.util.function.Supplier;
 
-public abstract class ProgramMemberMap<K extends ProgramMember<?, ?>, V> {
+public abstract class DexClassAndMemberMap<K extends DexClassAndMember<?, ?>, V> {
 
   private final Map<Wrapper<K>, V> backing;
 
-  ProgramMemberMap(Supplier<Map<Wrapper<K>, V>> backingFactory) {
+  DexClassAndMemberMap(Supplier<Map<Wrapper<K>, V>> backingFactory) {
     this.backing = backingFactory.get();
   }
 
-  ProgramMemberMap(Map<Wrapper<K>, V> backing) {
+  DexClassAndMemberMap(Map<Wrapper<K>, V> backing) {
     this.backing = backing;
   }
 
diff --git a/src/main/java/com/android/tools/r8/utils/collections/ProgramFieldMap.java b/src/main/java/com/android/tools/r8/utils/collections/ProgramFieldMap.java
index dc6a4be..a8f41e2 100644
--- a/src/main/java/com/android/tools/r8/utils/collections/ProgramFieldMap.java
+++ b/src/main/java/com/android/tools/r8/utils/collections/ProgramFieldMap.java
@@ -5,14 +5,13 @@
 package com.android.tools.r8.utils.collections;
 
 import com.android.tools.r8.graph.ProgramField;
-import com.android.tools.r8.utils.ProgramFieldEquivalence;
 import com.google.common.base.Equivalence.Wrapper;
 import com.google.common.collect.ImmutableMap;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.function.Supplier;
 
-public class ProgramFieldMap<V> extends ProgramMemberMap<ProgramField, V> {
+public class ProgramFieldMap<V> extends DexClassAndFieldMapBase<ProgramField, V> {
 
   private static final ProgramFieldMap<?> EMPTY = new ProgramFieldMap<>(ImmutableMap::of);
 
@@ -28,9 +27,4 @@
   public static <V> ProgramFieldMap<V> empty() {
     return (ProgramFieldMap<V>) EMPTY;
   }
-
-  @Override
-  Wrapper<ProgramField> wrap(ProgramField method) {
-    return ProgramFieldEquivalence.get().wrap(method);
-  }
 }
diff --git a/src/main/java/com/android/tools/r8/utils/collections/ProgramMethodMap.java b/src/main/java/com/android/tools/r8/utils/collections/ProgramMethodMap.java
index d4dcca6..b5c3c26 100644
--- a/src/main/java/com/android/tools/r8/utils/collections/ProgramMethodMap.java
+++ b/src/main/java/com/android/tools/r8/utils/collections/ProgramMethodMap.java
@@ -13,7 +13,7 @@
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.function.Supplier;
 
-public class ProgramMethodMap<V> extends ProgramMemberMap<ProgramMethod, V> {
+public class ProgramMethodMap<V> extends DexClassAndMemberMap<ProgramMethod, V> {
 
   private static final ProgramMethodMap<?> EMPTY = new ProgramMethodMap<>(ImmutableMap::of);