Remove various D8 related usages of DexApplication.

Bug: 149167169
Change-Id: I94fa455f16b0868f3af1a46e14507142a3940ec7
diff --git a/src/main/java/com/android/tools/r8/D8.java b/src/main/java/com/android/tools/r8/D8.java
index 8def7ae..1deaf0f 100644
--- a/src/main/java/com/android/tools/r8/D8.java
+++ b/src/main/java/com/android/tools/r8/D8.java
@@ -17,6 +17,7 @@
 import com.android.tools.r8.graph.DexProgramClass;
 import com.android.tools.r8.graph.GraphLens;
 import com.android.tools.r8.graph.InitClassLens;
+import com.android.tools.r8.graph.LazyLoadedDexApplication;
 import com.android.tools.r8.graph.ProgramMethod;
 import com.android.tools.r8.graph.analysis.ClassInitializerAssertionEnablingAnalysis;
 import com.android.tools.r8.inspector.internal.InspectorImpl;
@@ -158,6 +159,16 @@
         });
   }
 
+  private static AppView<AppInfo> readApp(
+      AndroidApp inputApp, InternalOptions options, ExecutorService executor, Timing timing)
+      throws IOException {
+    PrefixRewritingMapper rewritePrefix =
+        options.desugaredLibraryConfiguration.createPrefixRewritingMapper(options);
+    LazyLoadedDexApplication app = new ApplicationReader(inputApp, options, timing).read(executor);
+    AppInfo appInfo = AppInfo.createInitialAppInfo(app);
+    return AppView.createForD8(appInfo, rewritePrefix);
+  }
+
   private static void run(AndroidApp inputApp, InternalOptions options, ExecutorService executor)
       throws IOException {
     Timing timing = Timing.create("D8", options);
@@ -165,10 +176,7 @@
       // Disable global optimizations.
       options.disableGlobalOptimizations();
 
-      DexApplication app = new ApplicationReader(inputApp, options, timing).read(executor);
-      PrefixRewritingMapper rewritePrefix =
-          options.desugaredLibraryConfiguration.createPrefixRewritingMapper(options);
-      AppInfo appInfo = AppInfo.createInitialAppInfo(app);
+      AppView<AppInfo> appView = readApp(inputApp, options, executor, timing);
 
       final CfgPrinter printer = options.printCfg ? new CfgPrinter() : null;
 
@@ -177,9 +185,9 @@
         // enabling code.
         ClassInitializerAssertionEnablingAnalysis analysis =
             new ClassInitializerAssertionEnablingAnalysis(
-                appInfo.dexItemFactory(), OptimizationFeedbackSimple.getInstance());
+                appView.dexItemFactory(), OptimizationFeedbackSimple.getInstance());
         ThreadUtils.processItems(
-            appInfo.classes(),
+            appView.appInfo().classes(),
             clazz -> {
               ProgramMethod classInitializer = clazz.getProgramClassInitializer();
               if (classInitializer != null) {
@@ -189,14 +197,11 @@
             executor);
       }
 
-      AppView<?> appView = AppView.createForD8(appInfo, rewritePrefix);
-
       if (options.testing.enableD8ResourcesPassThrough) {
         appView.setAppServices(AppServices.builder(appView).build());
       }
 
-      IRConverter converter = new IRConverter(appView, timing, printer);
-      app = converter.convert(app, executor);
+      new IRConverter(appView, timing, printer).convert(appView, executor);
 
       if (options.printCfg) {
         if (options.printCfgFile == null || options.printCfgFile.isEmpty()) {
@@ -223,7 +228,7 @@
       // if there were class file inputs.
       boolean hasClassResources = false;
       boolean hasDexResources = false;
-      for (DexProgramClass dexProgramClass : app.classes()) {
+      for (DexProgramClass dexProgramClass : appView.appInfo().classes()) {
         if (dexProgramClass.originatesFromClassResource()) {
           hasClassResources = true;
           if (hasDexResources) {
@@ -237,16 +242,16 @@
         }
       }
       Marker marker = options.getMarker(Tool.D8);
-      Set<Marker> markers = new HashSet<>(app.dexItemFactory.extractMarkers());
+      Set<Marker> markers = new HashSet<>(appView.dexItemFactory().extractMarkers());
       if (marker != null && hasClassResources) {
         markers.add(marker);
       }
       Marker.checkCompatibleDesugaredLibrary(markers, options.reporter);
 
-      InspectorImpl.runInspections(options.outputInspections, app);
+      InspectorImpl.runInspections(options.outputInspections, appView.appInfo().classes());
       if (options.isGeneratingClassFiles()) {
         new CfApplicationWriter(
-                app,
+                appView.appInfo().app(),
                 appView,
                 options,
                 marker,
@@ -256,7 +261,6 @@
             .write(options.getClassFileConsumer());
       } else {
         NamingLens namingLens;
-        DexApplication finalApp = app;
         if (!hasDexResources || !hasClassResources || !appView.rewritePrefix.isRewriting()) {
           // All inputs are either dex or cf, or there is nothing to rewrite.
           namingLens =
@@ -271,11 +275,14 @@
           // desugared library only on cf inputs. We cannot easily rewrite part of the program
           // without iterating again the IR. We fall-back to writing one app with rewriting and
           // merging it with the other app in rewriteNonDexInputs.
-          finalApp = rewriteNonDexInputs(appView, inputApp, options, executor, timing, app);
+          DexApplication app =
+              rewriteNonDexInputs(
+                  appView, inputApp, options, executor, timing, appView.appInfo().app());
+          appView.setAppInfo(new AppInfo(app, appView.appInfo().getSyntheticItems().commit(app)));
           namingLens = NamingLens.getIdentityLens();
         }
         new ApplicationWriter(
-                finalApp,
+                appView.appInfo().app(),
                 appView,
                 options,
                 marker == null ? null : ImmutableList.copyOf(markers),
@@ -353,17 +360,12 @@
     return finalDexApp.build();
   }
 
-  static DexApplication optimize(
-      DexApplication application,
-      AppInfo appInfo,
-      InternalOptions options,
-      Timing timing,
-      ExecutorService executor)
+  static void optimize(
+      AppView<AppInfo> appView, InternalOptions options, Timing timing, ExecutorService executor)
       throws IOException, ExecutionException {
     final CfgPrinter printer = options.printCfg ? new CfgPrinter() : null;
 
-    IRConverter converter = new IRConverter(appInfo, timing, printer);
-    application = converter.convert(application, executor);
+    new IRConverter(appView, timing, printer).convert(appView, executor);
 
     if (options.printCfg) {
       if (options.printCfgFile == null || options.printCfgFile.isEmpty()) {
@@ -376,7 +378,6 @@
         }
       }
     }
-    return application;
   }
 
   static class ConvertedCfFiles implements DexIndexedConsumer, ProgramResourceProvider {
diff --git a/src/main/java/com/android/tools/r8/DexFileMergerHelper.java b/src/main/java/com/android/tools/r8/DexFileMergerHelper.java
index 8e6c389..49ab77b 100644
--- a/src/main/java/com/android/tools/r8/DexFileMergerHelper.java
+++ b/src/main/java/com/android/tools/r8/DexFileMergerHelper.java
@@ -10,6 +10,7 @@
 import com.android.tools.r8.dex.ApplicationWriter;
 import com.android.tools.r8.dex.Marker;
 import com.android.tools.r8.graph.AppInfo;
+import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexApplication;
 import com.android.tools.r8.graph.DexProgramClass;
 import com.android.tools.r8.graph.GraphLens;
@@ -90,15 +91,15 @@
                     null,
                     executor,
                     new DexFileMergerHelper(inputOrdering)::keepFirstProgramClassConflictResolver);
-        AppInfo appInfo = AppInfo.createInitialAppInfo(app);
-        app = D8.optimize(app, appInfo, options, timing, executor);
+        AppView<AppInfo> appView = AppView.createForD8(AppInfo.createInitialAppInfo(app));
+        D8.optimize(appView, options, timing, executor);
 
-        List<Marker> markers = app.dexItemFactory.extractMarkers();
+        List<Marker> markers = appView.dexItemFactory().extractMarkers();
 
         assert !options.hasMethodsFilter();
         ApplicationWriter writer =
             new ApplicationWriter(
-                app,
+                appView.appInfo().app(),
                 null,
                 options,
                 markers,
diff --git a/src/main/java/com/android/tools/r8/DexSplitterHelper.java b/src/main/java/com/android/tools/r8/DexSplitterHelper.java
index b7ece81..7203f8e 100644
--- a/src/main/java/com/android/tools/r8/DexSplitterHelper.java
+++ b/src/main/java/com/android/tools/r8/DexSplitterHelper.java
@@ -11,6 +11,7 @@
 import com.android.tools.r8.dex.ApplicationWriter;
 import com.android.tools.r8.dex.Marker;
 import com.android.tools.r8.graph.AppInfo;
+import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexApplication;
 import com.android.tools.r8.graph.DexProgramClass;
 import com.android.tools.r8.graph.GraphLens;
@@ -87,7 +88,8 @@
 
         // Run d8 optimize to ensure jumbo strings are handled.
         AppInfo appInfo = AppInfo.createInitialAppInfo(featureApp);
-        featureApp = D8.optimize(featureApp, appInfo, options, timing, executor);
+        AppView<AppInfo> appView = AppView.createForD8(appInfo);
+        D8.optimize(appView, options, timing, executor);
         // We create a specific consumer for each split.
         Path outputDir = Paths.get(output).resolve(entry.getKey());
         if (!Files.exists(outputDir)) {
@@ -97,7 +99,7 @@
 
         try {
           new ApplicationWriter(
-                  featureApp,
+                  appView.appInfo().app(),
                   null,
                   options,
                   markers,
diff --git a/src/main/java/com/android/tools/r8/L8.java b/src/main/java/com/android/tools/r8/L8.java
index 99a87d3..d9e4013 100644
--- a/src/main/java/com/android/tools/r8/L8.java
+++ b/src/main/java/com/android/tools/r8/L8.java
@@ -119,29 +119,19 @@
       // on it.
       options.enableLoadStoreOptimization = false;
 
-      LazyLoadedDexApplication lazyApp =
-          new ApplicationReader(inputApp, options, timing).read(executor);
-
-      PrefixRewritingMapper rewritePrefix =
-          options.desugaredLibraryConfiguration.createPrefixRewritingMapper(options);
-
-      DexApplication app = new L8TreePruner(options).prune(lazyApp, rewritePrefix);
-      AppInfo appInfo = AppInfo.createInitialAppInfo(app);
-
-      AppView<?> appView = AppView.createForL8(appInfo, rewritePrefix);
-      IRConverter converter = new IRConverter(appView, timing);
+      AppView<AppInfo> appView = readApp(inputApp, options, executor, timing);
 
       if (!options.testing.disableL8AnnotationRemoval) {
         AnnotationRemover.clearAnnotations(appView);
       }
-      app = converter.convert(app, executor);
-      assert appView.appInfo() == appInfo;
+
+      new IRConverter(appView, timing).convert(appView, executor);
 
       NamingLens namingLens = PrefixRewritingNamingLens.createPrefixRewritingNamingLens(appView);
-      new GenericSignatureRewriter(appView, namingLens).run(appInfo.classes(), executor);
+      new GenericSignatureRewriter(appView, namingLens).run(appView.appInfo().classes(), executor);
 
       new CfApplicationWriter(
-              app,
+              appView.appInfo().app(),
               appView,
               options,
               options.getMarker(Tool.L8),
@@ -161,6 +151,19 @@
     }
   }
 
+  private static AppView<AppInfo> readApp(
+      AndroidApp inputApp, InternalOptions options, ExecutorService executor, Timing timing)
+      throws IOException {
+    LazyLoadedDexApplication lazyApp =
+        new ApplicationReader(inputApp, options, timing).read(executor);
+
+    PrefixRewritingMapper rewritePrefix =
+        options.desugaredLibraryConfiguration.createPrefixRewritingMapper(options);
+
+    DexApplication app = new L8TreePruner(options).prune(lazyApp, rewritePrefix);
+    return AppView.createForL8(AppInfo.createInitialAppInfo(app), rewritePrefix);
+  }
+
   private static void run(String[] args) throws CompilationFailedException {
     L8Command command = L8Command.parse(args, CommandLineOrigin.INSTANCE).build();
     if (command.isPrintHelp()) {
diff --git a/src/main/java/com/android/tools/r8/R8.java b/src/main/java/com/android/tools/r8/R8.java
index 38e1556..e49bedf 100644
--- a/src/main/java/com/android/tools/r8/R8.java
+++ b/src/main/java/com/android/tools/r8/R8.java
@@ -209,7 +209,6 @@
 
   static void writeApplication(
       ExecutorService executorService,
-      DexApplication application,
       AppView<?> appView,
       GraphLens graphLens,
       InitClassLens initClassLens,
@@ -217,7 +216,7 @@
       InternalOptions options,
       ProguardMapSupplier proguardMapSupplier)
       throws ExecutionException {
-    InspectorImpl.runInspections(options.outputInspections, application);
+    InspectorImpl.runInspections(options.outputInspections, appView.appInfo().classes());
     try {
       Marker marker = options.getMarker(Tool.R8);
       assert marker != null;
@@ -227,11 +226,17 @@
       markers.remove(marker);
       if (options.isGeneratingClassFiles()) {
         new CfApplicationWriter(
-                application, appView, options, marker, graphLens, namingLens, proguardMapSupplier)
+                appView.appInfo().app(),
+                appView,
+                options,
+                marker,
+                graphLens,
+                namingLens,
+                proguardMapSupplier)
             .write(options.getClassFileConsumer());
       } else {
         new ApplicationWriter(
-                application,
+                appView.appInfo().app(),
                 appView,
                 options,
                 // Ensure that the marker for this compilation is the first in the list.
@@ -905,7 +910,6 @@
       // Generate the resulting application resources.
       writeApplication(
           executorService,
-          appView.appInfo().app(),
           appView,
           appView.graphLens(),
           appView.initClassLens(),
diff --git a/src/main/java/com/android/tools/r8/inspector/internal/InspectorImpl.java b/src/main/java/com/android/tools/r8/inspector/internal/InspectorImpl.java
index c3d8a64..72e322f 100644
--- a/src/main/java/com/android/tools/r8/inspector/internal/InspectorImpl.java
+++ b/src/main/java/com/android/tools/r8/inspector/internal/InspectorImpl.java
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.inspector.internal;
 
-import com.android.tools.r8.graph.DexApplication;
 import com.android.tools.r8.graph.DexProgramClass;
 import com.android.tools.r8.inspector.ClassInspector;
 import com.android.tools.r8.inspector.Inspector;
@@ -29,25 +28,25 @@
   }
 
   public static void runInspections(
-      List<Consumer<InspectorImpl>> inspections, DexApplication application) {
+      List<Consumer<InspectorImpl>> inspections, Collection<DexProgramClass> classes) {
     if (inspections == null || inspections.isEmpty()) {
       return;
     }
-    InspectorImpl inspector = new InspectorImpl(application);
+    InspectorImpl inspector = new InspectorImpl(classes);
     for (Consumer<InspectorImpl> inspection : inspections) {
       inspection.accept(inspector);
     }
   }
 
-  private final DexApplication application;
+  private final Collection<DexProgramClass> classes;
 
-  public InspectorImpl(DexApplication application) {
-    this.application = application;
+  public InspectorImpl(Collection<DexProgramClass> classes) {
+    this.classes = classes;
   }
 
   @Override
   public void forEachClass(Consumer<ClassInspector> inspection) {
-    for (DexProgramClass clazz : application.classes()) {
+    for (DexProgramClass clazz : classes) {
       inspection.accept(new ClassInspectorImpl(clazz));
     }
   }
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java b/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
index 61a2f18..b838429 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
@@ -470,12 +470,12 @@
     }
   }
 
-  public DexApplication convert(DexApplication application, ExecutorService executor)
+  public void convert(AppView<AppInfo> appView, ExecutorService executor)
       throws ExecutionException {
     removeLambdaDeserializationMethods();
     workaroundAbstractMethodOnNonAbstractClassVerificationBug(
         executor, OptimizationFeedbackIgnore.getInstance());
-
+    DexApplication application = appView.appInfo().app();
     timing.begin("IR conversion");
     ThreadUtils.processItems(application.classes(), this::convertMethods, executor);
 
@@ -496,7 +496,8 @@
     handleSynthesizedClassMapping(builder);
     timing.end();
 
-    return builder.build();
+    DexApplication app = builder.build();
+    appView.setAppInfo(new AppInfo(app, appView.appInfo().getSyntheticItems().commit(app)));
   }
 
   private void handleSynthesizedClassMapping(Builder<?> builder) {
diff --git a/src/test/java/com/android/tools/r8/ToolHelper.java b/src/test/java/com/android/tools/r8/ToolHelper.java
index 9b83a88fa2..7de9a9a 100644
--- a/src/test/java/com/android/tools/r8/ToolHelper.java
+++ b/src/test/java/com/android/tools/r8/ToolHelper.java
@@ -16,6 +16,7 @@
 import com.android.tools.r8.dex.ApplicationReader;
 import com.android.tools.r8.errors.Unimplemented;
 import com.android.tools.r8.errors.Unreachable;
+import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.AssemblyWriter;
 import com.android.tools.r8.graph.DexApplication;
 import com.android.tools.r8.graph.DexItemFactory;
@@ -2086,12 +2087,11 @@
     return builder;
   }
 
-  public static void writeApplication(DexApplication application, InternalOptions options)
+  public static void writeApplication(AppView<?> appView, InternalOptions options)
       throws ExecutionException {
     R8.writeApplication(
         Executors.newSingleThreadExecutor(),
-        application,
-        null,
+        appView,
         GraphLens.getIdentityLens(),
         InitClassLens.getDefault(),
         NamingLens.getIdentityLens(),
diff --git a/src/test/java/com/android/tools/r8/ir/IrInjectionTestBase.java b/src/test/java/com/android/tools/r8/ir/IrInjectionTestBase.java
index a031cf8..b351ca2 100644
--- a/src/test/java/com/android/tools/r8/ir/IrInjectionTestBase.java
+++ b/src/test/java/com/android/tools/r8/ir/IrInjectionTestBase.java
@@ -100,9 +100,10 @@
       return iterator;
     }
 
-    private AndroidApp writeDex(DexApplication application, InternalOptions options) {
+    private AndroidApp writeDex() {
       try {
-        ToolHelper.writeApplication(application, options);
+        InternalOptions options = appView.options();
+        ToolHelper.writeApplication(appView, options);
         options.signalFinishedToConsumers();
         return consumers.build();
       } catch (ExecutionException e) {
@@ -114,7 +115,7 @@
       Timing timing = Timing.empty();
       IRConverter converter = new IRConverter(appView, timing, null, MainDexClasses.NONE);
       converter.replaceCodeForTesting(method, code);
-      AndroidApp app = writeDex(application, appView.options());
+      AndroidApp app = writeDex();
       return runOnArtRaw(app, DEFAULT_MAIN_CLASS_NAME).stdout;
     }
   }