Revert "[Metadata] Update kotlin-metadata-jvm to version 0.6.0" This reverts commit 39f08f72219210c78d964f356552efd6c8a3275a. Reason for revert: Could not build R8 lib Change-Id: I3ac4ad21195b2868556b888f727c8096e59a3158
diff --git a/build.gradle b/build.gradle index 3566d6f..f5838d6 100644 --- a/build.gradle +++ b/build.gradle
@@ -45,7 +45,7 @@ // The kotlin version is only here to specify the kotlin language level, // all kotlin compilations are done in tests. kotlinVersion = '1.6.0' - kotlinExtMetadataJVMVersion = '0.6.0' + kotlinExtMetadataJVMVersion = '0.5.0' smaliVersion = '2.2b4' errorproneVersion = '2.3.2' testngVersion = '6.10'
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinClassInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinClassInfo.java index 55314eb..810f2de 100644 --- a/src/main/java/com/android/tools/r8/kotlin/KotlinClassInfo.java +++ b/src/main/java/com/android/tools/r8/kotlin/KotlinClassInfo.java
@@ -4,11 +4,9 @@ package com.android.tools.r8.kotlin; -import static com.android.tools.r8.kotlin.KotlinMetadataUtils.getCompatibleKotlinInfo; import static com.android.tools.r8.kotlin.KotlinMetadataUtils.toJvmFieldSignature; import static com.android.tools.r8.kotlin.KotlinMetadataUtils.toJvmMethodSignature; import static com.android.tools.r8.utils.FunctionUtils.forEachApply; -import static kotlinx.metadata.jvm.KotlinClassMetadata.Companion; import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.DexClass; @@ -28,13 +26,13 @@ import java.util.List; import java.util.Map; import java.util.function.Consumer; -import kotlin.Metadata; import kotlinx.metadata.KmClass; import kotlinx.metadata.KmConstructor; import kotlinx.metadata.KmType; import kotlinx.metadata.jvm.JvmClassExtensionVisitor; import kotlinx.metadata.jvm.JvmExtensionsKt; import kotlinx.metadata.jvm.JvmMethodSignature; +import kotlinx.metadata.jvm.KotlinClassHeader; import kotlinx.metadata.jvm.KotlinClassMetadata; public class KotlinClassInfo implements KotlinClassLevelInfo { @@ -281,7 +279,7 @@ } @Override - public Pair<Metadata, Boolean> rewrite(DexClass clazz, AppView<?> appView) { + public Pair<KotlinClassHeader, Boolean> rewrite(DexClass clazz, AppView<?> appView) { KmClass kmClass = new KmClass(); // TODO(b/154348683): Set flags. kmClass.setFlags(flags); @@ -434,8 +432,10 @@ rewritten |= localDelegatedProperties.rewrite(extensionVisitor::visitLocalDelegatedProperty, appView); extensionVisitor.visitEnd(); + KotlinClassMetadata.Class.Writer writer = new KotlinClassMetadata.Class.Writer(); + kmClass.accept(writer); return Pair.create( - Companion.writeClass(kmClass, getCompatibleKotlinInfo(), 0).getAnnotationData(), + writer.write().getHeader(), rewritten || !originalMembersWithKotlinInfo.isEqual(rewrittenReferences, appView)); }
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinClassLevelInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinClassLevelInfo.java index d634e88..e8f7fd0 100644 --- a/src/main/java/com/android/tools/r8/kotlin/KotlinClassLevelInfo.java +++ b/src/main/java/com/android/tools/r8/kotlin/KotlinClassLevelInfo.java
@@ -8,7 +8,7 @@ import com.android.tools.r8.graph.DexClass; import com.android.tools.r8.shaking.EnqueuerMetadataTraceable; import com.android.tools.r8.utils.Pair; -import kotlin.Metadata; +import kotlinx.metadata.jvm.KotlinClassHeader; public interface KotlinClassLevelInfo extends EnqueuerMetadataTraceable { @@ -56,7 +56,7 @@ return null; } - Pair<Metadata, Boolean> rewrite(DexClass clazz, AppView<?> appView); + Pair<KotlinClassHeader, Boolean> rewrite(DexClass clazz, AppView<?> appView); String getPackageName();
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinClassMetadataReader.java b/src/main/java/com/android/tools/r8/kotlin/KotlinClassMetadataReader.java index d02839a..eb07f4b 100644 --- a/src/main/java/com/android/tools/r8/kotlin/KotlinClassMetadataReader.java +++ b/src/main/java/com/android/tools/r8/kotlin/KotlinClassMetadataReader.java
@@ -21,7 +21,6 @@ import java.util.IdentityHashMap; import java.util.Map; import java.util.function.Consumer; -import kotlin.Metadata; import kotlinx.metadata.InconsistentKotlinMetadataException; import kotlinx.metadata.jvm.KotlinClassHeader; import kotlinx.metadata.jvm.KotlinClassMetadata; @@ -143,9 +142,8 @@ KotlinClassMetadata kMetadata, AppView<?> appView, Consumer<DexEncodedMethod> keepByteCode) { - Metadata annotationData = kMetadata.getAnnotationData(); - String packageName = annotationData.pn(); - int[] metadataVersion = annotationData.mv(); + String packageName = kMetadata.getHeader().getPackageName(); + int[] metadataVersion = kMetadata.getHeader().getMetadataVersion(); if (kMetadata instanceof KotlinClassMetadata.Class) { return KotlinClassInfo.create( (KotlinClassMetadata.Class) kMetadata, @@ -180,7 +178,7 @@ kotlin, appView); } else { - throw new MetadataError("unsupported 'k' value: " + annotationData.k()); + throw new MetadataError("unsupported 'k' value: " + kMetadata.getHeader().getKind()); } }
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinFileFacadeInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinFileFacadeInfo.java index 59e482f..3daa33d 100644 --- a/src/main/java/com/android/tools/r8/kotlin/KotlinFileFacadeInfo.java +++ b/src/main/java/com/android/tools/r8/kotlin/KotlinFileFacadeInfo.java
@@ -4,17 +4,15 @@ package com.android.tools.r8.kotlin; -import static com.android.tools.r8.kotlin.KotlinMetadataUtils.getCompatibleKotlinInfo; -import static kotlinx.metadata.jvm.KotlinClassMetadata.Companion; - import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.DexClass; import com.android.tools.r8.graph.DexDefinitionSupplier; import com.android.tools.r8.graph.DexEncodedMethod; import com.android.tools.r8.utils.Pair; import java.util.function.Consumer; -import kotlin.Metadata; import kotlinx.metadata.KmPackage; +import kotlinx.metadata.jvm.KotlinClassHeader; +import kotlinx.metadata.jvm.KotlinClassMetadata; import kotlinx.metadata.jvm.KotlinClassMetadata.FileFacade; // Holds information about Metadata.FileFacade @@ -59,12 +57,12 @@ } @Override - public Pair<Metadata, Boolean> rewrite(DexClass clazz, AppView<?> appView) { + public Pair<KotlinClassHeader, Boolean> rewrite(DexClass clazz, AppView<?> appView) { KmPackage kmPackage = new KmPackage(); boolean rewritten = packageInfo.rewrite(kmPackage, clazz, appView); - return Pair.create( - Companion.writeFileFacade(kmPackage, getCompatibleKotlinInfo(), 0).getAnnotationData(), - rewritten); + KotlinClassMetadata.FileFacade.Writer writer = new KotlinClassMetadata.FileFacade.Writer(); + kmPackage.accept(writer); + return Pair.create(writer.write().getHeader(), rewritten); } @Override
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 e57fc63..c06aea8 100644 --- a/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataRewriter.java +++ b/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataRewriter.java
@@ -27,6 +27,7 @@ import java.util.List; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; +import kotlinx.metadata.jvm.KotlinClassHeader; public class KotlinMetadataRewriter { @@ -154,16 +155,17 @@ DexAnnotation oldMeta, WriteMetadataFieldInfo writeMetadataFieldInfo) { try { - Pair<kotlin.Metadata, Boolean> kotlinMetadata = kotlinInfo.rewrite(clazz, appView); + Pair<KotlinClassHeader, Boolean> kotlinClassHeader = kotlinInfo.rewrite(clazz, appView); // TODO(b/185756596): Remove when special handling is no longer needed. - if (!kotlinMetadata.getSecond() && appView.options().testing.keepMetadataInR8IfNotRewritten) { + if (!kotlinClassHeader.getSecond() + && appView.options().testing.keepMetadataInR8IfNotRewritten) { // No rewrite occurred and the data is the same as before. assert appView.checkForTesting( () -> verifyRewrittenMetadataIsEquivalent( clazz.annotations().getFirstMatching(factory.kotlinMetadataType), createKotlinMetadataAnnotation( - kotlinMetadata.getFirst(), + kotlinClassHeader.getFirst(), kotlinInfo.getPackageName(), getMaxVersion(METADATA_VERSION_1_4, kotlinInfo.getMetadataVersion()), writeMetadataFieldInfo))); @@ -171,7 +173,7 @@ } DexAnnotation newMeta = createKotlinMetadataAnnotation( - kotlinMetadata.getFirst(), + kotlinClassHeader.getFirst(), kotlinInfo.getPackageName(), getMaxVersion(METADATA_VERSION_1_4, kotlinInfo.getMetadataVersion()), writeMetadataFieldInfo); @@ -220,7 +222,7 @@ } private DexAnnotation createKotlinMetadataAnnotation( - kotlin.Metadata metadata, + KotlinClassHeader header, String packageName, int[] metadataVersion, WriteMetadataFieldInfo writeMetadataFieldInfo) { @@ -232,30 +234,31 @@ } if (writeMetadataFieldInfo.writeKind) { elements.add( - new DexAnnotationElement(kotlin.metadata.kind, DexValueInt.create(metadata.k()))); + new DexAnnotationElement(kotlin.metadata.kind, DexValueInt.create(header.getKind()))); } if (writeMetadataFieldInfo.writeData1) { elements.add( - new DexAnnotationElement(kotlin.metadata.data1, createStringArray(metadata.d1()))); + new DexAnnotationElement(kotlin.metadata.data1, createStringArray(header.getData1()))); } if (writeMetadataFieldInfo.writeData2) { elements.add( - new DexAnnotationElement(kotlin.metadata.data2, createStringArray(metadata.d2()))); + new DexAnnotationElement(kotlin.metadata.data2, createStringArray(header.getData2()))); } if (writeMetadataFieldInfo.writePackageName && packageName != null && !packageName.isEmpty()) { elements.add( new DexAnnotationElement( kotlin.metadata.packageName, new DexValueString(factory.createString(packageName)))); } - if (writeMetadataFieldInfo.writeExtraString && !metadata.xs().isEmpty()) { + if (writeMetadataFieldInfo.writeExtraString && !header.getExtraString().isEmpty()) { elements.add( new DexAnnotationElement( kotlin.metadata.extraString, - new DexValueString(factory.createString(metadata.xs())))); + new DexValueString(factory.createString(header.getExtraString())))); } - if (writeMetadataFieldInfo.writeExtraInt && metadata.xi() != 0) { + if (writeMetadataFieldInfo.writeExtraInt && header.getExtraInt() != 0) { elements.add( - new DexAnnotationElement(kotlin.metadata.extraInt, DexValueInt.create(metadata.xi()))); + new DexAnnotationElement( + kotlin.metadata.extraInt, DexValueInt.create(header.getExtraInt()))); } DexEncodedAnnotation encodedAnnotation = new DexEncodedAnnotation(
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataUtils.java b/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataUtils.java index ccc4938..d5884f5 100644 --- a/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataUtils.java +++ b/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataUtils.java
@@ -21,7 +21,6 @@ import com.android.tools.r8.utils.DescriptorUtils; import com.android.tools.r8.utils.Pair; import com.google.common.base.Strings; -import kotlin.Metadata; import kotlinx.metadata.KmExtensionType; import kotlinx.metadata.KmProperty; import kotlinx.metadata.KmPropertyExtensionVisitor; @@ -29,7 +28,7 @@ import kotlinx.metadata.jvm.JvmFieldSignature; import kotlinx.metadata.jvm.JvmMethodSignature; import kotlinx.metadata.jvm.JvmPropertyExtensionVisitor; -import kotlinx.metadata.jvm.KotlinClassMetadata; +import kotlinx.metadata.jvm.KotlinClassHeader; public class KotlinMetadataUtils { @@ -51,7 +50,7 @@ } @Override - public Pair<Metadata, Boolean> rewrite(DexClass clazz, AppView<?> appView) { + public Pair<KotlinClassHeader, Boolean> rewrite(DexClass clazz, AppView<?> appView) { throw new Unreachable("Should never be called"); } @@ -233,8 +232,4 @@ } return DescriptorUtils.descriptorToKotlinClassifier(descriptor); } - - static int[] getCompatibleKotlinInfo() { - return KotlinClassMetadata.COMPATIBLE_METADATA_VERSION; - } }
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinMultiFileClassFacadeInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinMultiFileClassFacadeInfo.java index 7f0b67f..2a89998 100644 --- a/src/main/java/com/android/tools/r8/kotlin/KotlinMultiFileClassFacadeInfo.java +++ b/src/main/java/com/android/tools/r8/kotlin/KotlinMultiFileClassFacadeInfo.java
@@ -4,9 +4,7 @@ package com.android.tools.r8.kotlin; -import static com.android.tools.r8.kotlin.KotlinMetadataUtils.getCompatibleKotlinInfo; import static com.android.tools.r8.utils.FunctionUtils.forEachApply; -import static kotlinx.metadata.jvm.KotlinClassMetadata.Companion; import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.DexClass; @@ -16,7 +14,8 @@ import com.google.common.collect.ImmutableList; import java.util.ArrayList; import java.util.List; -import kotlin.Metadata; +import kotlinx.metadata.jvm.KotlinClassHeader; +import kotlinx.metadata.jvm.KotlinClassMetadata; import kotlinx.metadata.jvm.KotlinClassMetadata.MultiFileClassFacade; // Holds information about Metadata.MultiFileClassFace @@ -56,7 +55,7 @@ } @Override - public Pair<Metadata, Boolean> rewrite(DexClass clazz, AppView<?> appView) { + public Pair<KotlinClassHeader, Boolean> rewrite(DexClass clazz, AppView<?> appView) { List<String> partClassNameStrings = new ArrayList<>(partClassNames.size()); boolean rewritten = false; for (KotlinTypeReference partClassName : partClassNames) { @@ -70,10 +69,9 @@ appView, null); } - return Pair.create( - Companion.writeMultiFileClassFacade(partClassNameStrings, getCompatibleKotlinInfo(), 0) - .getAnnotationData(), - rewritten); + KotlinClassMetadata.MultiFileClassFacade.Writer writer = + new KotlinClassMetadata.MultiFileClassFacade.Writer(); + return Pair.create(writer.write(partClassNameStrings).getHeader(), rewritten); } @Override
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinMultiFileClassPartInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinMultiFileClassPartInfo.java index a51defc..62460ae 100644 --- a/src/main/java/com/android/tools/r8/kotlin/KotlinMultiFileClassPartInfo.java +++ b/src/main/java/com/android/tools/r8/kotlin/KotlinMultiFileClassPartInfo.java
@@ -4,17 +4,15 @@ package com.android.tools.r8.kotlin; -import static com.android.tools.r8.kotlin.KotlinMetadataUtils.getCompatibleKotlinInfo; -import static kotlinx.metadata.jvm.KotlinClassMetadata.Companion; - import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.DexClass; import com.android.tools.r8.graph.DexDefinitionSupplier; import com.android.tools.r8.graph.DexEncodedMethod; import com.android.tools.r8.utils.Pair; import java.util.function.Consumer; -import kotlin.Metadata; import kotlinx.metadata.KmPackage; +import kotlinx.metadata.jvm.KotlinClassHeader; +import kotlinx.metadata.jvm.KotlinClassMetadata; import kotlinx.metadata.jvm.KotlinClassMetadata.MultiFileClassPart; // Holds information about Metadata.MultiFileClassPartInfo @@ -65,13 +63,13 @@ } @Override - public Pair<Metadata, Boolean> rewrite(DexClass clazz, AppView<?> appView) { + public Pair<KotlinClassHeader, Boolean> rewrite(DexClass clazz, AppView<?> appView) { KmPackage kmPackage = new KmPackage(); boolean rewritten = packageInfo.rewrite(kmPackage, clazz, appView); - return Pair.create( - Companion.writeMultiFileClassPart(kmPackage, facadeClassName, getCompatibleKotlinInfo(), 0) - .getAnnotationData(), - rewritten); + KotlinClassMetadata.MultiFileClassPart.Writer writer = + new KotlinClassMetadata.MultiFileClassPart.Writer(); + kmPackage.accept(writer); + return Pair.create(writer.write(facadeClassName).getHeader(), rewritten); } @Override
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinSyntheticClassInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinSyntheticClassInfo.java index a0783ed..fb9b55f 100644 --- a/src/main/java/com/android/tools/r8/kotlin/KotlinSyntheticClassInfo.java +++ b/src/main/java/com/android/tools/r8/kotlin/KotlinSyntheticClassInfo.java
@@ -4,16 +4,14 @@ package com.android.tools.r8.kotlin; -import static com.android.tools.r8.kotlin.KotlinMetadataUtils.getCompatibleKotlinInfo; -import static kotlinx.metadata.jvm.KotlinClassMetadata.Companion; - import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.DexClass; import com.android.tools.r8.graph.DexDefinitionSupplier; import com.android.tools.r8.utils.Pair; -import kotlin.Metadata; import kotlinx.metadata.KmLambda; +import kotlinx.metadata.jvm.KotlinClassHeader; import kotlinx.metadata.jvm.KotlinClassMetadata.SyntheticClass; +import kotlinx.metadata.jvm.KotlinClassMetadata.SyntheticClass.Writer; // Holds information about a Metadata.SyntheticClass object. public class KotlinSyntheticClassInfo implements KotlinClassLevelInfo { @@ -75,16 +73,15 @@ } @Override - public Pair<Metadata, Boolean> rewrite(DexClass clazz, AppView<?> appView) { - if (lambda == null) { - return Pair.create( - Companion.writeSyntheticClass(getCompatibleKotlinInfo(), 0).getAnnotationData(), false); + public Pair<KotlinClassHeader, Boolean> rewrite(DexClass clazz, AppView<?> appView) { + Writer writer = new Writer(); + boolean rewritten = false; + if (lambda != null) { + KmLambda kmLambda = new KmLambda(); + rewritten = lambda.rewrite(() -> kmLambda, clazz, appView); + kmLambda.accept(writer); } - KmLambda kmLambda = new KmLambda(); - boolean rewritten = lambda.rewrite(() -> kmLambda, clazz, appView); - return Pair.create( - Companion.writeLambda(kmLambda, getCompatibleKotlinInfo(), 0).getAnnotationData(), - rewritten); + return Pair.create(writer.write().getHeader(), rewritten); } @Override
diff --git a/src/test/java/com/android/tools/r8/kotlin/coroutines/KotlinxCoroutinesTestRunner.java b/src/test/java/com/android/tools/r8/kotlin/coroutines/KotlinxCoroutinesTestRunner.java index 4f334aa..11ad201 100644 --- a/src/test/java/com/android/tools/r8/kotlin/coroutines/KotlinxCoroutinesTestRunner.java +++ b/src/test/java/com/android/tools/r8/kotlin/coroutines/KotlinxCoroutinesTestRunner.java
@@ -94,7 +94,7 @@ .compile() .inspect( inspector -> - assertEqualMetadataWithStringPoolValidation( + assertEqualMetadata( new CodeInspector(BASE_LIBRARY), inspector, (addedStrings, addedNonInitStrings) -> {}))
diff --git a/src/test/java/com/android/tools/r8/kotlin/metadata/KotlinMetadataTestBase.java b/src/test/java/com/android/tools/r8/kotlin/metadata/KotlinMetadataTestBase.java index ad7dfc3..55a048e 100644 --- a/src/test/java/com/android/tools/r8/kotlin/metadata/KotlinMetadataTestBase.java +++ b/src/test/java/com/android/tools/r8/kotlin/metadata/KotlinMetadataTestBase.java
@@ -31,9 +31,8 @@ import java.util.function.BiConsumer; import java.util.stream.Collectors; import junit.framework.TestCase; -import kotlin.Metadata; +import kotlinx.metadata.jvm.KotlinClassHeader; import kotlinx.metadata.jvm.KotlinClassMetadata; -import org.junit.Assert; public abstract class KotlinMetadataTestBase extends KotlinTestBase { @@ -55,7 +54,7 @@ static final String KT_FUNCTION1 = "Lkotlin/Function1;"; static final String KT_COMPARABLE = "Lkotlin/Comparable;"; - public void assertEqualMetadataWithStringPoolValidation( + public void assertEqualMetadata( CodeInspector originalInspector, CodeInspector rewrittenInspector, BiConsumer<Integer, Integer> addedStringsInspector) { @@ -74,9 +73,9 @@ continue; } assertNotNull(rewrittenMetadata); - kotlin.Metadata originalHeader = originalMetadata.getAnnotationData(); - kotlin.Metadata rewrittenHeader = rewrittenMetadata.getAnnotationData(); - TestCase.assertEquals(originalHeader.k(), rewrittenHeader.k()); + KotlinClassHeader originalHeader = originalMetadata.getHeader(); + KotlinClassHeader rewrittenHeader = rewrittenMetadata.getHeader(); + TestCase.assertEquals(originalHeader.getKind(), rewrittenHeader.getKind()); // We cannot assert equality of the data since it may be ordered differently. However, we // will check for the changes to the string pool and then validate the same parsing @@ -88,8 +87,8 @@ .computeIfAbsent( method.getFinalSignature().toDescriptor(), ignoreArgument(ArrayList::new)) .add(method.getFinalName())); - HashSet<String> originalStrings = new HashSet<>(Arrays.asList(originalHeader.d2())); - HashSet<String> rewrittenStrings = new HashSet<>(Arrays.asList(rewrittenHeader.d2())); + HashSet<String> originalStrings = new HashSet<>(Arrays.asList(originalHeader.getData2())); + HashSet<String> rewrittenStrings = new HashSet<>(Arrays.asList(rewrittenHeader.getData2())); rewrittenStrings.forEach( rewrittenString -> { if (originalStrings.contains(rewrittenString)) { @@ -109,7 +108,7 @@ } addedNonInitStrings.increment(); }); - assertEquals(originalHeader.pn(), rewrittenHeader.pn()); + assertEquals(originalHeader.getPackageName(), rewrittenHeader.getPackageName()); String expected = KotlinMetadataWriter.kotlinMetadataToString("", originalMetadata); String actual = KotlinMetadataWriter.kotlinMetadataToString("", rewrittenMetadata); @@ -118,53 +117,6 @@ addedStringsInspector.accept(addedStrings.get(), addedNonInitStrings.get()); } - public void assertEqualDeserializedMetadata( - CodeInspector inspector, CodeInspector otherInspector) { - for (FoundClassSubject clazzSubject : otherInspector.allClasses()) { - ClassSubject r8Clazz = inspector.clazz(clazzSubject.getOriginalName()); - assertThat(r8Clazz, isPresent()); - KotlinClassMetadata originalMetadata = clazzSubject.getKotlinClassMetadata(); - KotlinClassMetadata rewrittenMetadata = r8Clazz.getKotlinClassMetadata(); - if (originalMetadata == null) { - assertNull(rewrittenMetadata); - continue; - } - assertNotNull(rewrittenMetadata); - Metadata originalHeader = originalMetadata.getAnnotationData(); - Metadata rewrittenHeader = rewrittenMetadata.getAnnotationData(); - TestCase.assertEquals(originalHeader.k(), rewrittenHeader.k()); - TestCase.assertEquals(originalHeader.pn(), rewrittenHeader.pn()); - // We cannot assert equality of the data since it may be ordered differently. We use the - // KotlinMetadataWriter to deserialize the metadata and assert those are equal. - String expected = KotlinMetadataWriter.kotlinMetadataToString("", originalMetadata); - String actual = KotlinMetadataWriter.kotlinMetadataToString("", rewrittenMetadata); - TestCase.assertEquals(expected, actual); - } - } - - public void assertEqualMetadata(CodeInspector inspector, CodeInspector otherInspector) { - for (FoundClassSubject clazzSubject : otherInspector.allClasses()) { - ClassSubject r8Clazz = inspector.clazz(clazzSubject.getOriginalName()); - assertThat(r8Clazz, isPresent()); - KotlinClassMetadata originalMetadata = clazzSubject.getKotlinClassMetadata(); - KotlinClassMetadata rewrittenMetadata = r8Clazz.getKotlinClassMetadata(); - if (originalMetadata == null) { - assertNull(rewrittenMetadata); - continue; - } - TestCase.assertNotNull(rewrittenMetadata); - Metadata originalHeader = originalMetadata.getAnnotationData(); - Metadata rewrittenHeader = rewrittenMetadata.getAnnotationData(); - TestCase.assertEquals(originalHeader.k(), rewrittenHeader.k()); - TestCase.assertEquals(originalHeader.pn(), rewrittenHeader.pn()); - Assert.assertArrayEquals(originalHeader.d1(), rewrittenHeader.d1()); - Assert.assertArrayEquals(originalHeader.d2(), rewrittenHeader.d2()); - String expected = KotlinMetadataWriter.kotlinMetadataToString("", originalMetadata); - String actual = KotlinMetadataWriter.kotlinMetadataToString("", rewrittenMetadata); - TestCase.assertEquals(expected, actual); - } - } - public static void verifyExpectedWarningsFromKotlinReflectAndStdLib( TestCompileResult<?, ?> compileResult) { compileResult.assertAllWarningMessagesMatch(
diff --git a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteBoxedTypesTest.java b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteBoxedTypesTest.java index bcbc386..5e5fc28 100644 --- a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteBoxedTypesTest.java +++ b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteBoxedTypesTest.java
@@ -4,13 +4,26 @@ package com.android.tools.r8.kotlin.metadata; +import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent; +import static junit.framework.TestCase.assertEquals; +import static junit.framework.TestCase.assertNotNull; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.junit.Assert.assertNull; + import com.android.tools.r8.KotlinTestParameters; import com.android.tools.r8.TestParameters; +import com.android.tools.r8.kotlin.KotlinMetadataWriter; import com.android.tools.r8.shaking.ProguardKeepAttributes; import com.android.tools.r8.utils.StringUtils; +import com.android.tools.r8.utils.codeinspector.ClassSubject; import com.android.tools.r8.utils.codeinspector.CodeInspector; +import com.android.tools.r8.utils.codeinspector.FoundClassSubject; +import java.io.IOException; import java.nio.file.Path; import java.util.Collection; +import java.util.concurrent.ExecutionException; +import kotlinx.metadata.jvm.KotlinClassHeader; +import kotlinx.metadata.jvm.KotlinClassMetadata; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; @@ -84,13 +97,7 @@ ProguardKeepAttributes.INNER_CLASSES, ProguardKeepAttributes.ENCLOSING_METHOD) .compile() - // Since this has a keep-all classes rule, we should just assert that the meta-data is - // equal to the original one. - .inspect( - inspector -> - assertEqualDeserializedMetadata( - inspector, - new CodeInspector(libJars.getForConfiguration(kotlinc, targetVersion)))) + .inspect(this::inspect) .writeToZip(); Path main = kotlinc(parameters.getRuntime().asCf(), kotlinc, targetVersion) @@ -105,6 +112,33 @@ .assertSuccessWithOutput(EXPECTED); } + private void inspect(CodeInspector inspector) throws IOException, ExecutionException { + // Since this has a keep-all classes rule, we should just assert that the meta-data is equal to + // the original one. + CodeInspector stdLibInspector = + new CodeInspector(libJars.getForConfiguration(kotlinc, targetVersion)); + for (FoundClassSubject clazzSubject : stdLibInspector.allClasses()) { + ClassSubject r8Clazz = inspector.clazz(clazzSubject.getOriginalName()); + assertThat(r8Clazz, isPresent()); + KotlinClassMetadata originalMetadata = clazzSubject.getKotlinClassMetadata(); + KotlinClassMetadata rewrittenMetadata = r8Clazz.getKotlinClassMetadata(); + if (originalMetadata == null) { + assertNull(rewrittenMetadata); + continue; + } + assertNotNull(rewrittenMetadata); + KotlinClassHeader originalHeader = originalMetadata.getHeader(); + KotlinClassHeader rewrittenHeader = rewrittenMetadata.getHeader(); + assertEquals(originalHeader.getKind(), rewrittenHeader.getKind()); + assertEquals(originalHeader.getPackageName(), rewrittenHeader.getPackageName()); + // We cannot assert equality of the data since it may be ordered differently. Instead we use + // the KotlinMetadataWriter. + String expected = KotlinMetadataWriter.kotlinMetadataToString("", originalMetadata); + String actual = KotlinMetadataWriter.kotlinMetadataToString("", rewrittenMetadata); + assertEquals(expected, actual); + } + } + @Test public void testMetadataForReflect() throws Exception { Path libJar =
diff --git a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInlineClassTest.java b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInlineClassTest.java index 0704ecd..af22ae1 100644 --- a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInlineClassTest.java +++ b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInlineClassTest.java
@@ -5,15 +5,24 @@ package com.android.tools.r8.kotlin.metadata; import static com.android.tools.r8.KotlinCompilerTool.KotlinCompilerVersion.KOTLINC_1_6_0; +import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent; +import static org.hamcrest.MatcherAssert.assertThat; import com.android.tools.r8.KotlinCompilerTool.KotlinCompilerVersion; import com.android.tools.r8.KotlinTestParameters; import com.android.tools.r8.TestParameters; +import com.android.tools.r8.kotlin.KotlinMetadataWriter; import com.android.tools.r8.shaking.ProguardKeepAttributes; import com.android.tools.r8.utils.StringUtils; +import com.android.tools.r8.utils.codeinspector.ClassSubject; import com.android.tools.r8.utils.codeinspector.CodeInspector; +import java.io.IOException; import java.nio.file.Path; import java.util.Collection; +import junit.framework.TestCase; +import kotlinx.metadata.jvm.KotlinClassHeader; +import kotlinx.metadata.jvm.KotlinClassMetadata; +import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; @@ -75,11 +84,7 @@ "-keep class " + PKG + ".inline_class_lib.LibKt { *** login-*(java.lang.String); }") .addKeepAttributes(ProguardKeepAttributes.RUNTIME_VISIBLE_ANNOTATIONS) .compile() - .inspect( - inspector -> - assertEqualMetadata( - inspector, - new CodeInspector(libJars.getForConfiguration(kotlinc, targetVersion)))) + .inspect(this::inspect) .writeToZip(); Path main = kotlinc(parameters.getRuntime().asCf(), kotlinc, targetVersion) @@ -93,4 +98,24 @@ .run(parameters.getRuntime(), PKG + ".inline_class_app.MainKt") .assertSuccessWithOutput(EXPECTED); } + + private void inspect(CodeInspector inspector) throws IOException { + CodeInspector stdLibInspector = + new CodeInspector(libJars.getForConfiguration(kotlinc, targetVersion)); + ClassSubject clazzSubject = stdLibInspector.clazz(passwordTypeName); + ClassSubject r8Clazz = inspector.clazz(clazzSubject.getOriginalName()); + assertThat(r8Clazz, isPresent()); + KotlinClassMetadata originalMetadata = clazzSubject.getKotlinClassMetadata(); + KotlinClassMetadata rewrittenMetadata = r8Clazz.getKotlinClassMetadata(); + TestCase.assertNotNull(rewrittenMetadata); + KotlinClassHeader originalHeader = originalMetadata.getHeader(); + KotlinClassHeader rewrittenHeader = rewrittenMetadata.getHeader(); + TestCase.assertEquals(originalHeader.getKind(), rewrittenHeader.getKind()); + TestCase.assertEquals(originalHeader.getPackageName(), rewrittenHeader.getPackageName()); + Assert.assertArrayEquals(originalHeader.getData1(), rewrittenHeader.getData1()); + Assert.assertArrayEquals(originalHeader.getData2(), rewrittenHeader.getData2()); + String expected = KotlinMetadataWriter.kotlinMetadataToString("", originalMetadata); + String actual = KotlinMetadataWriter.kotlinMetadataToString("", rewrittenMetadata); + TestCase.assertEquals(expected, actual); + } }
diff --git a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInlinePropertyTest.java b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInlinePropertyTest.java index 6f78827..c693a41 100644 --- a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInlinePropertyTest.java +++ b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInlinePropertyTest.java
@@ -4,13 +4,24 @@ package com.android.tools.r8.kotlin.metadata; +import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.junit.Assert.assertNull; + import com.android.tools.r8.KotlinTestParameters; import com.android.tools.r8.TestParameters; +import com.android.tools.r8.kotlin.KotlinMetadataWriter; import com.android.tools.r8.shaking.ProguardKeepAttributes; import com.android.tools.r8.utils.StringUtils; +import com.android.tools.r8.utils.codeinspector.ClassSubject; import com.android.tools.r8.utils.codeinspector.CodeInspector; +import com.android.tools.r8.utils.codeinspector.FoundClassSubject; +import java.io.IOException; import java.nio.file.Path; import java.util.Collection; +import junit.framework.TestCase; +import kotlinx.metadata.jvm.KotlinClassHeader; +import kotlinx.metadata.jvm.KotlinClassMetadata; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; @@ -67,11 +78,7 @@ ProguardKeepAttributes.INNER_CLASSES, ProguardKeepAttributes.ENCLOSING_METHOD) .compile() - .inspect( - inspector -> - assertEqualDeserializedMetadata( - inspector, - new CodeInspector(libJars.getForConfiguration(kotlinc, targetVersion)))) + .inspect(this::inspect) .writeToZip(); Path main = kotlinc(parameters.getRuntime().asCf(), kotlinc, targetVersion) @@ -85,4 +92,29 @@ .run(parameters.getRuntime(), PKG + ".inline_property_app.MainKt") .assertSuccessWithOutput(EXPECTED); } + + private void inspect(CodeInspector inspector) throws IOException { + CodeInspector stdLibInspector = + new CodeInspector(libJars.getForConfiguration(kotlinc, targetVersion)); + for (FoundClassSubject clazzSubject : stdLibInspector.allClasses()) { + ClassSubject r8Clazz = inspector.clazz(clazzSubject.getOriginalName()); + assertThat(r8Clazz, isPresent()); + KotlinClassMetadata originalMetadata = clazzSubject.getKotlinClassMetadata(); + KotlinClassMetadata rewrittenMetadata = r8Clazz.getKotlinClassMetadata(); + if (originalMetadata == null) { + assertNull(rewrittenMetadata); + continue; + } + TestCase.assertNotNull(rewrittenMetadata); + KotlinClassHeader originalHeader = originalMetadata.getHeader(); + KotlinClassHeader rewrittenHeader = rewrittenMetadata.getHeader(); + TestCase.assertEquals(originalHeader.getKind(), rewrittenHeader.getKind()); + TestCase.assertEquals(originalHeader.getPackageName(), rewrittenHeader.getPackageName()); + // We cannot assert equality of the data since it may be ordered differently. Instead we use + // the KotlinMetadataWriter. + String expected = KotlinMetadataWriter.kotlinMetadataToString("", originalMetadata); + String actual = KotlinMetadataWriter.kotlinMetadataToString("", rewrittenMetadata); + TestCase.assertEquals(expected, actual); + } + } }
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 5ad1486..24b3e58 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
@@ -69,7 +69,7 @@ || clazz.getFinalName().equals("kotlin.Metadata") || clazz.getFinalName().equals("kotlin.jvm.JvmName")) { assertNotNull(clazz.getKotlinClassMetadata()); - assertNotNull(clazz.getKotlinClassMetadata().getAnnotationData().d2()); + assertNotNull(clazz.getKotlinClassMetadata().getHeader().getData2()); } else { assertNull(clazz.getKotlinClassMetadata()); }
diff --git a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteLocalDelegatedPropertyTest.java b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteLocalDelegatedPropertyTest.java index 9fddbf0..2a7ee54 100644 --- a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteLocalDelegatedPropertyTest.java +++ b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteLocalDelegatedPropertyTest.java
@@ -70,7 +70,7 @@ .compile() .inspect( inspector -> - assertEqualMetadataWithStringPoolValidation( + assertEqualMetadata( new CodeInspector(jars.getForConfiguration(kotlinc, targetVersion)), inspector, (addedStrings, addedNonInitStrings) -> {}))
diff --git a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewritePassThroughTest.java b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewritePassThroughTest.java index e06e1ba..ceb7d56 100644 --- a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewritePassThroughTest.java +++ b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewritePassThroughTest.java
@@ -50,13 +50,14 @@ .addKeepAllClassesRule() .addKeepKotlinMetadata() .addKeepAttributes( - ProguardKeepAttributes.INNER_CLASSES, ProguardKeepAttributes.ENCLOSING_METHOD) + ProguardKeepAttributes.INNER_CLASSES, + ProguardKeepAttributes.ENCLOSING_METHOD) .allowDiagnosticWarningMessages() .compile() .assertAllWarningMessagesMatch(equalTo("Resource 'META-INF/MANIFEST.MF' already exists.")) .inspect( inspector -> - assertEqualMetadataWithStringPoolValidation( + assertEqualMetadata( new CodeInspector(kotlinc.getKotlinStdlibJar()), inspector, (addedStrings, addedNonInitStrings) -> { @@ -74,7 +75,7 @@ .compile() .inspect( inspector -> - assertEqualMetadataWithStringPoolValidation( + assertEqualMetadata( new CodeInspector(kotlinc.getKotlinStdlibJar()), inspector, (addedStrings, addedNonInitStrings) -> {
diff --git a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteRawTest.java b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteRawTest.java index 6012fb0..7686ac3 100644 --- a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteRawTest.java +++ b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteRawTest.java
@@ -96,7 +96,7 @@ .compile() .inspect( inspector -> - assertEqualMetadataWithStringPoolValidation( + assertEqualMetadata( new CodeInspector(libJars.getForConfiguration(kotlinc, targetVersion)), inspector, (addedStrings, addedNonInitStrings) -> {}))
diff --git a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteUnitPrimitiveTest.java b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteUnitPrimitiveTest.java index 4683d0b..5d13395 100644 --- a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteUnitPrimitiveTest.java +++ b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteUnitPrimitiveTest.java
@@ -6,16 +6,27 @@ import static com.android.tools.r8.KotlinCompilerTool.KotlinCompilerVersion.MIN_SUPPORTED_VERSION; import static com.android.tools.r8.KotlinCompilerTool.KotlinTargetVersion.JAVA_8; +import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent; import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.junit.Assert.assertNull; import com.android.tools.r8.KotlinTestParameters; import com.android.tools.r8.TestParameters; +import com.android.tools.r8.kotlin.KotlinMetadataWriter; import com.android.tools.r8.shaking.ProguardKeepAttributes; import com.android.tools.r8.utils.DescriptorUtils; import com.android.tools.r8.utils.StringUtils; +import com.android.tools.r8.utils.codeinspector.ClassSubject; import com.android.tools.r8.utils.codeinspector.CodeInspector; +import com.android.tools.r8.utils.codeinspector.FoundClassSubject; +import java.io.IOException; import java.nio.file.Path; import java.util.Collection; +import junit.framework.TestCase; +import kotlinx.metadata.jvm.KotlinClassHeader; +import kotlinx.metadata.jvm.KotlinClassMetadata; +import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; @@ -98,12 +109,7 @@ .compile() .assertAllWarningMessagesMatch( equalTo("Resource 'META-INF/MANIFEST.MF' already exists.")) - .inspect( - inspector -> - assertEqualMetadata( - inspector, - new CodeInspector( - kotlincLibJar.getForConfiguration(kotlinc, targetVersion)))) + .inspect(this::inspect) .writeToZip(); Path main = kotlinc(parameters.getRuntime().asCf(), kotlinc, targetVersion) @@ -118,4 +124,29 @@ .run(parameters.getRuntime(), PKG_APP + ".MainKt") .assertSuccessWithOutput(EXPECTED); } + + private void inspect(CodeInspector inspector) throws IOException { + CodeInspector stdLibInspector = + new CodeInspector(kotlincLibJar.getForConfiguration(kotlinc, targetVersion)); + for (FoundClassSubject clazzSubject : stdLibInspector.allClasses()) { + ClassSubject r8Clazz = inspector.clazz(clazzSubject.getOriginalName()); + assertThat(r8Clazz, isPresent()); + KotlinClassMetadata originalMetadata = clazzSubject.getKotlinClassMetadata(); + KotlinClassMetadata rewrittenMetadata = r8Clazz.getKotlinClassMetadata(); + if (originalMetadata == null) { + assertNull(rewrittenMetadata); + continue; + } + TestCase.assertNotNull(rewrittenMetadata); + KotlinClassHeader originalHeader = originalMetadata.getHeader(); + KotlinClassHeader rewrittenHeader = rewrittenMetadata.getHeader(); + TestCase.assertEquals(originalHeader.getKind(), rewrittenHeader.getKind()); + TestCase.assertEquals(originalHeader.getPackageName(), rewrittenHeader.getPackageName()); + Assert.assertArrayEquals(originalHeader.getData1(), rewrittenHeader.getData1()); + Assert.assertArrayEquals(originalHeader.getData2(), rewrittenHeader.getData2()); + String expected = KotlinMetadataWriter.kotlinMetadataToString("", originalMetadata); + String actual = KotlinMetadataWriter.kotlinMetadataToString("", rewrittenMetadata); + TestCase.assertEquals(expected, actual); + } + } }
diff --git a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteValueClassTest.java b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteValueClassTest.java index b65643f..6aecc85 100644 --- a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteValueClassTest.java +++ b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteValueClassTest.java
@@ -9,6 +9,7 @@ import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.core.StringContains.containsString; +import static org.junit.Assert.assertNull; import com.android.tools.r8.KotlinCompilerTool.KotlinCompilerVersion; import com.android.tools.r8.KotlinTestParameters; @@ -19,9 +20,13 @@ import com.android.tools.r8.utils.StringUtils; import com.android.tools.r8.utils.codeinspector.ClassSubject; import com.android.tools.r8.utils.codeinspector.CodeInspector; +import com.android.tools.r8.utils.codeinspector.FoundClassSubject; import java.io.IOException; import java.nio.file.Path; import java.util.Collection; +import junit.framework.TestCase; +import kotlinx.metadata.jvm.KotlinClassHeader; +import kotlinx.metadata.jvm.KotlinClassMetadata; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; @@ -107,13 +112,31 @@ } private void inspect(CodeInspector inspector) throws IOException { - assertEqualDeserializedMetadata( - inspector, new CodeInspector(kotlincLibJar.getForConfiguration(kotlinc, targetVersion))); - ClassSubject r8Clazz = inspector.clazz(PKG_LIB + ".Name"); - assertThat(r8Clazz, isPresent()); - String actual = - KotlinMetadataWriter.kotlinMetadataToString("", r8Clazz.getKotlinClassMetadata()); - assertThat(actual, containsString("inlineClassUnderlyingPropertyName")); - assertThat(actual, containsString("inlineClassUnderlyingType")); + CodeInspector stdLibInspector = + new CodeInspector(kotlincLibJar.getForConfiguration(kotlinc, targetVersion)); + for (FoundClassSubject clazzSubject : stdLibInspector.allClasses()) { + ClassSubject r8Clazz = inspector.clazz(clazzSubject.getOriginalName()); + assertThat(r8Clazz, isPresent()); + KotlinClassMetadata originalMetadata = clazzSubject.getKotlinClassMetadata(); + KotlinClassMetadata rewrittenMetadata = r8Clazz.getKotlinClassMetadata(); + if (originalMetadata == null) { + assertNull(rewrittenMetadata); + continue; + } + TestCase.assertNotNull(rewrittenMetadata); + KotlinClassHeader originalHeader = originalMetadata.getHeader(); + KotlinClassHeader rewrittenHeader = rewrittenMetadata.getHeader(); + TestCase.assertEquals(originalHeader.getKind(), rewrittenHeader.getKind()); + TestCase.assertEquals(originalHeader.getPackageName(), rewrittenHeader.getPackageName()); + // We cannot assert equality of the data since it may be ordered differently. Instead we use + // the KotlinMetadataWriter. + String expected = KotlinMetadataWriter.kotlinMetadataToString("", originalMetadata); + String actual = KotlinMetadataWriter.kotlinMetadataToString("", rewrittenMetadata); + TestCase.assertEquals(expected, actual); + if (r8Clazz.getFinalName().equals(PKG_LIB + ".Name")) { + assertThat(actual, containsString("inlineClassUnderlyingPropertyName")); + assertThat(actual, containsString("inlineClassUnderlyingType")); + } + } } }