Add more collection type mapping type to TypeMapper

#java11 #desugar

PiperOrigin-RevId: 294734775
diff --git a/src/tools/android/java/com/google/devtools/build/android/desugar/langmodel/ClassAttributeRecord.java b/src/tools/android/java/com/google/devtools/build/android/desugar/langmodel/ClassAttributeRecord.java
index 30564d9..95b21e0 100644
--- a/src/tools/android/java/com/google/devtools/build/android/desugar/langmodel/ClassAttributeRecord.java
+++ b/src/tools/android/java/com/google/devtools/build/android/desugar/langmodel/ClassAttributeRecord.java
@@ -17,7 +17,6 @@
 package com.google.devtools.build.android.desugar.langmodel;
 
 import static com.google.common.base.Preconditions.checkNotNull;
-import static java.util.stream.Collectors.toMap;
 
 import com.google.common.collect.ImmutableSet;
 import java.util.HashMap;
@@ -71,14 +70,6 @@
 
   @Override
   public ClassAttributeRecord acceptTypeMapper(TypeMapper typeMapper) {
-    return new ClassAttributeRecord(
-        this.record.values().stream()
-            .map(attr -> attr.acceptTypeMapper(typeMapper))
-            .collect(
-                toMap(
-                    ClassAttributes::classBinaryName,
-                    attr -> attr,
-                    (prev, next) -> next,
-                    HashMap::new)));
+    return new ClassAttributeRecord(typeMapper.mapMutable(record));
   }
 }
diff --git a/src/tools/android/java/com/google/devtools/build/android/desugar/langmodel/ClassMemberRecord.java b/src/tools/android/java/com/google/devtools/build/android/desugar/langmodel/ClassMemberRecord.java
index 94dfd4b..28786ae 100644
--- a/src/tools/android/java/com/google/devtools/build/android/desugar/langmodel/ClassMemberRecord.java
+++ b/src/tools/android/java/com/google/devtools/build/android/desugar/langmodel/ClassMemberRecord.java
@@ -17,7 +17,6 @@
 package com.google.devtools.build.android.desugar.langmodel;
 
 import static com.google.common.collect.ImmutableList.toImmutableList;
-import static java.util.stream.Collectors.toMap;
 
 import com.google.common.collect.ImmutableList;
 import java.util.LinkedHashMap;
@@ -127,8 +126,6 @@
 
   @Override
   public ClassMemberRecord acceptTypeMapper(TypeMapper typeMapper) {
-    return new ClassMemberRecord(
-        reasons.keySet().stream()
-            .collect(toMap(key -> key.acceptTypeMapper(typeMapper), reasons::get)));
+    return new ClassMemberRecord(typeMapper.mapKey(reasons));
   }
 }
diff --git a/src/tools/android/java/com/google/devtools/build/android/desugar/langmodel/ClassMemberUseCounter.java b/src/tools/android/java/com/google/devtools/build/android/desugar/langmodel/ClassMemberUseCounter.java
index 43133f8..8830963 100644
--- a/src/tools/android/java/com/google/devtools/build/android/desugar/langmodel/ClassMemberUseCounter.java
+++ b/src/tools/android/java/com/google/devtools/build/android/desugar/langmodel/ClassMemberUseCounter.java
@@ -16,7 +16,6 @@
 
 package com.google.devtools.build.android.desugar.langmodel;
 
-import static java.util.stream.Collectors.toCollection;
 
 import com.google.common.collect.ConcurrentHashMultiset;
 
@@ -42,9 +41,6 @@
 
   @Override
   public ClassMemberUseCounter acceptTypeMapper(TypeMapper typeMapper) {
-    return new ClassMemberUseCounter(
-        memberUseCounter.stream()
-            .map(memberUse -> memberUse.acceptTypeMapper(typeMapper))
-            .collect(toCollection(ConcurrentHashMultiset::create)));
+    return new ClassMemberUseCounter(typeMapper.map(memberUseCounter));
   }
 }
diff --git a/src/tools/android/java/com/google/devtools/build/android/desugar/langmodel/TypeMapper.java b/src/tools/android/java/com/google/devtools/build/android/desugar/langmodel/TypeMapper.java
index 188c7f3..25ecee2 100644
--- a/src/tools/android/java/com/google/devtools/build/android/desugar/langmodel/TypeMapper.java
+++ b/src/tools/android/java/com/google/devtools/build/android/desugar/langmodel/TypeMapper.java
@@ -19,10 +19,15 @@
 import static com.google.common.collect.ImmutableList.toImmutableList;
 import static com.google.common.collect.ImmutableMap.toImmutableMap;
 import static com.google.common.collect.ImmutableSet.toImmutableSet;
