Pass app view to main dex list builder.

Bug: 149167169
Change-Id: I31aa679b69c1751fa20e3a1df1b4707e88231019
diff --git a/src/main/java/com/android/tools/r8/GenerateMainDexList.java b/src/main/java/com/android/tools/r8/GenerateMainDexList.java
index 4b32cd3..243b37a 100644
--- a/src/main/java/com/android/tools/r8/GenerateMainDexList.java
+++ b/src/main/java/com/android/tools/r8/GenerateMainDexList.java
@@ -70,7 +70,7 @@
           EnqueuerFactory.createForMainDexTracing(appView, subtypingInfo, graphConsumer);
       Set<DexProgramClass> liveTypes = enqueuer.traceMainDex(mainDexRootSet, executor, timing);
       // LiveTypes is the result.
-      MainDexClasses mainDexClasses = new MainDexListBuilder(liveTypes, application).run();
+      MainDexClasses mainDexClasses = new MainDexListBuilder(liveTypes, appView).run();
 
       List<String> result =
           mainDexClasses.getClasses().stream()
diff --git a/src/main/java/com/android/tools/r8/R8.java b/src/main/java/com/android/tools/r8/R8.java
index d04ad46..6275d39 100644
--- a/src/main/java/com/android/tools/r8/R8.java
+++ b/src/main/java/com/android/tools/r8/R8.java
@@ -452,7 +452,7 @@
             EnqueuerFactory.createForMainDexTracing(appView, subtypingInfo)
                 .traceMainDex(mainDexRootSet, executorService, timing);
         // Calculate the automatic main dex list according to legacy multidex constraints.
-        mainDexClasses = new MainDexListBuilder(mainDexBaseClasses, getDirectApp(appView)).run();
+        mainDexClasses = new MainDexListBuilder(mainDexBaseClasses, appView).run();
         appView.appInfo().unsetObsolete();
       }
 
@@ -654,7 +654,7 @@
         Set<DexProgramClass> mainDexBaseClasses =
             enqueuer.traceMainDex(mainDexRootSet, executorService, timing);
         // Calculate the automatic main dex list according to legacy multidex constraints.
