Fix handling of enums in annotations when generating class files
Enums in annotations use valueOf to find the enum instance. This
requires that the on-obfuscated name is written into the annotation.
Bug: b/236691999
Change-Id: I98c3d30f577baba3f36d8560d572a0a44a24f307
diff --git a/src/main/java/com/android/tools/r8/jar/CfApplicationWriter.java b/src/main/java/com/android/tools/r8/jar/CfApplicationWriter.java
index ab83fdb..e72ff20 100644
--- a/src/main/java/com/android/tools/r8/jar/CfApplicationWriter.java
+++ b/src/main/java/com/android/tools/r8/jar/CfApplicationWriter.java
@@ -599,7 +599,9 @@
visitor.visitEnum(
name,
getNamingLens().lookupDescriptor(enumField.getType()).toString(),
- getNamingLens().lookupName(enumField).toString());
+ // Write the original name of the enum, as the Java runtime will use Enum.valueOf to
+ // find the enum's referenced in annotations. See b/236691999 for details.
+ enumField.name.toString());
break;
case FIELD:
diff --git a/src/test/java/com/android/tools/r8/shaking/enums/EnumArrayInAnnotationTest.java b/src/test/java/com/android/tools/r8/shaking/enums/EnumArrayInAnnotationTest.java
index d0a0601..3292cda 100644
--- a/src/test/java/com/android/tools/r8/shaking/enums/EnumArrayInAnnotationTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/enums/EnumArrayInAnnotationTest.java
@@ -70,16 +70,7 @@
.setMinApi(parameters.getApiLevel())
.addKeepRuntimeVisibleAnnotations()
.run(parameters.getRuntime(), Main.class)
- .applyIf(
- parameters.isCfRuntime()
- && useGenericEnumsRule
- && parameters.asCfRuntime().isOlderThan(CfVm.JDK11),
- r -> r.assertFailureWithErrorThatThrows(ArrayStoreException.class),
- parameters.isCfRuntime()
- && useGenericEnumsRule
- && parameters.asCfRuntime().isNewerThanOrEqual(CfVm.JDK11),
- r -> r.assertFailureWithErrorThatThrows(EnumConstantNotPresentException.class),
- r -> r.assertSuccessWithOutput(EXPECTED_RESULT));
+ .assertSuccessWithOutput(EXPECTED_RESULT);
}
@Test
diff --git a/src/test/java/com/android/tools/r8/shaking/enums/EnumInAnnotationTest.java b/src/test/java/com/android/tools/r8/shaking/enums/EnumInAnnotationTest.java
index b17017c..2e4b77f 100644
--- a/src/test/java/com/android/tools/r8/shaking/enums/EnumInAnnotationTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/enums/EnumInAnnotationTest.java
@@ -71,10 +71,7 @@
.addKeepRuntimeVisibleAnnotations()
.compile()
.run(parameters.getRuntime(), Main.class)
- .applyIf(
- parameters.isCfRuntime() && useGenericEnumsRule,
- r -> r.assertFailureWithErrorThatThrows(EnumConstantNotPresentException.class),
- r -> r.assertSuccessWithOutput(EXPECTED_RESULT));
+ .assertSuccessWithOutput(EXPECTED_RESULT);
}
@Test