Check for pruned types in field signatures
Bug: 172856713
Bug: 173078091
Change-Id: I5f36c4e7aa983fbe14c59f658dd5bd0319a376d5
diff --git a/src/main/java/com/android/tools/r8/graph/GenericSignatureTypeRewriter.java b/src/main/java/com/android/tools/r8/graph/GenericSignatureTypeRewriter.java
index e9b45f1..fd77b73 100644
--- a/src/main/java/com/android/tools/r8/graph/GenericSignatureTypeRewriter.java
+++ b/src/main/java/com/android/tools/r8/graph/GenericSignatureTypeRewriter.java
@@ -10,6 +10,7 @@
import static com.android.tools.r8.graph.GenericSignature.EMPTY_TYPE_SIGNATURES;
import static com.android.tools.r8.graph.GenericSignature.FieldTypeSignature.noSignature;
import static com.android.tools.r8.graph.GenericSignature.StarFieldTypeSignature.STAR_FIELD_TYPE_SIGNATURE;
+import static com.google.common.base.Predicates.alwaysFalse;
import com.android.tools.r8.graph.GenericSignature.ArrayTypeSignature;
import com.android.tools.r8.graph.GenericSignature.ClassSignature;
@@ -19,22 +20,40 @@
import com.android.tools.r8.graph.GenericSignature.MethodTypeSignature;
import com.android.tools.r8.graph.GenericSignature.ReturnType;
import com.android.tools.r8.graph.GenericSignature.TypeSignature;
-import com.android.tools.r8.shaking.AppInfoWithLiveness;
import java.util.ArrayList;
import java.util.List;
+import java.util.function.Function;
+import java.util.function.Predicate;
public class GenericSignatureTypeRewriter {
- private final AppView<?> appView;
+ private final DexItemFactory factory;
+ private final Predicate<DexType> wasPruned;
+ private final Function<DexType, DexType> lookupType;
private final DexProgramClass context;
private final FieldTypeSignature objectTypeSignature;
public GenericSignatureTypeRewriter(AppView<?> appView, DexProgramClass context) {
- this.appView = appView;
+ this(
+ appView.dexItemFactory(),
+ appView.appInfo().hasLiveness()
+ ? appView.appInfo().withLiveness()::wasPruned
+ : alwaysFalse(),
+ appView.graphLens()::lookupType,
+ context);
+ }
+
+ public GenericSignatureTypeRewriter(
+ DexItemFactory factory,
+ Predicate<DexType> wasPruned,
+ Function<DexType, DexType> lookupType,
+ DexProgramClass context) {
+ this.factory = factory;
+ this.wasPruned = wasPruned;
+ this.lookupType = lookupType;
this.context = context;
- objectTypeSignature =
- new ClassTypeSignature(appView.dexItemFactory().objectType, EMPTY_TYPE_ARGUMENTS);
+ objectTypeSignature = new ClassTypeSignature(factory.objectType, EMPTY_TYPE_ARGUMENTS);
}
public ClassSignature rewrite(ClassSignature classSignature) {
@@ -48,7 +67,8 @@
if (fieldTypeSignature.hasNoSignature()) {
return fieldTypeSignature;
}
- return new TypeSignatureRewriter().run(fieldTypeSignature);
+ FieldTypeSignature rewrittenSignature = new TypeSignatureRewriter().run(fieldTypeSignature);
+ return rewrittenSignature == null ? FieldTypeSignature.noSignature() : rewrittenSignature;
}
public MethodTypeSignature rewrite(MethodTypeSignature methodTypeSignature) {
@@ -80,8 +100,7 @@
public void visitSuperClass(ClassTypeSignature classTypeSignature) {
rewrittenSuperClass = new ClassTypeSignatureRewriter(true).run(classTypeSignature);
if (rewrittenSuperClass == null) {
- rewrittenSuperClass =
- new ClassTypeSignature(appView.dexItemFactory().objectType, EMPTY_TYPE_ARGUMENTS);
+ rewrittenSuperClass = new ClassTypeSignature(factory.objectType, EMPTY_TYPE_ARGUMENTS);
}
}
@@ -99,7 +118,7 @@
if (rewrittenTypeParameters.isEmpty()
&& rewrittenSuperInterfaces.isEmpty()
&& rewrittenSuperClass.isNoSignature()
- && rewrittenSuperClass.type == appView.dexItemFactory().objectType) {
+ && rewrittenSuperClass.type == factory.objectType) {
return ClassSignature.noSignature();
}
return new ClassSignature(
@@ -245,7 +264,6 @@
private class ClassTypeSignatureRewriter implements GenericSignatureVisitor {
- private final AppInfoWithLiveness appInfoWithLiveness;
private final boolean isSuperClassOrInterface;
// These fields are updated when iterating the modeled structure.
@@ -259,8 +277,6 @@
private ClassTypeSignature parentClassSignature;
private ClassTypeSignatureRewriter(boolean isSuperClassOrInterface) {
- appInfoWithLiveness =
- appView.appInfo().hasLiveness() ? appView.appInfo().withLiveness() : null;
this.isSuperClassOrInterface = isSuperClassOrInterface;
}
@@ -313,8 +329,8 @@
}
private DexType getTarget(DexType type) {
- DexType rewrittenType = appView.graphLens().lookupType(type);
- if (appInfoWithLiveness != null && appInfoWithLiveness.wasPruned(rewrittenType)) {
+ DexType rewrittenType = lookupType.apply(type);
+ if (wasPruned.test(rewrittenType)) {
return null;
}
if (isSuperClassOrInterface && context.type == rewrittenType) {