Collect synthetic inputs in R8
Bug: 181846319
Change-Id: I212e70f339b1f7dd2f75ae509ec0ef517b7566fc
diff --git a/src/main/java/com/android/tools/r8/R8.java b/src/main/java/com/android/tools/r8/R8.java
index 546fad4..8a4c9cc 100644
--- a/src/main/java/com/android/tools/r8/R8.java
+++ b/src/main/java/com/android/tools/r8/R8.java
@@ -103,6 +103,7 @@
import com.android.tools.r8.shaking.VerticalClassMergerGraphLens;
import com.android.tools.r8.shaking.WhyAreYouKeepingConsumer;
import com.android.tools.r8.synthesis.SyntheticFinalization;
+import com.android.tools.r8.synthesis.SyntheticItems;
import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.AndroidApp;
import com.android.tools.r8.utils.CfgPrinter;
@@ -291,6 +292,7 @@
appView = AppView.createForR8(application, mainDexInfo);
appView.setAppServices(AppServices.builder(appView).build());
+ SyntheticItems.collectSyntheticInputs(appView);
}
// Check for potentially having pass-through of Cf-code for kotlin libraries.
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 7321cc0..1cd36de 100644
--- a/src/main/java/com/android/tools/r8/graph/AppView.java
+++ b/src/main/java/com/android/tools/r8/graph/AppView.java
@@ -558,6 +558,10 @@
return true;
}
+ public boolean hasClassHierarchy() {
+ return appInfo().hasClassHierarchy();
+ }
+
@SuppressWarnings("unchecked")
public AppView<AppInfoWithClassHierarchy> withClassHierarchy() {
return appInfo.hasClassHierarchy()
@@ -565,6 +569,12 @@
: null;
}
+ @SuppressWarnings("unchecked")
+ public AppView<AppInfo> withoutClassHierarchy() {
+ assert !hasClassHierarchy();
+ return (AppView<AppInfo>) this;
+ }
+
public boolean hasLiveness() {
return appInfo().hasLiveness();
}
diff --git a/src/main/java/com/android/tools/r8/synthesis/SyntheticItems.java b/src/main/java/com/android/tools/r8/synthesis/SyntheticItems.java
index d6c93aa..86bca3a 100644
--- a/src/main/java/com/android/tools/r8/synthesis/SyntheticItems.java
+++ b/src/main/java/com/android/tools/r8/synthesis/SyntheticItems.java
@@ -109,7 +109,7 @@
this.committed = committed;
}
- public static void collectSyntheticInputs(AppView<AppInfo> appView) {
+ public static void collectSyntheticInputs(AppView<?> appView) {
// Collecting synthetic items must be the very first task after application build.
SyntheticItems synthetics = appView.getSyntheticItems();
assert synthetics.nextSyntheticId == 0;
@@ -143,7 +143,15 @@
CommittedItems commit =
new CommittedItems(
synthetics.nextSyntheticId, appView.appInfo().app(), committed, ImmutableList.of());
- appView.setAppInfo(new AppInfo(commit, appView.appInfo().getMainDexInfo()));
+ if (appView.appInfo().hasClassHierarchy()) {
+ appView
+ .withClassHierarchy()
+ .setAppInfo(appView.appInfo().withClassHierarchy().rebuildWithClassHierarchy(commit));
+ } else {
+ appView
+ .withoutClassHierarchy()
+ .setAppInfo(new AppInfo(commit, appView.appInfo().getMainDexInfo()));
+ }
}
// Predicates and accessors.