Revert "Account for invalid type references in kotlin metadata"
and "Always parse kotlin metadata lambda structures"

This reverts commit 854cebbb90f283b9f330072ba15203d2bc7de1b4.
This reverts commit c1503d2c7ef4d8e28e1963cb66b87125a444c374.

Broke ProcessKotlinReflectionLibTest, ProcessKotlinStdlibTest,
MetadataRewriteInSuperTypeTest, and EventPublisherTest

Change-Id: I5f9932b82a1bbbbfccc2fa74ec6717bde25e6f80
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinAnnotationInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinAnnotationInfo.java
index e0a8d22..a4bc5b0 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinAnnotationInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinAnnotationInfo.java
@@ -4,8 +4,12 @@
 
 package com.android.tools.r8.kotlin;
 
+import static com.android.tools.r8.kotlin.KotlinMetadataUtils.referenceTypeFromBinaryName;
+
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexDefinitionSupplier;
+import com.android.tools.r8.graph.DexString;
+import com.android.tools.r8.graph.DexType;
 import com.android.tools.r8.naming.NamingLens;
 import com.android.tools.r8.shaking.AppInfoWithLiveness;
 import com.android.tools.r8.utils.DescriptorUtils;
@@ -20,12 +24,12 @@
 
   private static final List<KotlinAnnotationInfo> EMPTY_ANNOTATIONS = ImmutableList.of();
 
-  private final KotlinTypeReference annotationType;
+  private final DexType annotationType;
   // TODO(b/155053894): Model KmAnnotationArgument.
   private final Map<String, KmAnnotationArgument<?>> arguments;
 
   private KotlinAnnotationInfo(
-      KotlinTypeReference annotationType, Map<String, KmAnnotationArgument<?>> arguments) {
+      DexType annotationType, Map<String, KmAnnotationArgument<?>> arguments) {
     this.annotationType = annotationType;
     this.arguments = arguments;
   }
@@ -33,7 +37,7 @@
   private static KotlinAnnotationInfo create(
       KmAnnotation annotation, DexDefinitionSupplier definitionSupplier) {
     return new KotlinAnnotationInfo(
-        KotlinTypeReference.createFromBinaryName(annotation.getClassName(), definitionSupplier),
+        referenceTypeFromBinaryName(annotation.getClassName(), definitionSupplier),
         annotation.getArguments());
   }
 
