Lookup rewritten kotlin metadata type if repackaged
If we do not look up the rewritten type we get an assertion error and
perhaps fail to remove the kotlin metadata annotation. We will not
model metadata if it can be renamed.
Change-Id: I326daf43ae1b27d2567bbdb7f7bc61136c427c50
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataRewriter.java b/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataRewriter.java
index fdb9472..1e3273c 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataRewriter.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataRewriter.java
@@ -13,6 +13,7 @@
import com.android.tools.r8.graph.DexEncodedAnnotation;
import com.android.tools.r8.graph.DexItemFactory;
import com.android.tools.r8.graph.DexString;
+import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.DexValue;
import com.android.tools.r8.graph.DexValue.DexValueArray;
import com.android.tools.r8.graph.DexValue.DexValueInt;
@@ -79,14 +80,14 @@
this.kotlin = factory.kotlin;
}
- private static boolean isNotKotlinMetadata(AppView<?> appView, DexAnnotation annotation) {
- return annotation.annotation.type != appView.dexItemFactory().kotlinMetadataType;
+ private static boolean isNotKotlinMetadata(DexAnnotation annotation, DexType kotlinMetadataType) {
+ return annotation.annotation.type != kotlinMetadataType;
}
public void runForR8(ExecutorService executorService) throws ExecutionException {
- final DexClass kotlinMetadata =
- appView.definitionFor(appView.dexItemFactory().kotlinMetadataType);
- final WriteMetadataFieldInfo writeMetadataFieldInfo =
+ DexType rewrittenMetadataType = appView.graphLens().lookupClassType(factory.kotlinMetadataType);
+ DexClass kotlinMetadata = appView.definitionFor(rewrittenMetadataType);
+ WriteMetadataFieldInfo writeMetadataFieldInfo =
new WriteMetadataFieldInfo(
kotlinMetadataFieldExists(kotlinMetadata, appView, kotlin.metadata.kind),
kotlinMetadataFieldExists(kotlinMetadata, appView, kotlin.metadata.metadataVersion),
@@ -100,11 +101,13 @@
appView.appInfo().classes(),
clazz -> {
KotlinClassLevelInfo kotlinInfo = clazz.getKotlinInfo();
- DexAnnotation oldMeta = clazz.annotations().getFirstMatching(factory.kotlinMetadataType);
+ DexAnnotation oldMeta = clazz.annotations().getFirstMatching(rewrittenMetadataType);
if (kotlinInfo == INVALID_KOTLIN_INFO) {
// Maintain invalid kotlin info for classes.
return;
}
+ // TODO(b/181103083): Consider removing if rewrittenMetadataType
+ // != factory.kotlinMetadataType
if (oldMeta == null
|| kotlinInfo == NO_KOTLIN_INFO
|| (appView.appInfo().hasLiveness()
@@ -113,7 +116,9 @@
// missing.
if (oldMeta != null) {
clazz.setAnnotations(
- clazz.annotations().keepIf(anno -> isNotKotlinMetadata(appView, anno)));
+ clazz
+ .annotations()
+ .keepIf(anno -> isNotKotlinMetadata(anno, rewrittenMetadataType)));
}
return;
}
diff --git a/src/test/java/com/android/tools/r8/kotlin/ProcessKotlinStdlibTest.java b/src/test/java/com/android/tools/r8/kotlin/ProcessKotlinStdlibTest.java
index 679177e..68614ad 100644
--- a/src/test/java/com/android/tools/r8/kotlin/ProcessKotlinStdlibTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/ProcessKotlinStdlibTest.java
@@ -74,4 +74,20 @@
public void testDontObfuscate() throws Exception {
test(ImmutableList.of("-dontobfuscate"));
}
+
+ @Test
+ public void testRepackage() throws Exception {
+ test(
+ ImmutableList.of(
+ "-keep,allowobfuscation class kotlin.Metadata { *; }", "-repackageclasses ''"));
+ }
+
+ @Test
+ public void testRepackageWithKeepAttributes() throws Exception {
+ test(
+ ImmutableList.of(
+ "-keep,allowobfuscation class kotlin.Metadata { *; }",
+ "-repackageclasses ''",
+ "-keepattributes *"));
+ }
}