Assert original kotlin metadata only returned if no rewrites
Bug: 189405754
Change-Id: Ib9ce52113d4772162c7d37abfa9ce54b41143be0
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinDeclarationContainerInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinDeclarationContainerInfo.java
index eb654b5..1b928d9 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinDeclarationContainerInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinDeclarationContainerInfo.java
@@ -179,7 +179,11 @@
}
for (DexEncodedMethod method : clazz.methods()) {
if (method.getKotlinInfo().isFunction()) {
- method.getKotlinInfo().asFunction().rewrite(functionProvider, method, appView, namingLens);
+ rewritten |=
+ method
+ .getKotlinInfo()
+ .asFunction()
+ .rewrite(functionProvider, method, appView, namingLens);
continue;
}
KotlinPropertyInfo kotlinPropertyInfo = method.getKotlinInfo().asProperty();
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 d22a2b4..a094a88 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataRewriter.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataRewriter.java
@@ -3,8 +3,10 @@
// BSD-style license that can be found in the LICENSE file.
package com.android.tools.r8.kotlin;
+import static com.android.tools.r8.kotlin.KotlinClassMetadataReader.toKotlinClassMetadata;
import static com.android.tools.r8.kotlin.KotlinMetadataUtils.getInvalidKotlinInfo;
import static com.android.tools.r8.kotlin.KotlinMetadataUtils.getNoKotlinInfo;
+import static com.android.tools.r8.kotlin.KotlinMetadataWriter.kotlinMetadataToString;
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexAnnotation;
@@ -160,6 +162,15 @@
// TODO(b/185756596): Remove when special handling is no longer needed.
if (!kotlinClassHeader.getSecond() && !appView.enableWholeProgramOptimizations()) {
// No rewrite occurred and the data is the same as before.
+ assert appView.checkForTesting(
+ () ->
+ verifyRewrittenMetadataIsEquivalent(
+ clazz.annotations().getFirstMatching(factory.kotlinMetadataType),
+ createKotlinMetadataAnnotation(
+ kotlinClassHeader.getFirst(),
+ kotlinInfo.getPackageName(),
+ getMaxVersion(METADATA_VERSION_1_4, kotlinInfo.getMetadataVersion()),
+ writeMetadataFieldInfo)));
return;
}
DexAnnotation newMeta =
@@ -177,6 +188,16 @@
}
}
+ private boolean verifyRewrittenMetadataIsEquivalent(
+ DexAnnotation original, DexAnnotation rewritten) {
+ String originalMetadata =
+ kotlinMetadataToString("", toKotlinClassMetadata(kotlin, original.annotation));
+ String rewrittenMetadata =
+ kotlinMetadataToString("", toKotlinClassMetadata(kotlin, rewritten.annotation));
+ assert originalMetadata.equals(rewrittenMetadata) : "The metadata should be equivalent";
+ return true;
+ }
+
private boolean kotlinMetadataFieldExists(
DexClass kotlinMetadata, AppView<?> appView, DexString fieldName) {
if (!appView.appInfo().hasLiveness()) {
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinTypeProjectionInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinTypeProjectionInfo.java
index 3f83e53..8fe760b 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinTypeProjectionInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinTypeProjectionInfo.java
@@ -42,10 +42,10 @@
NamingLens namingLens) {
if (isStarProjection()) {
starProjectionProvider.get();
+ return false;
} else {
- typeInfo.rewrite(flags -> visitorProvider.get(flags, variance), appView, namingLens);
+ return typeInfo.rewrite(flags -> visitorProvider.get(flags, variance), appView, namingLens);
}
- return false;
}
@Override