Lookup descriptor strings directly in the naming lens

Bug: 176943541
Change-Id: Iecaf67778c5500ac11d1eb36e14e5f344105a665
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/PrefixRewritingMapper.java b/src/main/java/com/android/tools/r8/ir/desugar/PrefixRewritingMapper.java
index 8ad22c7..b03cab4 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/PrefixRewritingMapper.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/PrefixRewritingMapper.java
@@ -13,6 +13,7 @@
 import com.android.tools.r8.graph.DexType;
 import com.android.tools.r8.utils.DescriptorUtils;
 import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Sets;
 import java.util.Map;
 import java.util.Set;
@@ -47,6 +48,8 @@
 
   public abstract boolean isRewriting();
 
+  public abstract boolean shouldRewriteTypeName(String typeName);
+
   public abstract void forAllRewrittenTypes(Consumer<DexType> consumer);
 
   public static class DesugarPrefixRewritingMapper extends PrefixRewritingMapper {
@@ -54,6 +57,7 @@
     private final Set<DexType> notRewritten = Sets.newConcurrentHashSet();
     private final Map<DexType, DexType> rewritten = new ConcurrentHashMap<>();
     private final Map<DexString, DexString> initialPrefixes;
+    private final Set<String> initialPrefixStrings;
     private final DexItemFactory factory;
     private final boolean l8Compilation;
 
@@ -62,10 +66,13 @@
       this.factory = itemFactory;
       this.l8Compilation = libraryCompilation;
       ImmutableMap.Builder<DexString, DexString> builder = ImmutableMap.builder();
+      ImmutableSet.Builder<String> prefixStringBuilder = ImmutableSet.builder();
       for (String key : prefixes.keySet()) {
+        prefixStringBuilder.add(key);
         builder.put(toDescriptorPrefix(key), toDescriptorPrefix(prefixes.get(key)));
       }
       this.initialPrefixes = builder.build();
+      this.initialPrefixStrings = prefixStringBuilder.build();
       validatePrefixes(prefixes);
     }
 
@@ -184,6 +191,17 @@
     public boolean isRewriting() {
       return true;
     }
+
+    @Override
+    public boolean shouldRewriteTypeName(String typeName) {
+      // TODO(b/154800164): We could use tries instead of looking-up everywhere.
+      for (DexString prefix : initialPrefixes.keySet()) {
+        if (typeName.startsWith(prefix.toString())) {
+          return true;
+        }
+      }
+      return false;
+    }
   }
 
   public static class EmptyPrefixRewritingMapper extends PrefixRewritingMapper {
@@ -202,6 +220,11 @@
     }
 
     @Override
+    public boolean shouldRewriteTypeName(String typeName) {
+      return false;
+    }
+
+    @Override
     public void forAllRewrittenTypes(Consumer<DexType> consumer) {}
   }
 }
diff --git a/src/main/java/com/android/tools/r8/naming/IdentifierMinifier.java b/src/main/java/com/android/tools/r8/naming/IdentifierMinifier.java
index b9fc4cb..a775a72 100644
--- a/src/main/java/com/android/tools/r8/naming/IdentifierMinifier.java
+++ b/src/main/java/com/android/tools/r8/naming/IdentifierMinifier.java
@@ -16,7 +16,6 @@
 import com.android.tools.r8.graph.DexEncodedField;
 import com.android.tools.r8.graph.DexEncodedMethod;
 import com.android.tools.r8.graph.DexString;
-import com.android.tools.r8.graph.DexType;
 import com.android.tools.r8.graph.DexValue;
 import com.android.tools.r8.graph.DexValue.DexItemBasedValueString;
 import com.android.tools.r8.graph.DexValue.DexValueString;
@@ -25,7 +24,6 @@
 import com.android.tools.r8.utils.ThreadUtils;
 import java.util.ArrayList;
 import java.util.List;
-import java.util.Map;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.ExecutorService;
 
