Add temporary flag for best desugaring -IA classes generation
Bug: b/359546659
Change-Id: Ib9f0152eddac3259b5c47873ea7c4d72b5ef9e8b
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/nest/NestBasedAccessDesugaring.java b/src/main/java/com/android/tools/r8/ir/desugar/nest/NestBasedAccessDesugaring.java
index 55221e7..0550d47 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/nest/NestBasedAccessDesugaring.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/nest/NestBasedAccessDesugaring.java
@@ -441,40 +441,70 @@
}
private DexClass getConstructorArgumentClass(DexClassAndMethod constructor) {
- return syntheticNestConstructorTypes.get(constructor.getHolder().getNestHost());
+ if (!appView.options().legacyNestDesugaringIAClasses) {
+ return syntheticNestConstructorTypes.get(constructor.getHolder().getNestHost());
+ } else {
+ return syntheticNestConstructorTypes.get(constructor.getHolderType());
+ }
}
DexClass ensureConstructorArgumentClass(DexClassAndMethod constructor) {
assert constructor.getDefinition().isInstanceInitializer();
assert constructor.isProgramMethod() || constructor.isClasspathMethod();
- DexType hostType =
- constructor.isProgramMethod()
- ? constructor.asProgramMethod().getHolder().getNestHost()
- : constructor.asClasspathMethod().getHolder().getNestHost();
- DexClass host = appView.definitionFor(hostType);
- return syntheticNestConstructorTypes.computeIfAbsent(
- hostType,
- holder -> {
- if (host.isProgramClass()) {
- return appView
- .getSyntheticItems()
- .createFixedClass(
- kinds -> kinds.INIT_TYPE_ARGUMENT,
- host.asProgramClass(),
- appView,
- builder -> {});
- } else {
- assert host.isClasspathClass();
- return appView
- .getSyntheticItems()
- .ensureFixedClasspathClass(
- kinds -> kinds.INIT_TYPE_ARGUMENT,
- host.asClasspathClass(),
- appView,
- ignored -> {},
- ignored -> {});
- }
- });
+ if (!appView.options().legacyNestDesugaringIAClasses) {
+ DexType hostType =
+ constructor.isProgramMethod()
+ ? constructor.asProgramMethod().getHolder().getNestHost()
+ : constructor.asClasspathMethod().getHolder().getNestHost();
+ DexClass host = appView.definitionFor(hostType);
+ return syntheticNestConstructorTypes.computeIfAbsent(
+ hostType,
+ holder -> {
+ if (host.isProgramClass()) {
+ return appView
+ .getSyntheticItems()
+ .createFixedClass(
+ kinds -> kinds.INIT_TYPE_ARGUMENT,
+ host.asProgramClass(),
+ appView,
+ builder -> {});
+ } else {
+ assert host.isClasspathClass();
+ return appView
+ .getSyntheticItems()
+ .ensureFixedClasspathClass(
+ kinds -> kinds.INIT_TYPE_ARGUMENT,
+ host.asClasspathClass(),
+ appView,
+ ignored -> {},
+ ignored -> {});
+ }
+ });
+ } else {
+ return syntheticNestConstructorTypes.computeIfAbsent(
+ constructor.getHolderType(),
+ holder -> {
+ if (constructor.isProgramMethod()) {
+ return appView
+ .getSyntheticItems()
+ .createFixedClass(
+ kinds -> kinds.INIT_TYPE_ARGUMENT,
+ constructor.asProgramMethod().getHolder(),
+ appView,
+ builder -> {});
+ } else {
+ assert constructor.isClasspathMethod();
+ return appView
+ .getSyntheticItems()
+ .ensureFixedClasspathClass(
+ kinds -> kinds.INIT_TYPE_ARGUMENT,
+ constructor.asClasspathMethod().getHolder(),
+ appView,
+ ignored -> {},
+ ignored -> {});
+ }
+ });
+ }
}
DexMethod getConstructorBridgeReference(
diff --git a/src/main/java/com/android/tools/r8/utils/InternalOptions.java b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
index 3146c85..dac665d 100644
--- a/src/main/java/com/android/tools/r8/utils/InternalOptions.java
+++ b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
@@ -523,6 +523,10 @@
// Flag to allow force nest desugaring, even if natively supported on the chosen API level.
public boolean forceNestDesugaring =
System.getProperty("com.android.tools.r8.forceNestDesugaring") != null;
+ // Flag to use legacy generation of -IA classes for nests (only for Platform until aosp/3241282
+ // lands).
+ public boolean legacyNestDesugaringIAClasses =
+ System.getProperty("com.android.tools.r8.legacyNestDesugaringIAClasses") != null;
// TODO(b/293591931): Remove this flag.
// Flag to allow permitted subclasses annotations in DEX. See b/231930852 for context.
diff --git a/src/test/examplesJava11/nesthostexample/NestInitArgumentContextTest.java b/src/test/examplesJava11/nesthostexample/NestInitArgumentContextTest.java
index 5e18f9c..2de3600 100644
--- a/src/test/examplesJava11/nesthostexample/NestInitArgumentContextTest.java
+++ b/src/test/examplesJava11/nesthostexample/NestInitArgumentContextTest.java
@@ -29,10 +29,15 @@
@Parameter(1)
public boolean intermediate;
- @Parameters(name = "{0}, intermediate = {1}")
+ @Parameter(2)
+ public boolean legacyNestDesugaringIAClasses;
+
+ @Parameters(name = "{0}, intermediate = {1}, legacyNestDesugaringIAClasses = {2}")
public static List<Object[]> data() {
return buildParameters(
- getTestParameters().withDexRuntimesAndAllApiLevels().build(), BooleanUtils.values());
+ getTestParameters().withDexRuntimesAndAllApiLevels().build(),
+ BooleanUtils.values(),
+ BooleanUtils.values());
}
@Test
@@ -41,11 +46,13 @@
.addProgramClassesAndInnerClasses(NestInitArgumentContextClass.class)
.setMinApi(parameters)
.setIntermediate(intermediate)
+ .addOptionsModification(
+ options -> options.legacyNestDesugaringIAClasses = legacyNestDesugaringIAClasses)
.compile()
.inspect(
inspector ->
assertEquals(
- 1,
+ legacyNestDesugaringIAClasses ? 5 : 1,
inspector.allClasses().stream()
.map(ClassSubject::getFinalName)
.filter(name -> name.endsWith("-IA"))
@@ -69,11 +76,13 @@
.addClasspathClasses(innerClasses)
.setMinApi(parameters)
.setIntermediate(intermediate)
+ .addOptionsModification(
+ options -> options.legacyNestDesugaringIAClasses = legacyNestDesugaringIAClasses)
.compile()
.inspect(
inspector ->
assertEquals(
- 0,
+ legacyNestDesugaringIAClasses ? 1 : 0,
inspector.allClasses().stream()
.map(ClassSubject::getFinalName)
.filter(name -> name.endsWith("-IA"))
@@ -87,6 +96,8 @@
.addClasspathClasses(innerClasses)
.setMinApi(parameters)
.setIntermediate(intermediate)
+ .addOptionsModification(
+ options -> options.legacyNestDesugaringIAClasses = legacyNestDesugaringIAClasses)
.compile()
.inspect(
inspector ->
@@ -102,11 +113,13 @@
.addProgramFiles(innerClassesCompiled)
.addProgramFiles(outerClassCompiled)
.setMinApi(parameters)
+ .addOptionsModification(
+ options -> options.legacyNestDesugaringIAClasses = legacyNestDesugaringIAClasses)
.compile()
.inspect(
inspector ->
assertEquals(
- 1,
+ legacyNestDesugaringIAClasses ? 5 : 1,
inspector.allClasses().stream()
.map(ClassSubject::getFinalName)
.filter(name -> name.endsWith("-IA"))