Check for missing classes when repackaging class

Bug: 196406764
Change-Id: I0a641c568de090445da6188cc5c3ea37e72793a5
diff --git a/src/main/java/com/android/tools/r8/repackaging/Repackaging.java b/src/main/java/com/android/tools/r8/repackaging/Repackaging.java
index 188e749..6a2c76d 100644
--- a/src/main/java/com/android/tools/r8/repackaging/Repackaging.java
+++ b/src/main/java/com/android/tools/r8/repackaging/Repackaging.java
@@ -320,12 +320,12 @@
 
   public static class DefaultRepackagingConfiguration implements RepackagingConfiguration {
 
-    private final AppView<?> appView;
+    private final AppView<AppInfoWithLiveness> appView;
     private final DexItemFactory dexItemFactory;
     private final ProguardConfiguration proguardConfiguration;
     private final MinificationPackageNamingStrategy packageMinificationStrategy;
 
-    public DefaultRepackagingConfiguration(AppView<?> appView) {
+    public DefaultRepackagingConfiguration(AppView<AppInfoWithLiveness> appView) {
       this.appView = appView;
       this.dexItemFactory = appView.dexItemFactory();
       this.proguardConfiguration = appView.options().getProguardConfiguration();
@@ -427,17 +427,19 @@
       }
       // Ensure that the generated name is unique.
       DexType finalRepackagedDexType = repackagedDexType;
-      for (int i = 1; isRepackageTypeUsed(finalRepackagedDexType, mappings, appView); i++) {
+      for (int i = 1; isRepackageTypeUsed(finalRepackagedDexType, mappings); i++) {
         finalRepackagedDexType = repackagedDexType.addSuffix(i + "", dexItemFactory);
       }
       return finalRepackagedDexType;
     }
-  }
 
-  private static boolean isRepackageTypeUsed(
-      DexType type, BiMap<DexType, DexType> mappings, AppView<?> appView) {
-    return mappings.inverse().containsKey(type)
-        || (appView.hasLiveness() && appView.withLiveness().appInfo().wasPruned(type));
+    private boolean isRepackageTypeUsed(DexType type, BiMap<DexType, DexType> mappings) {
+      if (mappings.inverse().containsKey(type)) {
+        return true;
+      }
+      return appView.appInfo().wasPruned(type)
+          || appView.appInfo().getMissingClasses().contains(type);
+    }
   }
 
   /** Testing only. */
diff --git a/src/test/java/com/android/tools/r8/repackage/RepackageMissingTypeCollisionTest.java b/src/test/java/com/android/tools/r8/repackage/RepackageMissingTypeCollisionTest.java
index 4dc7f1f..2fc2cb0 100644
--- a/src/test/java/com/android/tools/r8/repackage/RepackageMissingTypeCollisionTest.java
+++ b/src/test/java/com/android/tools/r8/repackage/RepackageMissingTypeCollisionTest.java
@@ -5,8 +5,6 @@
 package com.android.tools.r8.repackage;
 
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndRenamed;
-import static org.hamcrest.CoreMatchers.containsString;
-import static org.hamcrest.CoreMatchers.not;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assume.assumeTrue;
@@ -66,10 +64,12 @@
             inspector -> {
               ClassSubject clazz = inspector.clazz(getNewATypeName());
               assertThat(clazz, isPresentAndRenamed());
-              assertEquals(getNewMissingTypeName(), clazz.getFinalName());
+              assertEquals(
+                  getRepackagePackage() + (isFlattenPackageHierarchy() ? ".a.b" : ".b"),
+                  clazz.getFinalName());
             })
         .run(parameters.getRuntime(), Main.class)
-        .assertFailureWithErrorThatMatches(not(containsString("NoClassDefFoundError")));
+        .assertFailureWithErrorThatThrows(NoClassDefFoundError.class);
   }
 
   @Test