Retain synthesized classes in new AppInfo.

Change-Id: I8dfd45347684c2828187f7158665c1c8a237f6c1
diff --git a/src/main/java/com/android/tools/r8/graph/AppInfo.java b/src/main/java/com/android/tools/r8/graph/AppInfo.java
index 69f90e4..543326a 100644
--- a/src/main/java/com/android/tools/r8/graph/AppInfo.java
+++ b/src/main/java/com/android/tools/r8/graph/AppInfo.java
@@ -41,6 +41,10 @@
     this.app = previous.app;
     this.dexItemFactory = app.dexItemFactory;
     this.definitions.putAll(previous.definitions);
+    copyMetadataFromPrevious(previous);
+  }
+
+  public void copyMetadataFromPrevious(AppInfo previous) {
     this.synthesizedClasses.putAll(previous.synthesizedClasses);
   }
 
diff --git a/src/main/java/com/android/tools/r8/shaking/AppInfoWithLiveness.java b/src/main/java/com/android/tools/r8/shaking/AppInfoWithLiveness.java
index 1a2b0e2..0658418 100644
--- a/src/main/java/com/android/tools/r8/shaking/AppInfoWithLiveness.java
+++ b/src/main/java/com/android/tools/r8/shaking/AppInfoWithLiveness.java
@@ -346,8 +346,8 @@
     assert Sets.intersection(instanceFieldWrites.keySet(), staticFieldWrites.keySet()).isEmpty();
   }
 
-  private AppInfoWithLiveness(AppInfoWithLiveness previous, DexApplication application) {
-    this(previous, application, null);
+  private AppInfoWithLiveness(AppInfoWithLiveness previous) {
+    this(previous, previous.app(), null);
   }
 
   private AppInfoWithLiveness(
@@ -398,6 +398,7 @@
         previous.switchMaps,
         previous.ordinalsMaps,
         previous.instantiatedLambdas);
+    copyMetadataFromPrevious(previous);
     assert removedClasses == null || assertNoItemRemoved(previous.pinnedItems, removedClasses);
     assert Sets.intersection(instanceFieldReads.keySet(), staticFieldReads.keySet()).isEmpty();
     assert Sets.intersection(instanceFieldWrites.keySet(), staticFieldWrites.keySet()).isEmpty();
@@ -586,7 +587,7 @@
     if (noLongerWrittenFields.isEmpty()) {
       return this;
     }
-    AppInfoWithLiveness result = new AppInfoWithLiveness(this, app());
+    AppInfoWithLiveness result = new AppInfoWithLiveness(this);
     Predicate<DexField> isFieldWritten = field -> !noLongerWrittenFields.contains(field);
     result.fieldsWritten = filter(fieldsWritten, isFieldWritten);
     result.staticFieldsWrittenOnlyInEnclosingStaticInitializer =