Repackage enclosingClass before current class to repackage
This also ensure that we only compute a new inner name if it was specified.
Bug: 196503304
Change-Id: I9151a39b008fc85c5ce242a48dbf7f7f95c0ac2c
diff --git a/src/main/java/com/android/tools/r8/graph/TreeFixerBase.java b/src/main/java/com/android/tools/r8/graph/TreeFixerBase.java
index d09c3f5..f3670f3 100644
--- a/src/main/java/com/android/tools/r8/graph/TreeFixerBase.java
+++ b/src/main/java/com/android/tools/r8/graph/TreeFixerBase.java
@@ -208,7 +208,10 @@
// inner class attributes.
boolean innerClassAttributeChanged =
newInnerClassType != innerClassType || newOuterClassType != outerClassType;
- if (innerClassAttributeChanged && innerClassType != null && outerClassType != null) {
+ if (innerClassAttributeChanged
+ && innerClassType != null
+ && outerClassType != null
+ && innerClassAttribute.getInnerName() != null) {
String innerClassName =
DescriptorUtils.getInnerClassName(
newOuterClassType.toDescriptorString(), newInnerClassType.toDescriptorString());
@@ -217,10 +220,8 @@
} else {
// If run without treeshaking and the outer type is missing we are not pruning the
// relationship.
- // TODO(b/196503304): Enable the below asserts when resolved.
- assert !appView.options().isTreeShakingEnabled() || true;
- // assert appView.appInfo().definitionForWithoutExistenceAssert(newOuterClassType) ==
- // null;
+ assert !appView.options().isTreeShakingEnabled();
+ assert appView.appInfo().definitionForWithoutExistenceAssert(newOuterClassType) == null;
}
}
newInnerClassAttributes.add(
diff --git a/src/main/java/com/android/tools/r8/repackaging/Repackaging.java b/src/main/java/com/android/tools/r8/repackaging/Repackaging.java
index 6621857..5ba8b26 100644
--- a/src/main/java/com/android/tools/r8/repackaging/Repackaging.java
+++ b/src/main/java/com/android/tools/r8/repackaging/Repackaging.java
@@ -274,16 +274,25 @@
}
// Always repackage outer classes first, if any.
- InnerClassAttribute innerClassAttribute = classToRepackage.getInnerClassAttributeForThisClass();
DexProgramClass outerClass = null;
- if (innerClassAttribute != null && innerClassAttribute.getOuter() != null) {
- outerClass = asProgramClassOrNull(appView.definitionFor(innerClassAttribute.getOuter()));
- if (outerClass != null) {
- if (pkg.contains(outerClass)) {
- processClass(outerClass, pkg, newPackageDescriptor, mappings);
- } else {
- outerClass = null;
- }
+ if (classToRepackage.hasEnclosingMethodAttribute()) {
+ DexType enclosingClass = classToRepackage.getEnclosingMethodAttribute().getEnclosingClass();
+ if (enclosingClass != null) {
+ outerClass = asProgramClassOrNull(appView.definitionFor(enclosingClass));
+ }
+ }
+ if (outerClass == null) {
+ InnerClassAttribute innerClassAttribute =
+ classToRepackage.getInnerClassAttributeForThisClass();
+ if (innerClassAttribute != null && innerClassAttribute.getOuter() != null) {
+ outerClass = asProgramClassOrNull(appView.definitionFor(innerClassAttribute.getOuter()));
+ }
+ }
+ if (outerClass != null) {
+ if (pkg.contains(outerClass)) {
+ processClass(outerClass, pkg, newPackageDescriptor, mappings);
+ } else {
+ outerClass = null;
}
}
mappings.put(