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;
}