Repackage enclosingClass before current class to repackage

This also ensure that we only compute a new inner name if it was specified.

Bug: 196503304
Change-Id: I9151a39b008fc85c5ce242a48dbf7f7f95c0ac2c
diff --git a/src/main/java/com/android/tools/r8/graph/TreeFixerBase.java b/src/main/java/com/android/tools/r8/graph/TreeFixerBase.java
index d09c3f5..f3670f3 100644
--- a/src/main/java/com/android/tools/r8/graph/TreeFixerBase.java
+++ b/src/main/java/com/android/tools/r8/graph/TreeFixerBase.java
@@ -208,7 +208,10 @@
       // inner class attributes.
       boolean innerClassAttributeChanged =
           newInnerClassType != innerClassType || newOuterClassType != outerClassType;
-      if (innerClassAttributeChanged && innerClassType != null && outerClassType != null) {
+      if (innerClassAttributeChanged
+          && innerClassType != null
+          && outerClassType != null
+          && innerClassAttribute.getInnerName() != null) {
         String innerClassName =
             DescriptorUtils.getInnerClassName(
                 newOuterClassType.toDescriptorString(), newInnerClassType.toDescriptorString());
@@ -217,10 +220,8 @@
         } else {
           // If run without treeshaking and the outer type is missing we are not pruning the
           // relationship.
-          // TODO(b/196503304): Enable the below asserts when resolved.
-          assert !appView.options().isTreeShakingEnabled() || true;
-          // assert appView.appInfo().definitionForWithoutExistenceAssert(newOuterClassType) ==
-          // null;
+          assert !appView.options().isTreeShakingEnabled();
+          assert appView.appInfo().definitionForWithoutExistenceAssert(newOuterClassType) == null;
         }
       }
       newInnerClassAttributes.add(
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 6621857..5ba8b26 100644
--- a/src/main/java/com/android/tools/r8/repackaging/Repackaging.java
+++ b/src/main/java/com/android/tools/r8/repackaging/Repackaging.java
@@ -274,16 +274,25 @@
     }
 
     // Always repackage outer classes first, if any.
-    InnerClassAttribute innerClassAttribute = classToRepackage.getInnerClassAttributeForThisClass();
     DexProgramClass outerClass = null;
-    if (innerClassAttribute != null && innerClassAttribute.getOuter() != null) {
-      outerClass = asProgramClassOrNull(appView.definitionFor(innerClassAttribute.getOuter()));
-      if (outerClass != null) {
-        if (pkg.contains(outerClass)) {
-          processClass(outerClass, pkg, newPackageDescriptor, mappings);
-        } else {
-          outerClass = null;
-        }
+    if (classToRepackage.hasEnclosingMethodAttribute()) {
+      DexType enclosingClass = classToRepackage.getEnclosingMethodAttribute().getEnclosingClass();
+      if (enclosingClass != null) {
+        outerClass = asProgramClassOrNull(appView.definitionFor(enclosingClass));
+      }
+    }
+    if (outerClass == null) {
+      InnerClassAttribute innerClassAttribute =
+          classToRepackage.getInnerClassAttributeForThisClass();
+      if (innerClassAttribute != null && innerClassAttribute.getOuter() != null) {
+        outerClass = asProgramClassOrNull(appView.definitionFor(innerClassAttribute.getOuter()));
+      }
+    }
+    if (outerClass != null) {
+      if (pkg.contains(outerClass)) {
+        processClass(outerClass, pkg, newPackageDescriptor, mappings);
+      } else {
+        outerClass = null;
       }
     }
     mappings.put(