Unify finalization of app in D8

Change-Id: I177d04507dd59ea33548310e4b8c3758a7f1afdc
diff --git a/src/main/java/com/android/tools/r8/D8.java b/src/main/java/com/android/tools/r8/D8.java
index f80403a..f57e064 100644
--- a/src/main/java/com/android/tools/r8/D8.java
+++ b/src/main/java/com/android/tools/r8/D8.java
@@ -276,57 +276,52 @@
       namingLens = PrefixRewritingNamingLens.createPrefixRewritingNamingLens(appView, namingLens);
       namingLens = RecordRewritingNamingLens.createRecordRewritingNamingLens(appView, namingLens);
 
+      if (options.isGeneratingDex()
+          && hasDexResources
+          && hasClassResources
+          && appView.typeRewriter.isRewriting()) {
+        // There are both cf and dex inputs in the program, and rewriting is required for
+        // 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.
+        timing.begin("Rewrite non-dex inputs");
+        DexApplication app =
+            rewriteNonDexInputs(
+                appView, inputApp, options, executor, timing, appView.appInfo().app(), namingLens);
+        timing.end();
+        appView.setAppInfo(
+            new AppInfo(
+                appView.appInfo().getSyntheticItems().commit(app),
+                appView.appInfo().getMainDexInfo()));
+        namingLens = NamingLens.getIdentityLens();
+      } else if (options.isGeneratingDex() && hasDexResources) {
+        namingLens = NamingLens.getIdentityLens();
+      }
+
+      // Since tracing is not lens aware, this needs to be done prior to synthetic finalization
+      // which will construct a graph lens.
+      if (options.isGeneratingDex() && !options.mainDexKeepRules.isEmpty()) {
+        appView.dexItemFactory().clearTypeElementsCache();
+        MainDexInfo mainDexInfo =
+            new GenerateMainDexList(options)
+                .traceMainDex(
+                    executor, appView.appInfo().app(), appView.appInfo().getMainDexInfo());
+        appView.setAppInfo(appView.appInfo().rebuildWithMainDexInfo(mainDexInfo));
+      }
+
+      finalizeApplication(appView, executor);
+
+      new GenericSignatureRewriter(appView, namingLens)
+          .runForD8(appView.appInfo().classes(), executor);
+      new KotlinMetadataRewriter(appView, namingLens).runForD8(executor);
+
       if (options.isGeneratingClassFiles()) {
-        finalizeApplication(appView, executor);
         new CfApplicationWriter(appView, marker, namingLens)
             .write(options.getClassFileConsumer(), inputApp);
       } else {
-        if (!hasDexResources || !hasClassResources || !appView.typeRewriter.isRewriting()) {
-          // All inputs are either dex or cf, or there is nothing to rewrite.
-          namingLens = hasDexResources ? NamingLens.getIdentityLens() : namingLens;
-          new GenericSignatureRewriter(appView, namingLens)
-              .run(appView.appInfo().classes(), executor);
-          new KotlinMetadataRewriter(appView, namingLens).runForD8(executor);
-        } else {
-          // There are both cf and dex inputs in the program, and rewriting is required for
-          // 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.
-          timing.begin("Rewrite non-dex inputs");
-          DexApplication app =
-              rewriteNonDexInputs(
-                  appView,
-                  inputApp,
-                  options,
-                  executor,
-                  timing,
-                  appView.appInfo().app(),
-                  namingLens);
-          timing.end();
-          appView.setAppInfo(
-              new AppInfo(
-                  appView.appInfo().getSyntheticItems().commit(app),
-                  appView.appInfo().getMainDexInfo()));
-          namingLens = NamingLens.getIdentityLens();
-        }
-
-        // Since tracing is not lens aware, this needs to be done prior to synthetic finalization
-        // which will construct a graph lens.
-        if (!options.mainDexKeepRules.isEmpty()) {
-          appView.dexItemFactory().clearTypeElementsCache();
-          MainDexInfo mainDexInfo =
-              new GenerateMainDexList(options)
-                  .traceMainDex(
-                      executor, appView.appInfo().app(), appView.appInfo().getMainDexInfo());
-          appView.setAppInfo(appView.appInfo().rebuildWithMainDexInfo(mainDexInfo));
-        }
-
-        finalizeApplication(appView, executor);
-
         if (options.apiModelingOptions().enableStubbingOfClasses) {
           new ApiReferenceStubber(appView).run(executor);
         }
-
         new ApplicationWriter(
                 appView,
                 marker == null ? null : ImmutableList.copyOf(markers),
diff --git a/src/main/java/com/android/tools/r8/naming/signature/GenericSignatureRewriter.java b/src/main/java/com/android/tools/r8/naming/signature/GenericSignatureRewriter.java
index bc285b7..e50737d 100644
--- a/src/main/java/com/android/tools/r8/naming/signature/GenericSignatureRewriter.java
+++ b/src/main/java/com/android/tools/r8/naming/signature/GenericSignatureRewriter.java
@@ -38,6 +38,14 @@
     this.contextBuilder = contextBuilder;
   }
 
+  public void runForD8(Iterable<? extends DexProgramClass> classes, ExecutorService executorService)
+      throws ExecutionException {
+    if (namingLens.isIdentityLens()) {
+      return;
+    }
+    run(classes, executorService);
+  }
+
   public void run(Iterable<? extends DexProgramClass> classes, ExecutorService executorService)
       throws ExecutionException {
     // Rewrite signature annotations for applications that are minified or if we have liveness