Add application builder to rewrite utility.

This CL reverts bf04e3271e21463c4f8fad0555eb6da761c4f41f which
removed the application builder and instead passes it to the
application rewrite ensuring the synthetic class is added.

Change-Id: I9d258d37ff67f8cbc6c82b31e3ef3fefef031ea9
diff --git a/src/main/java/com/android/tools/r8/R8.java b/src/main/java/com/android/tools/r8/R8.java
index c006eb5..66588be 100644
--- a/src/main/java/com/android/tools/r8/R8.java
+++ b/src/main/java/com/android/tools/r8/R8.java
@@ -31,6 +31,7 @@
 import com.android.tools.r8.graph.DexReference;
 import com.android.tools.r8.graph.DexType;
 import com.android.tools.r8.graph.DirectMappedDexApplication;
+import com.android.tools.r8.graph.DirectMappedDexApplication.Builder;
 import com.android.tools.r8.graph.EnumValueInfoMapCollection;
 import com.android.tools.r8.graph.GraphLens;
 import com.android.tools.r8.graph.GraphLens.NestedGraphLens;
@@ -487,8 +488,11 @@
       if (options.shouldDesugarNests()) {
         timing.begin("NestBasedAccessDesugaring");
         R8NestBasedAccessDesugaring analyzer = new R8NestBasedAccessDesugaring(appViewWithLiveness);
-        NestedPrivateMethodLens lens = analyzer.run(executorService);
-        appView.rewriteWithLens(lens);
+        Builder appBuilder = getDirectApp(appView).builder();
+        NestedPrivateMethodLens lens = analyzer.run(executorService, appBuilder);
+        if (lens != null) {
+          appView.rewriteWithLensAndApplication(lens, appBuilder.build());
+        }
         timing.end();
       } else {
         timing.begin("NestReduction");
diff --git a/src/main/java/com/android/tools/r8/graph/AppView.java b/src/main/java/com/android/tools/r8/graph/AppView.java
index 3bacf89..6431d85 100644
--- a/src/main/java/com/android/tools/r8/graph/AppView.java
+++ b/src/main/java/com/android/tools/r8/graph/AppView.java
@@ -470,16 +470,24 @@
   }
 
   public void rewriteWithLens(NestedGraphLens lens) {
-    rewriteWithLens(lens, withLiveness());
+    if (lens != null) {
+      rewriteWithLens(lens, appInfo().app().asDirect(), withLiveness());
+    }
   }
 
-  private static void rewriteWithLens(NestedGraphLens lens, AppView<AppInfoWithLiveness> appView) {
-    if (lens == null) {
-      return;
-    }
+  public void rewriteWithLensAndApplication(
+      NestedGraphLens lens, DirectMappedDexApplication application) {
+    assert lens != null;
+    assert application != null;
+    rewriteWithLens(lens, application, withLiveness());
+  }
+
+  private static void rewriteWithLens(
+      NestedGraphLens lens,
+      DirectMappedDexApplication application,
+      AppView<AppInfoWithLiveness> appView) {
     boolean changed = appView.setGraphLens(lens);
     assert changed;
-    DirectMappedDexApplication application = appView.appInfo().app().asDirect();
     assert application.verifyWithLens(lens);
     appView.setAppInfo(appView.appInfo().rewrittenWithLens(application, lens));
   }
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/NestBasedAccessDesugaring.java b/src/main/java/com/android/tools/r8/ir/desugar/NestBasedAccessDesugaring.java
index c7f6f2c..42e3ec7 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/NestBasedAccessDesugaring.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/NestBasedAccessDesugaring.java
@@ -194,16 +194,10 @@
         DexProgramClass::checksumFromType);
   }
 
-  void synthesizeNestConstructor() {
-    synthesizeNestConstructor(null);
-  }
-
   void synthesizeNestConstructor(DexApplication.Builder<?> builder) {
     if (nestConstructorUsed) {
       appView.appInfo().addSynthesizedClass(nestConstructor);
-      if (builder != null) {
-        builder.addSynthesizedClass(nestConstructor, true);
-      }
+      builder.addSynthesizedClass(nestConstructor, true);
     }
   }
 
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/R8NestBasedAccessDesugaring.java b/src/main/java/com/android/tools/r8/ir/desugar/R8NestBasedAccessDesugaring.java
index d275f4a..e9ac116 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/R8NestBasedAccessDesugaring.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/R8NestBasedAccessDesugaring.java
@@ -5,6 +5,7 @@
 package com.android.tools.r8.ir.desugar;
 
 import com.android.tools.r8.graph.AppView;
+import com.android.tools.r8.graph.DexApplication;
 import com.android.tools.r8.graph.DexClass;
 import com.android.tools.r8.graph.DexMethod;
 import com.android.tools.r8.graph.DexProgramClass;
@@ -32,14 +33,16 @@
     super(appView);
   }
 
-  public NestedPrivateMethodLens run(ExecutorService executorService) throws ExecutionException {
+  public NestedPrivateMethodLens run(
+      ExecutorService executorService, DexApplication.Builder<?> appBuilder)
+      throws ExecutionException {
     assert !appView.options().canUseNestBasedAccess()
         || appView.options().testing.enableForceNestBasedAccessDesugaringForTest;
     computeAndProcessNestsConcurrently(executorService);
     NestedPrivateMethodLens.Builder lensBuilder = NestedPrivateMethodLens.builder();
     addDeferredBridgesAndMapMethods(lensBuilder);
     clearNestAttributes();
-    synthesizeNestConstructor();
+    synthesizeNestConstructor(appBuilder);
     return lensBuilder.build(appView, getNestConstructorType());
   }