Enable Nest desugaring in L8 in 2.2
Bug: 182463100
Change-Id: I413622f68e6ac2ac63d6708523147ffe1d8f626c
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java b/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
index b695024..45b0e16 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
@@ -234,6 +234,8 @@
options.cfToCfDesugar || options.testing.forceLibBackportsInL8CfToCf
? new BackportedMethodRewriter(appView)
: null;
+ this.d8NestBasedAccessDesugaring =
+ options.shouldDesugarNests() ? new D8NestBasedAccessDesugaring(appView) : null;
this.twrCloseResourceRewriter = null;
this.lambdaMerger = null;
this.covariantReturnTypeAnnotationTransformer = null;
@@ -249,7 +251,6 @@
this.identifierNameStringMarker = null;
this.devirtualizer = null;
this.typeChecker = null;
- this.d8NestBasedAccessDesugaring = null;
this.stringSwitchRemover = null;
this.serviceLoaderRewriter = null;
this.methodOptimizationInfoCollector = null;
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 89dc96c..6779740 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
@@ -128,6 +128,9 @@
}
private void processNest(DexClass host, List<DexType> nest) {
+ if (hasLibraryMember(host, nest)) {
+ return;
+ }
boolean reported = false;
for (DexType type : nest) {
DexClass clazz = definitionFor(type);
@@ -147,8 +150,6 @@
ClasspathMethod method = new ClasspathMethod(clazz.asClasspathClass(), definition);
method.registerCodeReferencesForDesugaring(
new NestBasedAccessDesugaringUseRegistry(method));
- } else {
- assert false;
}
}
}
@@ -156,6 +157,16 @@
}
}
+ private boolean hasLibraryMember(DexClass host, List<DexType> nest) {
+ for (DexType memberType : nest) {
+ DexClass memberClass = appView.definitionFor(memberType);
+ if (memberClass != null && memberClass.isLibraryClass()) {
+ return true;
+ }
+ }
+ return host.isLibraryClass();
+ }
+
private void reportDesugarDependencies(DexClass host, DexClass clazz) {
if (host == clazz) {
return;
@@ -171,8 +182,11 @@
protected abstract boolean shouldProcessClassInNest(DexClass clazz, List<DexType> nest);
private DexProgramClass createNestAccessConstructor() {
+ String prefix = appView.options().isDesugaredLibraryCompilation() ? "j$/" : "";
return new DexProgramClass(
- appView.dexItemFactory().nestConstructorType,
+ appView
+ .dexItemFactory()
+ .createType("L" + prefix + NestBasedAccessDesugaring.NEST_CONSTRUCTOR_NAME + ";"),
null,
new SynthesizedOrigin("Nest based access desugaring", getClass()),
// Make the synthesized class public since shared in the whole program.