Unify write() method and make it a member of KotlinClassMetadata

To make sure that the correct version and flags are preserved during metadata transformation,
they are now stored inside KotlinClassMetadata.
Such change also makes it possible to make write() a member function of KotlinClassMetadata, further simplifying API.
Also, it allows tracking whether readStrict or readLenient was used to read metadata and prohibit writing accordingly.

Also provide transform() method as a shortcut for readStrict+write.

Related to: #KT-59441
This commit is contained in:
Leonid Startsev
2023-10-31 18:52:19 +01:00
committed by Space Team
parent 36703ff9ae
commit f101e5a336
11 changed files with 466 additions and 218 deletions
@@ -81,7 +81,7 @@ private fun compileAndPrintAllFiles(
"class" -> {
val metadata = kotlinp.readClassFile(outputFile)
val classFile = KotlinClassMetadata.readStrict(metadata)
val classFile2 = KotlinClassMetadata.readStrict(transformClassFileWithNodes(metadata, classFile))
val classFile2 = KotlinClassMetadata.readStrict(classFile.write())
for ((sb, classFileToRender) in listOf(
main to classFile, afterNodes to classFile2
@@ -129,21 +129,6 @@ private fun StringBuilder.appendFileName(file: File) {
appendLine("// ------------------------------------------")
}
// Reads the class file and writes it back with KmClass/KmFunction/... elements.
private fun transformClassFileWithNodes(metadata: Metadata, classFile: KotlinClassMetadata): Metadata =
when (classFile) {
is KotlinClassMetadata.Class ->
KotlinClassMetadata.writeClass(classFile.kmClass)
is KotlinClassMetadata.FileFacade ->
KotlinClassMetadata.writeFileFacade(classFile.kmPackage)
is KotlinClassMetadata.SyntheticClass ->
classFile.kmLambda?.let { KotlinClassMetadata.writeLambda(it) } ?: KotlinClassMetadata.writeSyntheticClass()
is KotlinClassMetadata.MultiFileClassPart ->
KotlinClassMetadata.writeMultiFileClassPart(classFile.kmPackage, classFile.facadeClassName)
is KotlinClassMetadata.MultiFileClassFacade -> KotlinClassMetadata.writeMultiFileClassFacade(classFile.partClassNames)
is KotlinClassMetadata.Unknown -> metadata
}
@OptIn(UnstableMetadataApi::class)
private fun transformModuleFileWithNodes(moduleFile: KotlinModuleMetadata): ByteArray =
KotlinModuleMetadata.write(moduleFile.kmModule)