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