+import static java.util.stream.Collectors.toCollection;
+import static java.util.stream.Collectors.toMap;
 
+import com.google.common.collect.ConcurrentHashMultiset;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
+import java.util.HashMap;
+import java.util.Map;
 import java.util.function.Function;
 import org.objectweb.asm.commons.Remapper;
 
@@ -53,6 +58,13 @@
     return mappableTypes.stream().map(e -> e.acceptTypeMapper(this)).collect(toImmutableSet());
   }
 
+  public <E extends TypeMappable<E>> ConcurrentHashMultiset<E> map(
+      ConcurrentHashMultiset<E> mappableTypes) {
+    return mappableTypes.stream()
+        .map(e -> e.acceptTypeMapper(this))
+        .collect(toCollection(ConcurrentHashMultiset::create));
+  }
+
   public <K extends TypeMappable<K>, V extends TypeMappable<V>> ImmutableMap<K, V> map(
       ImmutableMap<K, V> mappableTypes) {
     return mappableTypes.entrySet().stream()
@@ -60,4 +72,33 @@
             toImmutableMap(
                 e -> e.getKey().acceptTypeMapper(this), e -> e.getValue().acceptTypeMapper(this)));
   }
+
+  // TODO(b/149403079): Remove this method once the map collection used by referencing classes have
+  // been migrated to immutable.
+  public <K extends TypeMappable<? extends K>, V extends TypeMappable<V>> Map<K, V> mapMutable(
+      Map<K, V> mappableTypes) {
+    return mappableTypes.entrySet().stream()
+        .collect(
+            toMap(
+                e -> e.getKey().acceptTypeMapper(this),
+                e -> e.getValue().acceptTypeMapper(this),
+                (prev, next) -> next,
+                HashMap::new));
+  }
+
+  public <K extends TypeMappable<? extends K>, V> ImmutableMap<K, V> mapKey(
+      ImmutableMap<K, V> mappableTypes) {
+    return mappableTypes.entrySet().stream()
+        .collect(toImmutableMap(e -> e.getKey().acceptTypeMapper(this), e -> e.getValue()));
+  }
+
+  public <K extends TypeMappable<? extends K>, V> Map<K, V> mapKey(Map<K, V> mappableTypes) {
+    return mappableTypes.entrySet().stream()
+        .collect(
+            toMap(
+                e -> e.getKey().acceptTypeMapper(this),
+                e -> e.getValue(),
+                (prev, next) -> next,
+                HashMap::new));
+  }
 }
diff --git a/src/tools/android/java/com/google/devtools/build/android/desugar/nest/NestDigest.java b/src/tools/android/java/com/google/devtools/build/android/desugar/nest/NestDigest.java
index 71e7141..9d983f2 100644
--- a/src/tools/android/java/com/google/devtools/build/android/desugar/nest/NestDigest.java
+++ b/src/tools/android/java/com/google/devtools/build/android/desugar/nest/NestDigest.java
@@ -16,9 +16,7 @@
 
 import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.collect.ImmutableList.toImmutableList;
-import static com.google.common.collect.ImmutableMap.toImmutableMap;
 import static com.google.devtools.build.android.desugar.langmodel.LangModelConstants.NEST_COMPANION_CLASS_SIMPLE_NAME;
-import static java.util.stream.Collectors.toMap;
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
@@ -205,16 +203,7 @@
     return new NestDigest(
         classMemberRecord.acceptTypeMapper(typeMapper),
         classAttributeRecord.acceptTypeMapper(typeMapper),
-        nestCompanionToHostMap.keySet().stream()
-            .collect(
-                toMap(
-                    companion -> companion.acceptTypeMapper(typeMapper),
-                    companion ->
-                        nestCompanionToHostMap.get(companion).acceptTypeMapper(typeMapper))),
-        companionWriters.keySet().stream()
-            .collect(
-                toImmutableMap(
-                    nestHost -> nestHost.acceptTypeMapper(typeMapper),
-                    nestHost -> new ClassWriter(ClassWriter.COMPUTE_MAXS))));
+        typeMapper.mapMutable(nestCompanionToHostMap),
+        typeMapper.mapKey(companionWriters));
   }
 }