Inform malformed inner-class attribute regardless of minification.
Change-Id: I8f906ad7fc7c351d6b19863ee890f834a5f79682
diff --git a/src/main/java/com/android/tools/r8/graph/DexClass.java b/src/main/java/com/android/tools/r8/graph/DexClass.java
index 692acae..a301563 100644
--- a/src/main/java/com/android/tools/r8/graph/DexClass.java
+++ b/src/main/java/com/android/tools/r8/graph/DexClass.java
@@ -806,21 +806,20 @@
public boolean isLocalClass() {
InnerClassAttribute innerClass = getInnerClassAttributeForThisClass();
// The corresponding enclosing-method attribute might be not available, e.g., CF version 50.
- return innerClass != null
- && innerClass.getOuter() == null
- && innerClass.isNamed();
+ return innerClass != null && innerClass.getOuter() == null && innerClass.isNamed();
}
public boolean isMemberClass() {
InnerClassAttribute innerClass = getInnerClassAttributeForThisClass();
- return innerClass != null
- && innerClass.getOuter() != null
- && innerClass.isNamed();
+ boolean isMember = innerClass != null && innerClass.getOuter() != null && innerClass.isNamed();
+ assert !isMember || getEnclosingMethod() == null;
+ return isMember;
}
public boolean isAnonymousClass() {
InnerClassAttribute innerClass = getInnerClassAttributeForThisClass();
// The corresponding enclosing-method attribute might be not available, e.g., CF version 50.
+ // We can't rely on outer type either because it's not null prior to 51 and null since 51.
return innerClass != null && innerClass.isAnonymous();
}
diff --git a/src/main/java/com/android/tools/r8/graph/JarClassFileReader.java b/src/main/java/com/android/tools/r8/graph/JarClassFileReader.java
index 665e3d5..16e9d44 100644
--- a/src/main/java/com/android/tools/r8/graph/JarClassFileReader.java
+++ b/src/main/java/com/android/tools/r8/graph/JarClassFileReader.java
@@ -243,9 +243,7 @@
public void visitInnerClass(String name, String outerName, String innerName, int access) {
if (outerName != null && innerName != null) {
String separator = DescriptorUtils.computeInnerClassSeparator(outerName, name, innerName);
- if (separator == null
- && !application.options.isMinifying()
- && getMajorVersion() < V9) {
+ if (separator == null && getMajorVersion() < V9) {
application.options.reporter.info(
new StringDiagnostic(
StringUtils.lines(
diff --git a/src/main/java/com/android/tools/r8/utils/DescriptorUtils.java b/src/main/java/com/android/tools/r8/utils/DescriptorUtils.java
index dfb21da..725b435 100644
--- a/src/main/java/com/android/tools/r8/utils/DescriptorUtils.java
+++ b/src/main/java/com/android/tools/r8/utils/DescriptorUtils.java
@@ -320,6 +320,7 @@
public static String computeInnerClassSeparator(
String outerDescriptor, String innerDescriptor, String innerName) {
+ assert innerName != null && !innerName.isEmpty();
// outer-internal<separator>inner-name == inner-internal
if (outerDescriptor.length() + innerName.length() > innerDescriptor.length()) {
return null;
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/reflection/InnerClassNameTestRunner.java b/src/test/java/com/android/tools/r8/ir/optimize/reflection/InnerClassNameTestRunner.java
index bc6e13c..1a52d7e 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/reflection/InnerClassNameTestRunner.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/reflection/InnerClassNameTestRunner.java
@@ -170,14 +170,10 @@
case UNDERBAR_SEPARATOR:
case NON_NESTED_INNER:
case WRONG_REPACKAGE:
- if (!minify) {
- result
- .assertInfoMessageThatMatches(containsString("Malformed inner-class attribute"))
- .assertInfoMessageThatMatches(containsString(config.getOuterTypeRaw()))
- .assertInfoMessageThatMatches(containsString(config.getInnerTypeRaw()));
- } else {
- result.assertNoMessages();
- }
+ result
+ .assertInfoMessageThatMatches(containsString("Malformed inner-class attribute"))
+ .assertInfoMessageThatMatches(containsString(config.getOuterTypeRaw()))
+ .assertInfoMessageThatMatches(containsString(config.getInnerTypeRaw()));
break;
default:
throw new Unreachable("Unexpected test configuration: " + config);