@@ -104,21 +102,10 @@
   }
 
   private DexString getRenamedStringLiteral(DexString originalLiteral) {
-    String originalString = originalLiteral.toString();
-    Map<String, DexType> renamedYetMatchedTypes =
-        lens.getRenamedItems(
-            DexType.class,
-            type -> type.toSourceString().equals(originalString),
-            DexType::toSourceString);
-    DexType type = renamedYetMatchedTypes.get(originalString);
-    if (type != null) {
-      DexString renamed = lens.lookupDescriptor(type);
-      // Create a new DexString only when the corresponding string literal will be replaced.
-      if (renamed != originalLiteral) {
-        return appView.dexItemFactory().createString(descriptorToJavaType(renamed.toString()));
-      }
-    }
-    return originalLiteral;
+    DexString rewrittenString = lens.lookupDescriptorForJavaTypeName(originalLiteral.toString());
+    return rewrittenString == null
+        ? originalLiteral
+        : appView.dexItemFactory().createString(descriptorToJavaType(rewrittenString.toString()));
   }
 
   private void replaceDexItemBasedConstString(ExecutorService executorService)
diff --git a/src/main/java/com/android/tools/r8/naming/MinifiedRenaming.java b/src/main/java/com/android/tools/r8/naming/MinifiedRenaming.java
index b7bfcdb..eb4e9ca 100644
--- a/src/main/java/com/android/tools/r8/naming/MinifiedRenaming.java
+++ b/src/main/java/com/android/tools/r8/naming/MinifiedRenaming.java
@@ -20,13 +20,10 @@
 import com.android.tools.r8.naming.NamingLens.NonIdentityNamingLens;
 import com.android.tools.r8.utils.DescriptorUtils;
 import com.android.tools.r8.utils.InternalOptions;
-import com.google.common.collect.ImmutableMap;
 import java.util.ArrayList;
 import java.util.IdentityHashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.function.Function;
-import java.util.function.Predicate;
 
 class MinifiedRenaming extends NonIdentityNamingLens {
 
@@ -39,7 +36,7 @@
       ClassRenaming classRenaming,
       MethodRenaming methodRenaming,
       FieldRenaming fieldRenaming) {
-    super(appView.dexItemFactory());
+    super(appView.dexItemFactory(), classRenaming.classRenaming);
     this.appView = appView;
     this.packageRenaming = classRenaming.packageRenaming;
     renaming.putAll(classRenaming.classRenaming);
@@ -123,15 +120,6 @@
     return renaming.getOrDefault(field, field.name);
   }
 
