Reland "Lookup the rewritten type when rewriting kotlin metadata"
This reverts commit 1932e57c7bf58f96aed8c3e06fad612c6e6f817d.
Change-Id: If14c3fda35ed4d73e6d42d32c3f36b87fde7d71f
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinClassInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinClassInfo.java
index 00e689c..d9baf1f 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinClassInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinClassInfo.java
@@ -249,7 +249,10 @@
}
// Rewrite super types.
for (KotlinTypeInfo superType : superTypes) {
- superType.rewrite(kmClass::visitSupertype, appView, namingLens);
+ // Ensure the rewritten super type is not this type.
+ if (clazz.getType() != superType.rewriteType(appView.graphLens())) {
+ superType.rewrite(kmClass::visitSupertype, appView, namingLens);
+ }
}
// Rewrite nested classes.
for (KotlinTypeReference nestedClass : nestedClasses) {
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinClassifierInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinClassifierInfo.java
index c80ed32..54b8054 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinClassifierInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinClassifierInfo.java
@@ -7,6 +7,8 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexDefinitionSupplier;
import com.android.tools.r8.graph.DexItemFactory;
+import com.android.tools.r8.graph.DexType;
+import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.kotlin.Kotlin.ClassClassifiers;
import com.android.tools.r8.naming.NamingLens;
import com.android.tools.r8.shaking.EnqueuerMetadataTraceable;
@@ -48,6 +50,10 @@
abstract void rewrite(KmTypeVisitor visitor, AppView<?> appView, NamingLens namingLens);
+ public DexType rewriteType(GraphLens graphLens) {
+ return null;
+ }
+
public static class KotlinClassClassifierInfo extends KotlinClassifierInfo {
private final KotlinTypeReference type;
@@ -75,6 +81,11 @@
public void trace(DexDefinitionSupplier definitionSupplier) {
type.trace(definitionSupplier);
}
+
+ @Override
+ public DexType rewriteType(GraphLens graphLens) {
+ return type.rewriteType(graphLens);
+ }
}
public static class KotlinTypeParameterClassifierInfo extends KotlinClassifierInfo {
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinTypeInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinTypeInfo.java
index 4e74391..7f068f6 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinTypeInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinTypeInfo.java
@@ -9,6 +9,8 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexDefinitionSupplier;
import com.android.tools.r8.graph.DexItemFactory;
+import com.android.tools.r8.graph.DexType;
+import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.naming.NamingLens;
import com.android.tools.r8.shaking.EnqueuerMetadataTraceable;
import com.android.tools.r8.utils.Reporter;
@@ -120,4 +122,8 @@
flexibleTypeUpperBound.trace(definitionSupplier);
forEachApply(annotations, annotation -> annotation::trace, definitionSupplier);
}
+
+ public DexType rewriteType(GraphLens graphLens) {
+ return classifier.rewriteType(graphLens);
+ }
}
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinTypeReference.java b/src/main/java/com/android/tools/r8/kotlin/KotlinTypeReference.java
index 088e7ec..8aa95b2 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinTypeReference.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinTypeReference.java
@@ -9,6 +9,7 @@
import com.android.tools.r8.graph.DexItemFactory;
import com.android.tools.r8.graph.DexString;
import com.android.tools.r8.graph.DexType;
+import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.naming.NamingLens;
import com.android.tools.r8.shaking.EnqueuerMetadataTraceable;
import com.android.tools.r8.utils.DescriptorUtils;
@@ -65,11 +66,12 @@
if (!known.isClassType()) {
return known.descriptor.toString();
}
+ DexType rewrittenType = appView.graphLens().lookupClassType(known);
if (appView.appInfo().hasLiveness()
- && !appView.withLiveness().appInfo().isNonProgramTypeOrLiveProgramType(known)) {
+ && !appView.withLiveness().appInfo().isNonProgramTypeOrLiveProgramType(rewrittenType)) {
return defaultValue;
}
- DexString descriptor = namingLens.lookupDescriptor(known);
+ DexString descriptor = namingLens.lookupDescriptor(rewrittenType);
if (descriptor != null) {
return descriptor.toString();
}
@@ -102,7 +104,14 @@
public void trace(DexDefinitionSupplier definitionSupplier) {
if (known != null && known.isClassType()) {
// Lookup the definition, ignoring the result. This populates the sets in the Enqueuer.
- definitionSupplier.definitionFor(known);
+ definitionSupplier.contextIndependentDefinitionFor(known);
}
}
+
+ public DexType rewriteType(GraphLens graphLens) {
+ if (known != null && known.isClassType()) {
+ return graphLens.lookupClassType(known);
+ }
+ return null;
+ }
}