@@ -53,13 +57,11 @@
       KmVisitorProviders.KmAnnotationVisitorProvider visitorProvider,
       AppView<AppInfoWithLiveness> appView,
       NamingLens namingLens) {
-    String renamedDescriptor =
-        annotationType.toRenamedDescriptorOrDefault(appView, namingLens, null);
-    if (renamedDescriptor == null) {
-      // The type has been pruned
+    if (appView.appInfo().wasPruned(annotationType)) {
       return;
     }
-    String classifier = DescriptorUtils.descriptorToKotlinClassifier(renamedDescriptor);
+    DexString descriptor = namingLens.lookupDescriptor(annotationType);
+    String classifier = DescriptorUtils.descriptorToKotlinClassifier(descriptor.toString());
     KmAnnotation annotation = new KmAnnotation(classifier, arguments);
     visitorProvider.get(annotation);
   }
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 21d4cb3..b507093 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinClassInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinClassInfo.java
@@ -4,6 +4,7 @@
 
 package com.android.tools.r8.kotlin;
 
+import static com.android.tools.r8.kotlin.KotlinMetadataUtils.referenceTypeFromBinaryName;
 import static com.android.tools.r8.kotlin.KotlinMetadataUtils.toJvmFieldSignature;
 import static com.android.tools.r8.kotlin.KotlinMetadataUtils.toJvmMethodSignature;
 
@@ -13,6 +14,7 @@
 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.naming.NamingLens;
 import com.android.tools.r8.shaking.AppInfoWithLiveness;
 import com.android.tools.r8.utils.DescriptorUtils;
@@ -39,14 +41,14 @@
   private final KotlinDeclarationContainerInfo declarationContainerInfo;
   private final List<KotlinTypeParameterInfo> typeParameters;
   private final List<KotlinTypeInfo> superTypes;
-  private final List<KotlinTypeReference> sealedSubClasses;
-  private final List<KotlinTypeReference> nestedClasses;
+  private final List<DexType> sealedSubClasses;
+  private final List<DexType> nestedClasses;
   // TODO(b/154347404): Understand enum entries.
   private final List<String> enumEntries;
-  private final KotlinTypeReference anonymousObjectOrigin;
+  private final DexType anonymousObjectOrigin;
   private final String packageName;
 
-  private KotlinClassInfo(
+  public KotlinClassInfo(
       int flags,
       String name,
       String moduleName,
@@ -54,10 +56,10 @@
       List<KotlinTypeParameterInfo> typeParameters,
       List<KotlinConstructorInfo> constructorsWithNoBacking,
       List<KotlinTypeInfo> superTypes,
-      List<KotlinTypeReference> sealedSubClasses,
-      List<KotlinTypeReference> nestedClasses,
+      List<DexType> sealedSubClasses,
+      List<DexType> nestedClasses,
       List<String> enumEntries,
-      KotlinTypeReference anonymousObjectOrigin,
+      DexType anonymousObjectOrigin,
       String packageName) {
     this.flags = flags;
     this.name = name;
@@ -115,42 +117,41 @@
         KotlinTypeParameterInfo.create(kmClass.getTypeParameters(), definitionSupplier, reporter),
         notBackedConstructors.build(),
         getSuperTypes(kmClass.getSupertypes(), definitionSupplier, reporter),
-        getSealedSubClasses(kmClass.getSealedSubclasses(), definitionSupplier),
+        getSealedSubClasses(hostClass, kmClass.getSealedSubclasses(), definitionSupplier),
         getNestedClasses(hostClass, kmClass.getNestedClasses(), definitionSupplier),
         kmClass.getEnumEntries(),
         getAnonymousObjectOrigin(kmClass, definitionSupplier),
         packageName);
   }
 
-  private static KotlinTypeReference getAnonymousObjectOrigin(
+  private static DexType getAnonymousObjectOrigin(
       KmClass kmClass, DexDefinitionSupplier definitionSupplier) {
     String anonymousObjectOriginName = JvmExtensionsKt.getAnonymousObjectOriginName(kmClass);
     if (anonymousObjectOriginName != null) {
-      return KotlinTypeReference.createFromBinaryName(
-          anonymousObjectOriginName, definitionSupplier);
+      return referenceTypeFromBinaryName(anonymousObjectOriginName, definitionSupplier);
     }
     return null;
   }
 
-  private static List<KotlinTypeReference> getNestedClasses(
+  private static List<DexType> getNestedClasses(
       DexClass clazz, List<String> nestedClasses, DexDefinitionSupplier definitionSupplier) {
-    ImmutableList.Builder<KotlinTypeReference> nestedTypes = ImmutableList.builder();
+    ImmutableList.Builder<DexType> nestedTypes = ImmutableList.builder();
     for (String nestedClass : nestedClasses) {
       String binaryName =
           clazz.type.toBinaryName() + DescriptorUtils.INNER_CLASS_SEPARATOR + nestedClass;
-      nestedTypes.add(KotlinTypeReference.createFromBinaryName(binaryName, definitionSupplier));
+      nestedTypes.add(referenceTypeFromBinaryName(binaryName, definitionSupplier));
     }
     return nestedTypes.build();
   }
 
-  private static List<KotlinTypeReference> getSealedSubClasses(
-      List<String> sealedSubclasses, DexDefinitionSupplier definitionSupplier) {
-    ImmutableList.Builder<KotlinTypeReference> sealedTypes = ImmutableList.builder();
+  private static List<DexType> getSealedSubClasses(
+      DexClass clazz, List<String> sealedSubclasses, DexDefinitionSupplier definitionSupplier) {
+    ImmutableList.Builder<DexType> sealedTypes = ImmutableList.builder();
     for (String sealedSubClass : sealedSubclasses) {
       String binaryName =
           sealedSubClass.replace(
               DescriptorUtils.JAVA_PACKAGE_SEPARATOR, DescriptorUtils.INNER_CLASS_SEPARATOR);
-      sealedTypes.add(KotlinTypeReference.createFromBinaryName(binaryName, definitionSupplier));
+      sealedTypes.add(referenceTypeFromBinaryName(binaryName, definitionSupplier));
     }
     return sealedTypes.build();
   }
@@ -204,7 +205,7 @@
     kmClass.setName(
         originalDescriptor.equals(rewrittenDescriptor)
             ? this.name
-            : DescriptorUtils.getBinaryNameFromDescriptor(rewrittenDescriptor.toString()));
+            : KotlinMetadataUtils.kotlinNameFromDescriptor(rewrittenDescriptor));
     // Find a companion object.
     for (DexEncodedField field : clazz.fields()) {
       if (field.getKotlinMemberInfo().isCompanion()) {
@@ -239,22 +240,24 @@
       superType.rewrite(kmClass::visitSupertype, appView, namingLens);
     }
     // Rewrite nested classes.
-    for (KotlinTypeReference nestedClass : nestedClasses) {
-      String nestedDescriptor = nestedClass.toRenamedBinaryNameOrDefault(appView, namingLens, null);
-      if (nestedDescriptor != null) {
+    for (DexType nestedClass : nestedClasses) {
+      if (appView.appInfo().isNonProgramTypeOrLiveProgramType(nestedClass)) {
+        String descriptor =
+            KotlinMetadataUtils.kotlinNameFromDescriptor(namingLens.lookupDescriptor(nestedClass));
         // If the class is a nested class, it should be on the form Foo.Bar$Baz, where Baz is the
         // name we should record.
-        int innerClassIndex = nestedDescriptor.lastIndexOf(DescriptorUtils.INNER_CLASS_SEPARATOR);
-        kmClass.visitNestedClass(nestedDescriptor.substring(innerClassIndex + 1));
+        int innerClassIndex = descriptor.lastIndexOf(DescriptorUtils.INNER_CLASS_SEPARATOR);
+        kmClass.visitNestedClass(descriptor.substring(innerClassIndex + 1));
       }
     }
     // Rewrite sealed sub classes.
-    for (KotlinTypeReference sealedSubClass : sealedSubClasses) {
-      String sealedDescriptor =
-          sealedSubClass.toRenamedBinaryNameOrDefault(appView, namingLens, null);
-      if (sealedDescriptor != null) {
+    for (DexType sealedSubClass : sealedSubClasses) {
+      if (appView.appInfo().isNonProgramTypeOrLiveProgramType(sealedSubClass)) {
+        String descriptor =
+            KotlinMetadataUtils.kotlinNameFromDescriptor(
+                namingLens.lookupDescriptor(sealedSubClass));
         kmClass.visitSealedSubclass(
-            sealedDescriptor.replace(
+            descriptor.replace(
                 DescriptorUtils.INNER_CLASS_SEPARATOR, DescriptorUtils.JAVA_PACKAGE_SEPARATOR));
       }
     }
@@ -263,11 +266,8 @@
 
     JvmExtensionsKt.setModuleName(kmClass, moduleName);
     if (anonymousObjectOrigin != null) {
-      String renamedAnon =
-          anonymousObjectOrigin.toRenamedBinaryNameOrDefault(appView, namingLens, null);
-      if (renamedAnon != null) {
-        JvmExtensionsKt.setAnonymousObjectOriginName(kmClass, renamedAnon);
-      }
+      JvmExtensionsKt.setAnonymousObjectOriginName(
+          kmClass, KotlinMetadataUtils.kotlinNameFromDescriptor(anonymousObjectOrigin.descriptor));
     }
 
     KotlinClassMetadata.Class.Writer writer = new KotlinClassMetadata.Class.Writer();
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 a091e52..d6ff5b4 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinClassifierInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinClassifierInfo.java
@@ -4,8 +4,12 @@
 
 package com.android.tools.r8.kotlin;
 
+import static com.android.tools.r8.kotlin.KotlinMetadataUtils.referenceTypeFromDescriptor;
+
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexDefinitionSupplier;
+import com.android.tools.r8.graph.DexString;
+import com.android.tools.r8.graph.DexType;
 import com.android.tools.r8.kotlin.Kotlin.ClassClassifiers;
 import com.android.tools.r8.naming.NamingLens;
 import com.android.tools.r8.shaking.AppInfoWithLiveness;
@@ -31,8 +35,7 @@
               isLocalOrAnonymous ? originalTypeName.substring(1) : originalTypeName);
       if (DescriptorUtils.isClassDescriptor(descriptor)) {
         return new KotlinClassClassifierInfo(
-            KotlinTypeReference.createFromDescriptor(descriptor, definitionSupplier),
-            isLocalOrAnonymous);
+            referenceTypeFromDescriptor(descriptor, definitionSupplier), isLocalOrAnonymous);
       } else {
         return new KotlinUnknownClassClassifierInfo(originalTypeName);
       }
@@ -51,10 +54,10 @@
 
   public static class KotlinClassClassifierInfo extends KotlinClassifierInfo {
 
-    private final KotlinTypeReference type;
+    private final DexType type;
     private final boolean isLocalOrAnonymous;
 
-    private KotlinClassClassifierInfo(KotlinTypeReference type, boolean isLocalOrAnonymous) {
+    private KotlinClassClassifierInfo(DexType type, boolean isLocalOrAnonymous) {
       this.type = type;
       this.isLocalOrAnonymous = isLocalOrAnonymous;
     }
@@ -62,14 +65,18 @@
     @Override
     void rewrite(
         KmTypeVisitor visitor, AppView<AppInfoWithLiveness> appView, NamingLens namingLens) {
-      String descriptor =
-          type.toRenamedDescriptorOrDefault(appView, namingLens, ClassClassifiers.anyName);
+      if (appView.appInfo().wasPruned(type)) {
+        visitor.visitClass(ClassClassifiers.anyName);
+        return;
+      }
+      DexString descriptor = namingLens.lookupDescriptor(type);
       // For local or anonymous classes, the classifier is prefixed with '.' and inner classes are
       // separated with '$'.
       if (isLocalOrAnonymous) {
-        visitor.visitClass("." + DescriptorUtils.getBinaryNameFromDescriptor(descriptor));
+        visitor.visitClass(
+            "." + DescriptorUtils.getBinaryNameFromDescriptor(descriptor.toString()));
       } else {
-        visitor.visitClass(DescriptorUtils.descriptorToKotlinClassifier(descriptor));
+        visitor.visitClass(DescriptorUtils.descriptorToKotlinClassifier(descriptor.toString()));
       }
     }
   }
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinFunctionInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinFunctionInfo.java
index 95e55c0..58b07cb 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinFunctionInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinFunctionInfo.java
@@ -4,9 +4,12 @@
 
 package com.android.tools.r8.kotlin;
 
+import static com.android.tools.r8.kotlin.KotlinMetadataUtils.referenceTypeFromBinaryName;
+
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexDefinitionSupplier;
 import com.android.tools.r8.graph.DexEncodedMethod;
+import com.android.tools.r8.graph.DexType;
 import com.android.tools.r8.naming.NamingLens;
 import com.android.tools.r8.shaking.AppInfoWithLiveness;
 import com.android.tools.r8.utils.Reporter;
@@ -33,7 +36,7 @@
   // Information about the signature
   private final KotlinJvmMethodSignatureInfo signature;
   // Information about the lambdaClassOrigin.
-  private final KotlinTypeReference lambdaClassOrigin;
+  private final DexType lambdaClassOrigin;
 
   private KotlinFunctionInfo(
       int flags,
@@ -43,7 +46,7 @@
       List<KotlinValueParameterInfo> valueParameters,
       List<KotlinTypeParameterInfo> typeParameters,
       KotlinJvmMethodSignatureInfo signature,
-      KotlinTypeReference lambdaClassOrigin) {
+      DexType lambdaClassOrigin) {
     this.flags = flags;
     this.name = name;
     this.returnType = returnType;
@@ -70,11 +73,11 @@
         getlambdaClassOrigin(kmFunction, definitionSupplier));
   }
 
-  private static KotlinTypeReference getlambdaClassOrigin(
+  private static DexType getlambdaClassOrigin(
       KmFunction kmFunction, DexDefinitionSupplier definitionSupplier) {
     String lambdaClassOriginName = JvmExtensionsKt.getLambdaClassOriginName(kmFunction);
     if (lambdaClassOriginName != null) {
-      return KotlinTypeReference.createFromBinaryName(lambdaClassOriginName, definitionSupplier);
+      return referenceTypeFromBinaryName(lambdaClassOriginName, definitionSupplier);
     }
     return null;
   }
@@ -111,11 +114,8 @@
       extensionVisitor.visit(signature.rewrite(method, appView, namingLens));
     }
     if (lambdaClassOrigin != null && extensionVisitor != null) {
-      String lambdaClassOriginName =
-          lambdaClassOrigin.toRenamedBinaryNameOrDefault(appView, namingLens, null);
-      if (lambdaClassOriginName != null) {
-        extensionVisitor.visitLambdaClassOriginName(lambdaClassOriginName);
-      }
+      extensionVisitor.visitLambdaClassOriginName(
+          KotlinMetadataUtils.kotlinNameFromDescriptor(lambdaClassOrigin.descriptor));
     }
   }
 
@@ -132,8 +132,4 @@
   public boolean isExtensionFunction() {
     return receiverParameterType != null;
   }
-
-  public KotlinJvmMethodSignatureInfo getSignature() {
-    return signature;
-  }
 }
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinJvmFieldSignatureInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinJvmFieldSignatureInfo.java
index 7603c36..69c0442 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinJvmFieldSignatureInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinJvmFieldSignatureInfo.java
@@ -4,9 +4,13 @@
 
 package com.android.tools.r8.kotlin;
 
+import static com.android.tools.r8.kotlin.KotlinMetadataUtils.referenceTypeFromDescriptor;
+import static com.android.tools.r8.kotlin.KotlinMetadataUtils.toRenamedDescriptorOrDefault;
+
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexDefinitionSupplier;
 import com.android.tools.r8.graph.DexEncodedField;
+import com.android.tools.r8.graph.DexType;
 import com.android.tools.r8.naming.NamingLens;
 import com.android.tools.r8.shaking.AppInfoWithLiveness;
 import kotlinx.metadata.jvm.JvmFieldSignature;
@@ -17,10 +21,10 @@
  */
 public class KotlinJvmFieldSignatureInfo {
 
-  private final KotlinTypeReference type;
+  private final DexType type;
   private final String name;
 
-  private KotlinJvmFieldSignatureInfo(String name, KotlinTypeReference type) {
+  private KotlinJvmFieldSignatureInfo(String name, DexType type) {
     this.name = name;
     this.type = type;
   }
@@ -32,7 +36,7 @@
     }
     return new KotlinJvmFieldSignatureInfo(
         fieldSignature.getName(),
-        KotlinTypeReference.createFromDescriptor(fieldSignature.getDesc(), definitionSupplier));
+        referenceTypeFromDescriptor(fieldSignature.getDesc(), definitionSupplier));
   }
 
   public JvmFieldSignature rewrite(
@@ -47,6 +51,6 @@
     }
     String defValue = appView.dexItemFactory().objectType.toDescriptorString();
     return new JvmFieldSignature(
-        finalName, type.toRenamedDescriptorOrDefault(appView, namingLens, defValue));
+        finalName, toRenamedDescriptorOrDefault(type, appView, namingLens, defValue));
   }
 }
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinJvmMethodSignatureInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinJvmMethodSignatureInfo.java
index 6b16a51..d9d5c9d 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinJvmMethodSignatureInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinJvmMethodSignatureInfo.java
@@ -4,9 +4,13 @@
 
 package com.android.tools.r8.kotlin;
 
+import static com.android.tools.r8.kotlin.KotlinMetadataUtils.referenceTypeFromDescriptor;
+import static com.android.tools.r8.kotlin.KotlinMetadataUtils.toRenamedDescriptorOrDefault;
+
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexDefinitionSupplier;
 import com.android.tools.r8.graph.DexEncodedMethod;
+import com.android.tools.r8.graph.DexType;
 import com.android.tools.r8.naming.NamingLens;
 import com.android.tools.r8.shaking.AppInfoWithLiveness;
 import com.android.tools.r8.utils.DescriptorUtils;
@@ -20,26 +24,16 @@
  */
 public class KotlinJvmMethodSignatureInfo {
 
-  private static final List<KotlinTypeReference> EMPTY_PARAMETERS_LIST = ImmutableList.of();
+  private static final List<DexType> EMPTY_PARAMETERS_LIST = ImmutableList.of();
 
   private final String name;
-  private final KotlinTypeReference returnType;
-  private final List<KotlinTypeReference> parameters;
-  private final String invalidDescriptor;
+  private final DexType returnType;
+  private final List<DexType> parameters;
 
-  private KotlinJvmMethodSignatureInfo(
-      String name, KotlinTypeReference returnType, List<KotlinTypeReference> parameters) {
+  private KotlinJvmMethodSignatureInfo(String name, DexType returnType, List<DexType> parameters) {
     this.name = name;
     this.returnType = returnType;
     this.parameters = parameters;
-    this.invalidDescriptor = null;
-  }
-
-  private KotlinJvmMethodSignatureInfo(String name, String invalidDescriptor) {
-    this.name = name;
-    this.invalidDescriptor = invalidDescriptor;
-    this.parameters = EMPTY_PARAMETERS_LIST;
-    this.returnType = null;
   }
 
   public static KotlinJvmMethodSignatureInfo create(
@@ -48,21 +42,16 @@
       return null;
     }
     String kotlinDescriptor = methodSignature.getDesc();
-    if (!KotlinMetadataUtils.isValidMethodDescriptor(kotlinDescriptor)) {
-      // If the method descriptor is invalid, keep it as invalid.
-      return new KotlinJvmMethodSignatureInfo(methodSignature.getName(), kotlinDescriptor);
-    }
     String returnTypeDescriptor = DescriptorUtils.getReturnTypeDescriptor(kotlinDescriptor);
-    KotlinTypeReference returnType =
-        KotlinTypeReference.createFromDescriptor(returnTypeDescriptor, definitionSupplier);
+    DexType returnType = referenceTypeFromDescriptor(returnTypeDescriptor, definitionSupplier);
     String[] descriptors = DescriptorUtils.getArgumentTypeDescriptors(kotlinDescriptor);
     if (descriptors.length == 0) {
       return new KotlinJvmMethodSignatureInfo(
           methodSignature.getName(), returnType, EMPTY_PARAMETERS_LIST);
     }
-    ImmutableList.Builder<KotlinTypeReference> parameters = ImmutableList.builder();
+    ImmutableList.Builder<DexType> parameters = ImmutableList.builder();
     for (String descriptor : descriptors) {
-      parameters.add(KotlinTypeReference.createFromDescriptor(descriptor, definitionSupplier));
+      parameters.add(referenceTypeFromDescriptor(descriptor, definitionSupplier));
     }
     return new KotlinJvmMethodSignatureInfo(
         methodSignature.getName(), returnType, parameters.build());
@@ -70,10 +59,6 @@
 
   public JvmMethodSignature rewrite(
       DexEncodedMethod method, AppView<AppInfoWithLiveness> appView, NamingLens namingLens) {
-    if (invalidDescriptor != null) {
-      return new JvmMethodSignature(name, invalidDescriptor);
-    }
-    assert returnType != null;
     String finalName = name;
     if (method != null) {
       String methodName = method.method.name.toString();
@@ -85,28 +70,11 @@
     StringBuilder descBuilder = new StringBuilder();
     descBuilder.append("(");
     String defValue = appView.dexItemFactory().objectType.toDescriptorString();
-    for (KotlinTypeReference parameter : parameters) {
-      descBuilder.append(parameter.toRenamedDescriptorOrDefault(appView, namingLens, defValue));
+    for (DexType parameter : parameters) {
+      descBuilder.append(toRenamedDescriptorOrDefault(parameter, appView, namingLens, defValue));
     }
     descBuilder.append(")");
-    descBuilder.append(returnType.toRenamedDescriptorOrDefault(appView, namingLens, defValue));
+    descBuilder.append(toRenamedDescriptorOrDefault(returnType, appView, namingLens, defValue));
     return new JvmMethodSignature(finalName, descBuilder.toString());
   }
-
-  @Override
-  public String toString() {
-    if (invalidDescriptor != null) {
-      return name + "(" + invalidDescriptor + ")";
-    }
-    assert returnType != null;
-    StringBuilder descBuilder = new StringBuilder();
-    descBuilder.append(name);
-    descBuilder.append("(");
-    for (KotlinTypeReference parameter : parameters) {
-      descBuilder.append(parameter.toString());
-    }
-    descBuilder.append(")");
-    descBuilder.append(returnType.toString());
-    return descBuilder.toString();
-  }
 }
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinLambdaInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinLambdaInfo.java
index d2c3c67..d25f105 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinLambdaInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinLambdaInfo.java
@@ -14,6 +14,7 @@
 import com.android.tools.r8.shaking.AppInfoWithLiveness;
 import com.android.tools.r8.utils.Reporter;
 import kotlinx.metadata.KmLambda;
+import kotlinx.metadata.KmLambdaVisitor;
 import kotlinx.metadata.jvm.JvmExtensionsKt;
 import kotlinx.metadata.jvm.JvmMethodSignature;
 
@@ -21,11 +22,9 @@
 public class KotlinLambdaInfo {
 
   private final KotlinFunctionInfo function;
-  private final boolean hasBacking;
 
-  private KotlinLambdaInfo(KotlinFunctionInfo function, boolean hasBacking) {
+  private KotlinLambdaInfo(KotlinFunctionInfo function) {
     this.function = function;
-    this.hasBacking = hasBacking;
   }
 
   static KotlinLambdaInfo create(
@@ -37,18 +36,22 @@
       assert false;
       return null;
     }
-    KotlinFunctionInfo kotlinFunctionInfo =
-        KotlinFunctionInfo.create(lambda.function, definitionSupplier, reporter);
     JvmMethodSignature signature = JvmExtensionsKt.getSignature(lambda.function);
-    if (signature != null) {
-      for (DexEncodedMethod method : clazz.methods()) {
-        if (toJvmMethodSignature(method.method).asString().equals(signature.asString())) {
-          method.setKotlinMemberInfo(kotlinFunctionInfo);
-          return new KotlinLambdaInfo(kotlinFunctionInfo, true);
-        }
+    if (signature == null) {
+      assert false;
+      return null;
+    }
+    for (DexEncodedMethod method : clazz.methods()) {
+      if (toJvmMethodSignature(method.method).asString().equals(signature.asString())) {
+        KotlinFunctionInfo kotlinFunctionInfo =
+            KotlinFunctionInfo.create(lambda.function, definitionSupplier, reporter);
+        method.setKotlinMemberInfo(kotlinFunctionInfo);
+        return new KotlinLambdaInfo(kotlinFunctionInfo);
       }
     }
-    return new KotlinLambdaInfo(kotlinFunctionInfo, false);
+    // TODO(b/155536535): Resolve this assert for NestTreeShakeJarVerificationTest.
+    // assert false;
+    return null;
   }
 
   boolean rewrite(
@@ -56,26 +59,13 @@
       DexClass clazz,
       AppView<AppInfoWithLiveness> appView,
       NamingLens namingLens) {
-    if (!hasBacking) {
-      function.rewrite(visitorProvider.get()::visitFunction, null, appView, namingLens);
-      return true;
-    }
-    DexEncodedMethod backing = null;
     for (DexEncodedMethod method : clazz.methods()) {
       if (method.getKotlinMemberInfo() == function) {
-        backing = method;
-        break;
+        KmLambdaVisitor kmLambdaVisitor = visitorProvider.get();
+        function.rewrite(kmLambdaVisitor::visitFunction, method, appView, namingLens);
+        return true;
       }
     }
-    if (backing == null) {
-      appView
-          .options()
-          .reporter
-          .info(
-              KotlinMetadataDiagnostic.lambdaBackingNotFound(clazz.type, function.getSignature()));
-      return false;
-    }
-    function.rewrite(visitorProvider.get()::visitFunction, backing, appView, namingLens);
-    return true;
+    return false;
   }
 }
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataDiagnostic.java b/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataDiagnostic.java
index 3415e13..83947d7 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataDiagnostic.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataDiagnostic.java
@@ -73,18 +73,4 @@
             + StringUtils.LINE_SEPARATOR
             + StringUtils.stacktraceAsString(t));
   }
-
-  static KotlinMetadataDiagnostic lambdaBackingNotFound(
-      DexType type, KotlinJvmMethodSignatureInfo signatureInfo) {
-    return new KotlinMetadataDiagnostic(
-        Origin.unknown(),
-        Position.UNKNOWN,
-        "The lambda function "
-            + signatureInfo.toString()
-            + " could no longer be found in "
-            + type.toSourceString()
-            + " . The method is most likely pruned and would require a specific keep rule to keep"
-            + " alive. As a result, the metadata information regarding the lambda structure has"
-            + " been discarded.");
-  }
 }
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataUtils.java b/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataUtils.java
index a8d0ed7..1f21451 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataUtils.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataUtils.java
@@ -8,9 +8,11 @@
 import com.android.tools.r8.errors.Unreachable;
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexClass;
+import com.android.tools.r8.graph.DexDefinitionSupplier;
 import com.android.tools.r8.graph.DexField;
 import com.android.tools.r8.graph.DexItemFactory;
 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.naming.NamingLens;
 import com.android.tools.r8.shaking.AppInfoWithLiveness;
@@ -135,6 +137,41 @@
     }
   }
 
+  static String toRenamedDescriptorOrDefault(
+      DexType type,
+      AppView<AppInfoWithLiveness> appView,
+      NamingLens namingLens,
+      String defaultValue) {
+    if (appView.appInfo().wasPruned(type)) {
+      return defaultValue;
+    }
+    DexString descriptor = namingLens.lookupDescriptor(type);
+    if (descriptor != null) {
+      return descriptor.toString();
+    }
+    return defaultValue;
+  }
+
+  static String kotlinNameFromDescriptor(DexString descriptor) {
+    return DescriptorUtils.getBinaryNameFromDescriptor(descriptor.toString());
+  }
+
+  static DexType referenceTypeFromBinaryName(
+      String binaryName, DexDefinitionSupplier definitionSupplier) {
+    return referenceTypeFromDescriptor(
+        DescriptorUtils.getDescriptorFromClassBinaryName(binaryName), definitionSupplier);
+  }
+
+  static DexType referenceTypeFromDescriptor(
+      String descriptor, DexDefinitionSupplier definitionSupplier) {
+    DexType type = definitionSupplier.dexItemFactory().createType(descriptor);
+    // Lookup the definition, ignoring the result. This populates the sets in the Enqueuer.
+    if (type.isClassType()) {
+      definitionSupplier.definitionFor(type);
+    }
+    return type;
+  }
+
   public static boolean mayProcessKotlinMetadata(AppView<?> appView) {
     // This can run before we have determined the pinned items, because we may need to load the
     // stack-map table on input. This is therefore a conservative guess on kotlin.Metadata is kept.
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinTypeReference.java b/src/main/java/com/android/tools/r8/kotlin/KotlinTypeReference.java
deleted file mode 100644
index 212cecc..0000000
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinTypeReference.java
+++ /dev/null
@@ -1,99 +0,0 @@
-// Copyright (c) 2020, the R8 project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-package com.android.tools.r8.kotlin;
-
-import com.android.tools.r8.graph.AppView;
-import com.android.tools.r8.graph.DexDefinitionSupplier;
-import com.android.tools.r8.graph.DexString;
-import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.naming.NamingLens;
-import com.android.tools.r8.shaking.AppInfoWithLiveness;
-import com.android.tools.r8.utils.DescriptorUtils;
-
-/**
- * To account for invalid type references in kotlin metadata, the class KotlinTypeReference will
- * either hold a DexType reference, or a String, with the original name reference, which is not a
- * valid jvm descriptor/name. The values will be disjoint.
- */
-class KotlinTypeReference {
-
-  private final DexType known;
-  private final String unknown;
-
-  private KotlinTypeReference(DexType known) {
-    this.known = known;
-    this.unknown = null;
-    assert known != null;
-  }
-
-  private KotlinTypeReference(String unknown) {
-    this.known = null;
-    this.unknown = unknown;
-    assert unknown != null;
-  }
-
-  static KotlinTypeReference createFromBinaryName(
-      String binaryName, DexDefinitionSupplier definitionSupplier) {
-    if (DescriptorUtils.isValidBinaryName(binaryName)) {
-      return createFromDescriptor(
-          DescriptorUtils.getDescriptorFromClassBinaryName(binaryName), definitionSupplier);
-    }
-    return new KotlinTypeReference(binaryName);
-  }
-
-  static KotlinTypeReference createFromDescriptor(
-      String descriptor, DexDefinitionSupplier definitionSupplier) {
-    if (DescriptorUtils.isDescriptor(descriptor)) {
-      DexType type = definitionSupplier.dexItemFactory().createType(descriptor);
-      // Lookup the definition, ignoring the result. This populates the sets in the Enqueuer.
-      if (type.isClassType()) {
-        definitionSupplier.definitionFor(type);
-      }
-      return new KotlinTypeReference(type);
-    }
-    return new KotlinTypeReference(descriptor);
-  }
-
-  String toRenamedDescriptorOrDefault(
-      AppView<AppInfoWithLiveness> appView, NamingLens namingLens, String defaultValue) {
-    if (unknown != null) {
-      return unknown;
-    }
-    assert known != null;
-    if (!known.isClassType()) {
-      return known.descriptor.toString();
-    }
-    if (!appView.appInfo().isNonProgramTypeOrLiveProgramType(known)) {
-      return defaultValue;
-    }
-    DexString descriptor = namingLens.lookupDescriptor(known);
-    if (descriptor != null) {
-      return descriptor.toString();
-    }
-    return defaultValue;
-  }
-
-  String toRenamedBinaryNameOrDefault(
-      AppView<AppInfoWithLiveness> appView, NamingLens namingLens, String defaultValue) {
-    if (unknown != null) {
-      // Unknown values are always on the input form, so we can just return it.
-      return unknown;
-    }
-    String descriptor = toRenamedDescriptorOrDefault(appView, namingLens, defaultValue);
-    if (descriptor == null) {
-      return null;
-    }
-    if (descriptor.equals(defaultValue)) {
-      // We assume that the default value passed in is already a binary name.
-      return descriptor;
-    }
-    return DescriptorUtils.getBinaryNameFromDescriptor(descriptor);
-  }
-
-  @Override
-  public String toString() {
-    return known != null ? known.descriptor.toString() : unknown;
-  }
-}
diff --git a/src/main/java/com/android/tools/r8/utils/DescriptorUtils.java b/src/main/java/com/android/tools/r8/utils/DescriptorUtils.java
index 2d78c0d..196091e 100644
--- a/src/main/java/com/android/tools/r8/utils/DescriptorUtils.java
+++ b/src/main/java/com/android/tools/r8/utils/DescriptorUtils.java
@@ -369,6 +369,13 @@
     return 'L' + className.replace(JAVA_PACKAGE_SEPARATOR, INNER_CLASS_SEPARATOR) + ';';
   }
 
+  // TODO(b/151195430): Remove once a new version of kotlinx-metadata is released.
+  // Kotlin @Metadata deserialization has plain "kotlin", which will be relocated in r8lib.
+  // See b/70169921#comment25 for more details.
+  private static String backwardRelocatedName(String name) {
+    return name.replace("com/android/tools/r8/jetbrains/", "");
+  }
+
   /**
    * Get unqualified class name from its binary name.
    *
@@ -505,11 +512,6 @@
     return 'L' + descriptor + ';';
   }
 
-  public static boolean isValidBinaryName(String binaryName) {
-    return isValidJavaType(
-        binaryName.replace(DESCRIPTOR_PACKAGE_SEPARATOR, JAVA_PACKAGE_SEPARATOR));
-  }
-
   public static class ModuleAndDescriptor {
     private final String module;
     private final String descriptor;
diff --git a/src/test/java/com/android/tools/r8/kotlin/coroutines/KotlinxCoroutinesTestRunner.java b/src/test/java/com/android/tools/r8/kotlin/coroutines/KotlinxCoroutinesTestRunner.java
index afe3166..ba63861 100644
--- a/src/test/java/com/android/tools/r8/kotlin/coroutines/KotlinxCoroutinesTestRunner.java
+++ b/src/test/java/com/android/tools/r8/kotlin/coroutines/KotlinxCoroutinesTestRunner.java
@@ -5,10 +5,10 @@
 package com.android.tools.r8.kotlin.coroutines;
 
 import static com.android.tools.r8.KotlinCompilerTool.KOTLINC;
-import static org.hamcrest.CoreMatchers.containsString;
-import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertThrows;
 
+import com.android.tools.r8.CompilationFailedException;
 import com.android.tools.r8.KotlinTestBase;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.ToolHelper;
@@ -79,35 +79,24 @@
   }
 
   @Test
-  public void runKotlinxCoroutinesNewTests_r8() throws Exception {
-    Path baseLib =
-        testForR8(parameters.getBackend())
-            .addProgramFiles(BASE_LIBRARY)
-            .addKeepAllClassesRule()
-            .addKeepAllAttributes()
-            // The BASE_LIBRARY contains proguard rules that do not match.
-            .allowUnusedProguardConfigurationRules()
-            .addKeepRules(
-                "-dontwarn reactor.blockhound.integration.BlockHoundIntegration",
-                "-dontwarn org.junit.runners.model.Statement",
-                "-dontwarn org.junit.rules.TestRule")
-            .compile()
-            .writeToZip();
-    ProcessResult processResult =
-        kotlinc(KOTLINC, targetVersion)
-            .addArguments(
-                "-Xuse-experimental=kotlinx.coroutines.InternalCoroutinesApi",
-                "-Xuse-experimental=kotlinx.coroutines.ObsoleteCoroutinesApi",
-                "-Xuse-experimental=kotlinx.coroutines.ExperimentalCoroutinesApi")
-            .addClasspathFiles(DEPENDENCIES)
-            .addClasspathFiles(baseLib)
-            .addSourceFiles(TEST_SOURCES)
-            .setOutputPath(temp.newFolder().toPath())
-            .compileRaw();
-    assertEquals(1, processResult.exitCode);
-    assertThat(
-        processResult.stderr,
-        containsString("Couldn't inline method call 'CoroutineExceptionHandler'"));
+  public void runKotlinxCoroutinesNewTests_r8() {
+    // TODO(b/157023682): This should be able to compile.
+    assertThrows(
+        CompilationFailedException.class,
+        () -> {
+          testForR8(parameters.getBackend())
+              .addProgramFiles(BASE_LIBRARY)
+              .addKeepAllClassesRule()
+              .addKeepAllAttributes()
+              // The BASE_LIBRARY contains proguard rules that do not match.
+              .allowUnusedProguardConfigurationRules()
+              .allowDiagnosticInfoMessages()
+              .addKeepRules(
+                  "-dontwarn reactor.blockhound.integration.BlockHoundIntegration",
+                  "-dontwarn org.junit.runners.model.Statement",
+                  "-dontwarn org.junit.rules.TestRule")
+              .compile();
+        });
   }
 
   private void runTestsInJar(Path testJar, Path deps) throws Exception {