-        mainDexClasses = new MainDexListBuilder(mainDexBaseClasses, getDirectApp(appView)).run();
+        mainDexClasses = new MainDexListBuilder(mainDexBaseClasses, appView).run();
         final MainDexClasses finalMainDexClasses = mainDexClasses;
 
         processWhyAreYouKeepingAndCheckDiscarded(
@@ -1000,9 +1000,7 @@
     if (lens != null) {
       appView.setGraphLens(lens);
       appViewWithLiveness.setAppInfo(
-          appViewWithLiveness
-              .appInfo()
-              .rewrittenWithLens(appView.appInfo().app().asDirect(), lens));
+          appViewWithLiveness.appInfo().rewrittenWithLens(getDirectApp(appView), lens));
     }
     if (InternalOptions.assertionsEnabled()) {
       // Register the dead proto types. These are needed to verify that no new missing types are
diff --git a/src/main/java/com/android/tools/r8/shaking/MainDexListBuilder.java b/src/main/java/com/android/tools/r8/shaking/MainDexListBuilder.java
index fc34925..c122cd7 100644
--- a/src/main/java/com/android/tools/r8/shaking/MainDexListBuilder.java
+++ b/src/main/java/com/android/tools/r8/shaking/MainDexListBuilder.java
@@ -6,13 +6,13 @@
 import com.android.tools.r8.errors.CompilationError;
 import com.android.tools.r8.graph.AppInfo;
 import com.android.tools.r8.graph.AppInfoWithClassHierarchy;
+import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexAnnotation;
 import com.android.tools.r8.graph.DexClass;
 import com.android.tools.r8.graph.DexEncodedMethod;
 import com.android.tools.r8.graph.DexProgramClass;
 import com.android.tools.r8.graph.DexProto;
 import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.DirectMappedDexApplication;
 import com.android.tools.r8.utils.SetUtils;
 import java.util.IdentityHashMap;
 import java.util.Map;
@@ -28,9 +28,8 @@
 public class MainDexListBuilder {
 
   private final Set<DexType> roots;
-  private final AppInfoWithClassHierarchy appInfo;
+  private final AppView<? extends AppInfoWithClassHierarchy> appView;
   private final Map<DexType, Boolean> annotationTypeContainEnum;
-  private final DirectMappedDexApplication dexApplication;
   private final MainDexClasses.Builder mainDexClassesBuilder;
 
   public static void checkForAssumedLibraryTypes(AppInfo appInfo) {
@@ -48,17 +47,21 @@
 
   /**
    * @param roots Classes which code may be executed before secondary dex files loading.
-   * @param application the dex appplication.
+   * @param appView the dex appplication.
    */
-  public MainDexListBuilder(Set<DexProgramClass> roots, DirectMappedDexApplication application) {
-    this.dexApplication = application;
-    this.appInfo = new AppInfoWithClassHierarchy(dexApplication);
+  public MainDexListBuilder(
+      Set<DexProgramClass> roots, AppView<? extends AppInfoWithClassHierarchy> appView) {
+    this.appView = appView;
     // Only consider program classes for the root set.
     this.roots = SetUtils.mapIdentityHashSet(roots, DexProgramClass::getType);
-    mainDexClassesBuilder = MainDexClasses.builder(appInfo).addRoots(this.roots);
+    mainDexClassesBuilder = MainDexClasses.builder(appView.appInfo()).addRoots(this.roots);
     annotationTypeContainEnum = new IdentityHashMap<>();
   }
 
+  private AppInfoWithClassHierarchy appInfo() {
+    return appView.appInfo();
+  }
+
   public MainDexClasses run() {
     traceMainDexDirectDependencies();
     traceRuntimeAnnotationsWithEnumForMainDex();
@@ -66,7 +69,7 @@
   }
 
   private void traceRuntimeAnnotationsWithEnumForMainDex() {
-    for (DexProgramClass clazz : dexApplication.classes()) {
+    for (DexProgramClass clazz : appInfo().classes()) {
       DexType dexType = clazz.type;
       if (mainDexClassesBuilder.contains(dexType)) {
         continue;
@@ -91,7 +94,7 @@
   private boolean isAnnotationWithEnum(DexType dexType) {
     Boolean value = annotationTypeContainEnum.get(dexType);
     if (value == null) {
-      DexClass clazz = appInfo.definitionFor(dexType);
+      DexClass clazz = appView.definitionFor(dexType);
       if (clazz == null) {
         // Information is missing lets be conservative.
         value = true;
@@ -102,7 +105,7 @@
         for (DexEncodedMethod method : clazz.virtualMethods()) {
           DexProto proto = method.method.proto;
           if (proto.parameters.isEmpty()) {
-            DexType valueType = proto.returnType.toBaseType(appInfo.dexItemFactory());
+            DexType valueType = proto.returnType.toBaseType(appView.dexItemFactory());
             if (valueType.isClassType()) {
               if (isEnum(valueType)) {
                 value = true;
@@ -122,16 +125,15 @@
 
   private boolean isEnum(DexType valueType) {
     return valueType.isClassType()
-        && appInfo.isSubtype(valueType, appInfo.dexItemFactory().enumType);
+        && appInfo().isSubtype(valueType, appView.dexItemFactory().enumType);
   }
 
   private boolean isAnnotation(DexType valueType) {
-    return appInfo.isSubtype(valueType, appInfo.dexItemFactory().annotationType);
+    return appInfo().isSubtype(valueType, appView.dexItemFactory().annotationType);
   }
 
   private void traceMainDexDirectDependencies() {
-    new MainDexDirectReferenceTracer(appInfo, this::addDirectDependency)
-        .run(roots);
+    new MainDexDirectReferenceTracer(appInfo(), this::addDirectDependency).run(roots);
   }
 
   private void addAnnotationsWithEnum(DexProgramClass clazz) {
@@ -141,7 +143,7 @@
     for (DexEncodedMethod method : clazz.virtualMethods()) {
       DexProto proto = method.method.proto;
       if (proto.parameters.isEmpty()) {
-        DexType valueType = proto.returnType.toBaseType(appInfo.dexItemFactory());
+        DexType valueType = proto.returnType.toBaseType(appView.dexItemFactory());
         if (isEnum(valueType)) {
           addDirectDependency(valueType);
         }
@@ -156,13 +158,13 @@
 
   private void addDirectDependency(DexType type) {
     // Consider only component type of arrays
-    type = type.toBaseType(appInfo.dexItemFactory());
+    type = type.toBaseType(appView.dexItemFactory());
 
     if (!type.isClassType() || mainDexClassesBuilder.contains(type)) {
       return;
     }
 
-    DexClass clazz = appInfo.definitionFor(type);
+    DexClass clazz = appView.definitionFor(type);
     // No library classes in main-dex.
     if (clazz == null || clazz.isNotProgramClass()) {
       return;