-  @Override
-  public <T extends DexItem> Map<String, T> getRenamedItems(
-      Class<T> clazz, Predicate<T> predicate, Function<T, String> namer) {
-    return renaming.keySet().stream()
-        .filter(item -> (clazz.isInstance(item) && predicate.test(clazz.cast(item))))
-        .map(clazz::cast)
-        .collect(ImmutableMap.toImmutableMap(namer, i -> i));
-  }
-
   /**
    * Checks that the renaming of the method reference {@param method} is consistent with the
    * renaming of the resolution target of {@param method}.
diff --git a/src/main/java/com/android/tools/r8/naming/NamingLens.java b/src/main/java/com/android/tools/r8/naming/NamingLens.java
index 9147b84..bdd0e70 100644
--- a/src/main/java/com/android/tools/r8/naming/NamingLens.java
+++ b/src/main/java/com/android/tools/r8/naming/NamingLens.java
@@ -8,7 +8,6 @@
 import com.android.tools.r8.graph.DexEncodedField;
 import com.android.tools.r8.graph.DexEncodedMethod;
 import com.android.tools.r8.graph.DexField;
-import com.android.tools.r8.graph.DexItem;
 import com.android.tools.r8.graph.DexItemFactory;
 import com.android.tools.r8.graph.DexMethod;
 import com.android.tools.r8.graph.DexProgramClass;
@@ -20,13 +19,11 @@
 import com.android.tools.r8.optimize.MemberRebindingAnalysis;
 import com.android.tools.r8.utils.DescriptorUtils;
 import com.android.tools.r8.utils.InternalOptions;
-import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Sets;
 import java.util.Arrays;
+import java.util.HashMap;
 import java.util.Map;
 import java.util.Set;
-import java.util.function.Function;
-import java.util.function.Predicate;
 
 /**
  * Implements a translation of the Dex graph from original names to new names produced by the {@link
@@ -45,6 +42,8 @@
 
   public abstract DexString lookupDescriptor(DexType type);
 
+  public abstract DexString lookupDescriptorForJavaTypeName(String typeName);
+
   public DexString lookupClassDescriptor(DexType type) {
     assert type.isClassType();
     return internalLookupClassDescriptor(type);
@@ -147,9 +146,6 @@
     return DescriptorUtils.descriptorToInternalName(lookupDescriptor(type).toString());
   }
 
-  public abstract <T extends DexItem> Map<String, T> getRenamedItems(
-      Class<T> clazz, Predicate<T> predicate, Function<T, String> namer);
-
   /**
    * Checks whether the target will be translated properly by this lens.
    *
@@ -189,9 +185,13 @@
   public abstract static class NonIdentityNamingLens extends NamingLens {
 
     private final DexItemFactory dexItemFactory;
+    private final Map<String, DexString> typeStringMapping;
 
-    protected NonIdentityNamingLens(DexItemFactory dexItemFactory) {
+    protected NonIdentityNamingLens(
+        DexItemFactory dexItemFactory, Map<DexType, DexString> typeMapping) {
       this.dexItemFactory = dexItemFactory;
+      typeStringMapping = new HashMap<>();
+      typeMapping.forEach((k, v) -> typeStringMapping.put(k.toSourceString(), v));
     }
 
     protected DexItemFactory dexItemFactory() {
@@ -211,6 +211,11 @@
       assert type.isClassType();
       return lookupClassDescriptor(type);
     }
+
+    @Override
+    public DexString lookupDescriptorForJavaTypeName(String typeName) {
+      return typeStringMapping.get(typeName);
+    }
   }
 
   private static final class IdentityLens extends NamingLens {
@@ -225,6 +230,11 @@
     }
 
     @Override
+    public DexString lookupDescriptorForJavaTypeName(String typeName) {
+      return null;
+    }
+
+    @Override
     protected DexString internalLookupClassDescriptor(DexType type) {
       return type.descriptor;
     }
@@ -250,12 +260,6 @@
     }
 
     @Override
-    public <T extends DexItem> Map<String, T> getRenamedItems(
-        Class<T> clazz, Predicate<T> predicate, Function<T, String> namer) {
-      return ImmutableMap.of();
-    }
-
-    @Override
     public boolean verifyRenamingConsistentWithResolution(DexMethod item) {
       return true;
     }
diff --git a/src/main/java/com/android/tools/r8/naming/PrefixRewritingNamingLens.java b/src/main/java/com/android/tools/r8/naming/PrefixRewritingNamingLens.java
index e987def..04f235f 100644
--- a/src/main/java/com/android/tools/r8/naming/PrefixRewritingNamingLens.java
+++ b/src/main/java/com/android/tools/r8/naming/PrefixRewritingNamingLens.java
@@ -6,20 +6,13 @@
 
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexField;
-import com.android.tools.r8.graph.DexItem;
 import com.android.tools.r8.graph.DexMethod;
 import com.android.tools.r8.graph.DexString;
 import com.android.tools.r8.graph.DexType;
 import com.android.tools.r8.graph.InnerClassAttribute;
 import com.android.tools.r8.naming.NamingLens.NonIdentityNamingLens;
 import com.android.tools.r8.utils.InternalOptions;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.function.Function;
-import java.util.function.Predicate;
-import java.util.stream.Collectors;
-import java.util.stream.Stream;
+import java.util.IdentityHashMap;
 
 // Naming lens for rewriting type prefixes.
 public class PrefixRewritingNamingLens extends NonIdentityNamingLens {
@@ -41,7 +34,7 @@
   }
 
   public PrefixRewritingNamingLens(NamingLens namingLens, AppView<?> appView) {
-    super(appView.dexItemFactory());
+    super(appView.dexItemFactory(), new IdentityHashMap<>());
     this.appView = appView;
     this.namingLens = namingLens;
     this.options = appView.options();
@@ -103,6 +96,18 @@
   }
 
   @Override
+  public DexString lookupDescriptorForJavaTypeName(String typeName) {
+    if (appView.rewritePrefix.shouldRewriteTypeName(typeName)) {
+      DexType rewrittenType =
+          appView.rewritePrefix.rewrittenType(dexItemFactory().createType(typeName), appView);
+      if (rewrittenType != null) {
+        return rewrittenType.descriptor;
+      }
+    }
+    return namingLens.lookupDescriptorForJavaTypeName(typeName);
+  }
+
+  @Override
   public String lookupPackageName(String packageName) {
     // Used for resource shrinking.
     // Desugared libraries do not have resources.
@@ -122,30 +127,6 @@
   }
 
   @Override
-  public <T extends DexItem> Map<String, T> getRenamedItems(
-      Class<T> clazz, Predicate<T> predicate, Function<T, String> namer) {
-    Map<String, T> renamedItemsPrefixRewritting;
-    if (clazz == DexType.class) {
-      renamedItemsPrefixRewritting = new HashMap<>();
-      appView.rewritePrefix.forAllRewrittenTypes(
-          item -> {
-            T cast = clazz.cast(item);
-            if (predicate.test(cast)) {
-              renamedItemsPrefixRewritting.put(namer.apply(cast), cast);
-            }
-          });
-    } else {
-      renamedItemsPrefixRewritting = Collections.emptyMap();
-    }
-    Map<String, T> renamedItemsMinifier = namingLens.getRenamedItems(clazz, predicate, namer);
-    // The Collector throws an exception for duplicated keys.
-    return Stream.concat(
-            renamedItemsPrefixRewritting.entrySet().stream(),
-            renamedItemsMinifier.entrySet().stream())
-        .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
-  }
-
-  @Override
   public boolean verifyRenamingConsistentWithResolution(DexMethod item) {
     return namingLens.verifyRenamingConsistentWithResolution(item);
   }
diff --git a/src/main/java/com/android/tools/r8/relocator/SimplePackagesRewritingMapper.java b/src/main/java/com/android/tools/r8/relocator/SimplePackagesRewritingMapper.java
index 09ca5bd..3a5902a 100644
--- a/src/main/java/com/android/tools/r8/relocator/SimplePackagesRewritingMapper.java
+++ b/src/main/java/com/android/tools/r8/relocator/SimplePackagesRewritingMapper.java
@@ -7,7 +7,6 @@
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexEncodedMethod;
 import com.android.tools.r8.graph.DexField;
-import com.android.tools.r8.graph.DexItem;
 import com.android.tools.r8.graph.DexItemFactory;
 import com.android.tools.r8.graph.DexMethod;
 import com.android.tools.r8.graph.DexProgramClass;
@@ -22,8 +21,6 @@
 import com.google.common.collect.ImmutableMap;
 import java.util.IdentityHashMap;
 import java.util.Map;
-import java.util.function.Function;
-import java.util.function.Predicate;
 
 class SimplePackagesRewritingMapper {
 
@@ -105,7 +102,7 @@
         Map<DexType, DexString> typeMappings,
         Map<String, String> packageMappings,
         DexItemFactory factory) {
-      super(factory);
+      super(factory, typeMappings);
       this.typeMappings = typeMappings;
       this.packageMappings = packageMappings;
     }
@@ -136,15 +133,6 @@
     }
 
     @Override
-    public <T extends DexItem> Map<String, T> getRenamedItems(
-        Class<T> clazz, Predicate<T> predicate, Function<T, String> namer) {
-      return typeMappings.keySet().stream()
-          .filter(item -> (clazz.isInstance(item) && predicate.test(clazz.cast(item))))
-          .map(clazz::cast)
-          .collect(ImmutableMap.toImmutableMap(namer, i -> i));
-    }
-
-    @Override
     public boolean verifyRenamingConsistentWithResolution(DexMethod item) {
       return true;
     }