Fix kotlin.Metadata rewriting for types in D8 part of R8 partial
Bug: b/409260720
Change-Id: I1e853cbdcb4dd196f8378ce8e6da4a17a2b2cb48
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataWriter.java b/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataWriter.java
index 9509c98..8ff5684 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataWriter.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataWriter.java
@@ -298,7 +298,7 @@
.append(value)
.append(",")
.append(LINE_SEPARATOR));
- sb.append(indent).append("]");
+ sb.append(indent).append("]").append(LINE_SEPARATOR);
}
public static void appendKmClass(String indent, StringBuilder sb, KmClass kmClass) {
@@ -611,7 +611,7 @@
nextIndent ->
appendKmList(
nextIndent,
- "KmAnnotion",
+ "KmAnnotation",
sb,
JvmExtensionsKt.getAnnotations(kmType),
(nextNextIndent, kmAnnotation) ->
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinTypeReference.java b/src/main/java/com/android/tools/r8/kotlin/KotlinTypeReference.java
index 92b8c20..196b6ba 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinTypeReference.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinTypeReference.java
@@ -164,8 +164,8 @@
}
DexType rewrittenType =
appView.graphLens().lookupClassType(type, appView.getKotlinMetadataLens());
- if (appView.appInfo().hasLiveness()
- && !appView.withLiveness().appInfo().isNonProgramTypeOrLiveProgramType(rewrittenType)) {
+ if (appView.hasLiveness()
+ && !appView.appInfoWithLiveness().isNonProgramTypeOrLiveProgramType(rewrittenType)) {
return null;
}
return rewrittenType;
diff --git a/src/main/java/com/android/tools/r8/shaking/AppInfoWithLiveness.java b/src/main/java/com/android/tools/r8/shaking/AppInfoWithLiveness.java
index 110abf1..b9dee9f 100644
--- a/src/main/java/com/android/tools/r8/shaking/AppInfoWithLiveness.java
+++ b/src/main/java/com/android/tools/r8/shaking/AppInfoWithLiveness.java
@@ -585,6 +585,12 @@
if (prunedTypes.contains(type)) {
return false;
}
+ R8PartialSubCompilationConfiguration partialCompilationConfiguration =
+ options().partialSubCompilationConfiguration;
+ if (partialCompilationConfiguration != null
+ && partialCompilationConfiguration.asR8().hasD8DefinitionFor(type)) {
+ return true;
+ }
DexClass clazz = definitionFor(type);
return clazz == null || !clazz.isProgramClass();
}
diff --git a/src/test/java/com/android/tools/r8/partial/kotlin/PartialCompilationKotlinMetadataTest.java b/src/test/java/com/android/tools/r8/partial/kotlin/PartialCompilationKotlinMetadataTest.java
index 1e62fc8..356ff33 100644
--- a/src/test/java/com/android/tools/r8/partial/kotlin/PartialCompilationKotlinMetadataTest.java
+++ b/src/test/java/com/android/tools/r8/partial/kotlin/PartialCompilationKotlinMetadataTest.java
@@ -6,7 +6,6 @@
import static com.android.tools.r8.utils.codeinspector.Matchers.isAbsent;
import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
import static org.hamcrest.CoreMatchers.containsString;
-import static org.hamcrest.CoreMatchers.not;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.Assert.assertNotNull;
@@ -97,8 +96,8 @@
assertNotNull(kotlinClassMetadata);
String metadata = KotlinMetadataWriter.kotlinMetadataToString("", kotlinClassMetadata);
assertThat(metadata, containsString(greetingClass.getFinalBinaryName()));
- // TODO(b/409260720): Both Message1 and Message2 should be referenced.
- assertThat(metadata, not(containsString(message1Class.getFinalBinaryName())));
+ // TODO(b/409260720): Message2 should be referenced.
+ assertThat(metadata, containsString(message1Class.getFinalBinaryName()));
}
private static KotlinCompileMemoizer compiledJars =