Replace some top-most app-info allocations with AppView.createForR8.
Bug: 149167169
Change-Id: I99f4a7fe259e8a298830fd8ab7e513637afaeb91
diff --git a/src/main/java/com/android/tools/r8/GenerateMainDexList.java b/src/main/java/com/android/tools/r8/GenerateMainDexList.java
index bacd375..fcda77d 100644
--- a/src/main/java/com/android/tools/r8/GenerateMainDexList.java
+++ b/src/main/java/com/android/tools/r8/GenerateMainDexList.java
@@ -49,8 +49,7 @@
try {
DirectMappedDexApplication application =
new ApplicationReader(app, options, timing).read(executor).toDirect();
- AppView<? extends AppInfoWithClassHierarchy> appView =
- AppView.createForR8(new AppInfoWithClassHierarchy(application));
+ AppView<? extends AppInfoWithClassHierarchy> appView = AppView.createForR8(application);
appView.setAppServices(AppServices.builder(appView).build());
MainDexListBuilder.checkForAssumedLibraryTypes(appView.appInfo());
diff --git a/src/main/java/com/android/tools/r8/PrintSeeds.java b/src/main/java/com/android/tools/r8/PrintSeeds.java
index 3f8b70e..a948df7 100644
--- a/src/main/java/com/android/tools/r8/PrintSeeds.java
+++ b/src/main/java/com/android/tools/r8/PrintSeeds.java
@@ -87,8 +87,7 @@
try {
DirectMappedDexApplication application =
new ApplicationReader(command.getInputApp(), options, timing).read(executor).toDirect();
- AppView<? extends AppInfoWithClassHierarchy> appView =
- AppView.createForR8(new AppInfoWithClassHierarchy(application));
+ AppView<AppInfoWithClassHierarchy> appView = AppView.createForR8(application);
appView.setAppServices(AppServices.builder(appView).build());
SubtypingInfo subtypingInfo = new SubtypingInfo(application.allClasses(), application);
RootSet rootSet =
diff --git a/src/main/java/com/android/tools/r8/R8.java b/src/main/java/com/android/tools/r8/R8.java
index 1f4c63a..26878af 100644
--- a/src/main/java/com/android/tools/r8/R8.java
+++ b/src/main/java/com/android/tools/r8/R8.java
@@ -285,8 +285,7 @@
// Now that the dex-application is fully loaded, close any internal archive providers.
inputApp.closeInternalArchiveProviders();
- AppView<AppInfoWithClassHierarchy> appView =
- AppView.createForR8(new AppInfoWithClassHierarchy(application));
+ AppView<AppInfoWithClassHierarchy> appView = AppView.createForR8(application);
appView.setAppServices(AppServices.builder(appView).build());
// Check for potentially having pass-through of Cf-code for kotlin libraries.
diff --git a/src/main/java/com/android/tools/r8/graph/AppInfoWithClassHierarchy.java b/src/main/java/com/android/tools/r8/graph/AppInfoWithClassHierarchy.java
index a0fd03b..481af1e 100644
--- a/src/main/java/com/android/tools/r8/graph/AppInfoWithClassHierarchy.java
+++ b/src/main/java/com/android/tools/r8/graph/AppInfoWithClassHierarchy.java
@@ -31,6 +31,7 @@
import java.util.Set;
import java.util.function.BiConsumer;
import java.util.function.BiFunction;
+import java.util.function.Function;
/* Specific subclass of AppInfo designed to support desugaring in D8. Desugaring requires a
* minimal amount of knowledge in the overall program, provided through classpath. Basic
@@ -57,6 +58,10 @@
return new AppInfoWithClassHierarchy(appInfo);
}
+ public AppInfoWithClassHierarchy rebuild(Function<DexApplication, DexApplication> fn) {
+ return new AppInfoWithClassHierarchy(fn.apply(app()));
+ }
+
@Override
public boolean hasClassHierarchy() {
assert checkIfObsolete();
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 aa5b5cd..0cac318 100644
--- a/src/main/java/com/android/tools/r8/graph/AppView.java
+++ b/src/main/java/com/android/tools/r8/graph/AppView.java
@@ -124,7 +124,8 @@
return new AppView<>(appInfo, WholeProgramOptimizations.OFF, mapper);
}
- public static <T extends AppInfo> AppView<T> createForR8(T appInfo) {
+ public static AppView<AppInfoWithClassHierarchy> createForR8(DexApplication application) {
+ AppInfoWithClassHierarchy appInfo = new AppInfoWithClassHierarchy(application);
return new AppView<>(
appInfo, WholeProgramOptimizations.ON, defaultPrefixRewritingMapper(appInfo));
}
diff --git a/src/main/java/com/android/tools/r8/graph/AssemblyWriter.java b/src/main/java/com/android/tools/r8/graph/AssemblyWriter.java
index d10c69f..f1ddad4 100644
--- a/src/main/java/com/android/tools/r8/graph/AssemblyWriter.java
+++ b/src/main/java/com/android/tools/r8/graph/AssemblyWriter.java
@@ -31,7 +31,7 @@
private final boolean writeAnnotations;
private final boolean writeIR;
private final boolean writeCode;
- private final AppInfoWithClassHierarchy appInfo;
+ private final AppInfo appInfo;
private final Kotlin kotlin;
private final Timing timing = new Timing("AssemblyWriter");
@@ -48,7 +48,7 @@
this.writeIR = writeIR;
this.writeCode = writeCode;
if (writeIR) {
- this.appInfo = new AppInfoWithClassHierarchy(application.toDirect());
+ this.appInfo = new AppInfo(application.toDirect());
if (options.programConsumer == null) {
// Use class-file backend, since the CF frontend for testing does not support desugaring of
// synchronized methods for the DEX backend (b/109789541).
diff --git a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
index d1455a7..6d4939f 100644
--- a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
+++ b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
@@ -2881,12 +2881,16 @@
}
// Now all additions are computed, the application is atomically extended with those additions.
- Builder appBuilder = appInfo.app().asDirect().builder();
- additions.amendApplication(appBuilder);
- DirectMappedDexApplication app = appBuilder.build();
- appInfo = new AppInfoWithClassHierarchy(app);
+ appInfo =
+ appInfo.rebuild(
+ app -> {
+ Builder appBuilder = app.asDirect().builder();
+ additions.amendApplication(appBuilder);
+ return appBuilder.build();
+ });
appView.setAppInfo(appInfo);
- subtypingInfo = new SubtypingInfo(app.allClasses(), app);
+ subtypingInfo =
+ new SubtypingInfo(appInfo.app().asDirect().allClasses(), appInfo.app().asDirect());
// Finally once all synthesized items "exist" it is now safe to continue tracing. The new work
// items are enqueued and the fixed point will continue once this subroutine returns.
diff --git a/src/test/java/com/android/tools/r8/R8UnreachableCodeTest.java b/src/test/java/com/android/tools/r8/R8UnreachableCodeTest.java
index e30b788..a022ecf 100644
--- a/src/test/java/com/android/tools/r8/R8UnreachableCodeTest.java
+++ b/src/test/java/com/android/tools/r8/R8UnreachableCodeTest.java
@@ -7,7 +7,6 @@
import static org.junit.Assert.assertEquals;
import com.android.tools.r8.dex.ApplicationReader;
-import com.android.tools.r8.graph.AppInfoWithClassHierarchy;
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexEncodedMethod;
import com.android.tools.r8.graph.DexProgramClass;
@@ -43,8 +42,7 @@
options.programConsumer = DexIndexedConsumer.emptyConsumer();
DirectMappedDexApplication application =
new ApplicationReader(input, options, timing).read(executorService).toDirect();
- IRConverter converter =
- new IRConverter(AppView.createForR8(new AppInfoWithClassHierarchy(application)), null);
+ IRConverter converter = new IRConverter(AppView.createForR8(application), null);
converter.optimize();
DexProgramClass clazz = application.classes().iterator().next();
assertEquals(4, clazz.getMethodCollection().numberOfDirectMethods());
diff --git a/src/test/java/com/android/tools/r8/TestBase.java b/src/test/java/com/android/tools/r8/TestBase.java
index b764451..3b2d394 100644
--- a/src/test/java/com/android/tools/r8/TestBase.java
+++ b/src/test/java/com/android/tools/r8/TestBase.java
@@ -613,8 +613,7 @@
DexItemFactory dexItemFactory = new DexItemFactory();
InternalOptions options = new InternalOptions(keepConfig.apply(dexItemFactory), new Reporter());
DexApplication dexApplication = readApplicationForDexOutput(app, options);
- AppView<AppInfoWithClassHierarchy> appView =
- AppView.createForR8(new AppInfoWithClassHierarchy(dexApplication.toDirect()));
+ AppView<AppInfoWithClassHierarchy> appView = AppView.createForR8(dexApplication.toDirect());
appView.setAppServices(AppServices.builder(appView).build());
return appView;
}
diff --git a/src/test/java/com/android/tools/r8/graph/DexTypeTest.java b/src/test/java/com/android/tools/r8/graph/DexTypeTest.java
index 014249b..6b2d73e 100644
--- a/src/test/java/com/android/tools/r8/graph/DexTypeTest.java
+++ b/src/test/java/com/android/tools/r8/graph/DexTypeTest.java
@@ -35,7 +35,7 @@
.read()
.toDirect();
factory = options.itemFactory;
- appInfo = new AppInfoWithClassHierarchy(application);
+ appInfo = AppView.createForR8(application).appInfo();
}
@Test
diff --git a/src/test/java/com/android/tools/r8/internal/R8GMSCoreLookupTest.java b/src/test/java/com/android/tools/r8/internal/R8GMSCoreLookupTest.java
index ca35303..d1bc124 100644
--- a/src/test/java/com/android/tools/r8/internal/R8GMSCoreLookupTest.java
+++ b/src/test/java/com/android/tools/r8/internal/R8GMSCoreLookupTest.java
@@ -59,8 +59,7 @@
new ApplicationReader(app, new InternalOptions(), timing)
.read(proguardMap, executorService)
.toDirect();
- InternalOptions options = new InternalOptions();
- appView = AppView.createForR8(new AppInfoWithClassHierarchy(program));
+ appView = AppView.createForR8(program);
appView.setAppServices(AppServices.builder(appView).build());
subtypingInfo = new SubtypingInfo(program.allClasses(), program);
}
diff --git a/src/test/java/com/android/tools/r8/ir/InlineTest.java b/src/test/java/com/android/tools/r8/ir/InlineTest.java
index 2bd2803..1ca31a9 100644
--- a/src/test/java/com/android/tools/r8/ir/InlineTest.java
+++ b/src/test/java/com/android/tools/r8/ir/InlineTest.java
@@ -66,8 +66,7 @@
List<IRCode> additionalCode)
throws ExecutionException {
DirectMappedDexApplication directApp = application.asDirect();
- AppView<AppInfoWithClassHierarchy> appView =
- AppView.createForR8(new AppInfoWithClassHierarchy(directApp));
+ AppView<AppInfoWithClassHierarchy> appView = AppView.createForR8(directApp);
appView.setAppServices(AppServices.builder(appView).build());
ExecutorService executorService = ThreadUtils.getExecutorService(options);
SubtypingInfo subtypingInfo = new SubtypingInfo(directApp.allClasses(), directApp);
diff --git a/src/test/java/com/android/tools/r8/ir/analysis/fieldaccess/FieldBitAccessInfoTest.java b/src/test/java/com/android/tools/r8/ir/analysis/fieldaccess/FieldBitAccessInfoTest.java
index 86f4e3d..357fa0e 100644
--- a/src/test/java/com/android/tools/r8/ir/analysis/fieldaccess/FieldBitAccessInfoTest.java
+++ b/src/test/java/com/android/tools/r8/ir/analysis/fieldaccess/FieldBitAccessInfoTest.java
@@ -134,7 +134,7 @@
timing)
.read()
.toDirect();
- return AppView.createForR8(new AppInfoWithClassHierarchy(application));
+ return AppView.createForR8(application);
}
private DexEncodedField uniqueFieldByName(DexProgramClass clazz, String name) {
diff --git a/src/test/java/com/android/tools/r8/ir/analysis/type/TypeLatticeTest.java b/src/test/java/com/android/tools/r8/ir/analysis/type/TypeLatticeTest.java
index 06de00a..5cdd0ca 100644
--- a/src/test/java/com/android/tools/r8/ir/analysis/type/TypeLatticeTest.java
+++ b/src/test/java/com/android/tools/r8/ir/analysis/type/TypeLatticeTest.java
@@ -60,7 +60,7 @@
.read()
.toDirect();
factory = options.itemFactory;
- appView = AppView.createForR8(new AppInfoWithClassHierarchy(application));
+ appView = AppView.createForR8(application);
}
private TopTypeElement top() {
diff --git a/src/test/java/com/android/tools/r8/maindexlist/MainDexListTests.java b/src/test/java/com/android/tools/r8/maindexlist/MainDexListTests.java
index 984d813..e4e0b53 100644
--- a/src/test/java/com/android/tools/r8/maindexlist/MainDexListTests.java
+++ b/src/test/java/com/android/tools/r8/maindexlist/MainDexListTests.java
@@ -30,7 +30,6 @@
import com.android.tools.r8.errors.CompilationError;
import com.android.tools.r8.errors.DexFileOverflowDiagnostic;
import com.android.tools.r8.errors.Unreachable;
-import com.android.tools.r8.graph.AppInfo;
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.ClassAccessFlags;
import com.android.tools.r8.graph.Code;
@@ -808,8 +807,7 @@
options.minApiLevel = minApi;
options.intermediate = intermediate;
DexItemFactory factory = options.itemFactory;
- AppInfo appInfo = new AppInfo(DexApplication.builder(options, timing).build());
- AppView<?> appView = AppView.createForR8(appInfo);
+ AppView<?> appView = AppView.createForR8(DexApplication.builder(options, timing).build());
DexApplication.Builder<?> builder = DexApplication.builder(options, timing);
for (String clazz : classes) {
DexString desc = factory.createString(DescriptorUtils.javaTypeToDescriptor(clazz));
diff --git a/src/test/java/com/android/tools/r8/resolution/ArrayTargetLookupTest.java b/src/test/java/com/android/tools/r8/resolution/ArrayTargetLookupTest.java
index 4ad2bed..f13728a 100644
--- a/src/test/java/com/android/tools/r8/resolution/ArrayTargetLookupTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/ArrayTargetLookupTest.java
@@ -11,6 +11,7 @@
import com.android.tools.r8.ToolHelper;
import com.android.tools.r8.dex.ApplicationReader;
import com.android.tools.r8.graph.AppInfoWithClassHierarchy;
+import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexEncodedMethod;
import com.android.tools.r8.graph.DexItemFactory;
import com.android.tools.r8.graph.DexType;
@@ -19,8 +20,6 @@
import com.android.tools.r8.utils.DescriptorUtils;
import com.android.tools.r8.utils.InternalOptions;
import com.android.tools.r8.utils.Timing;
-import java.io.IOException;
-import java.util.concurrent.ExecutionException;
import org.junit.Test;
public class ArrayTargetLookupTest extends TestBase {
@@ -28,7 +27,7 @@
public static class Foo {}
@Test
- public void testArrays() throws IOException, ExecutionException {
+ public void testArrays() throws Exception {
Timing timing = Timing.empty();
InternalOptions options = new InternalOptions();
AndroidApp app =
@@ -38,7 +37,7 @@
.build();
DirectMappedDexApplication application =
new ApplicationReader(app, options, timing).read().toDirect();
- AppInfoWithClassHierarchy appInfo = new AppInfoWithClassHierarchy(application);
+ AppInfoWithClassHierarchy appInfo = AppView.createForR8(application).appInfo();
DexItemFactory factory = options.itemFactory;
DexType fooType =
factory.createType(DescriptorUtils.javaTypeToDescriptor(Foo.class.getTypeName()));
diff --git a/src/test/java/com/android/tools/r8/shaking/R8Shaking2LookupTest.java b/src/test/java/com/android/tools/r8/shaking/R8Shaking2LookupTest.java
index 35f67b2..038ceb2 100644
--- a/src/test/java/com/android/tools/r8/shaking/R8Shaking2LookupTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/R8Shaking2LookupTest.java
@@ -9,6 +9,7 @@
import com.android.tools.r8.ToolHelper;
import com.android.tools.r8.graph.AppInfoWithClassHierarchy;
+import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexItemFactory;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.DirectMappedDexApplication;
@@ -31,7 +32,7 @@
public void readApp() throws IOException, ExecutionException {
program = ToolHelper.buildApplication(ImmutableList.of(APP_FILE_NAME));
dexItemFactory = program.dexItemFactory;
- appInfo = new AppInfoWithClassHierarchy(program);
+ appInfo = AppView.createForR8(program).appInfo();
subtypingInfo = new SubtypingInfo(program.allClasses(), program);
}