Transition dependent items for instantiated annotation
Bug: 162900580
Change-Id: If2faacbfb6515ac06a3ebdfdb17ee1fd077df93f
diff --git a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
index 5c0f735..4422c72 100644
--- a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
+++ b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
@@ -2007,6 +2007,12 @@
clazz, context, instantiationReason, keepReason, appInfo);
}
+ void markAnnotationAsInstantiated(DexProgramClass clazz, KeepReasonWitness witness) {
+ assert clazz.isAnnotation();
+ markTypeAsLive(clazz, witness);
+ transitionDependentItemsForInstantiatedInterface(clazz);
+ }
+
void markInterfaceAsInstantiated(DexProgramClass clazz, KeepReasonWitness witness) {
assert !clazz.isAnnotation();
assert clazz.isInterface();
diff --git a/src/main/java/com/android/tools/r8/shaking/EnqueuerWorklist.java b/src/main/java/com/android/tools/r8/shaking/EnqueuerWorklist.java
index 3c9649d..2bc8459 100644
--- a/src/main/java/com/android/tools/r8/shaking/EnqueuerWorklist.java
+++ b/src/main/java/com/android/tools/r8/shaking/EnqueuerWorklist.java
@@ -101,7 +101,7 @@
@Override
public void run(Enqueuer enqueuer) {
- enqueuer.markTypeAsLive(target, reason);
+ enqueuer.markAnnotationAsInstantiated(target, reason);
}
}
diff --git a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteKeepTest.java b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteKeepTest.java
index 3986b38..0f80128 100644
--- a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteKeepTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteKeepTest.java
@@ -6,12 +6,10 @@
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertThrows;
import com.android.tools.r8.TestParameters;
import com.android.tools.r8.ToolHelper;
import com.android.tools.r8.ToolHelper.KotlinTargetVersion;
-import com.android.tools.r8.kotlin.KotlinClassMetadataReader.MetadataError;
import com.android.tools.r8.shaking.ProguardKeepAttributes;
import com.android.tools.r8.utils.codeinspector.CodeInspector;
import com.android.tools.r8.utils.codeinspector.FoundClassSubject;
@@ -57,11 +55,7 @@
.addKeepRules("-if class *", "-keep class kotlin.Metadata { *; }")
.addKeepAttributes(ProguardKeepAttributes.RUNTIME_VISIBLE_ANNOTATIONS)
.compile()
- .inspect(
- codeInspector -> {
- // TODO(b/162900580): This should be kept or the test refined.
- assertThrows(MetadataError.class, () -> inspect(codeInspector));
- });
+ .inspect(this::inspect);
}
private void inspect(CodeInspector inspector) {
diff --git a/src/test/java/com/android/tools/r8/shaking/ifrule/IfRuleWithKeepAllTest.java b/src/test/java/com/android/tools/r8/shaking/ifrule/IfRuleWithKeepAllTest.java
index 687e64c..c4dd92f 100644
--- a/src/test/java/com/android/tools/r8/shaking/ifrule/IfRuleWithKeepAllTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/ifrule/IfRuleWithKeepAllTest.java
@@ -5,7 +5,6 @@
package com.android.tools.r8.shaking.ifrule;
import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
-import static org.hamcrest.CoreMatchers.containsString;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.Assert.assertEquals;
@@ -57,16 +56,14 @@
assertThat(codeInspector.clazz(DirectlyKept.class), isPresent());
final ClassSubject keptByIf = codeInspector.clazz(KeptByIf.class);
assertThat(keptByIf, isPresent());
- // TODO(b/162900580): key() should have been kept.
- assertEquals(0, keptByIf.allMethods().size());
+ assertEquals(1, keptByIf.allMethods().size());
})
.addRunClasspathFiles(buildOnDexRuntime(parameters, Main.class))
- .run(parameters.getRuntime(), Main.class, KeptByIf.class.getTypeName())
- // TODO(b/162900580): Should succeed with "Hello World!"
- .assertFailureWithErrorThatMatches(containsString("NoSuchMethodError"));
+ .run(parameters.getRuntime(), Main.class)
+ .assertSuccessWithOutputLines("Hello World!");
}
- @KeptByIf
+ @KeptByIf()
public static class DirectlyKept {
final int foo = 42;
}