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
@@ -28,28 +28,19 @@ fun abiMetadataProcessor(annotationVisitor: AnnotationVisitor): AnnotationVisito
} ?: intArrayOf(1, 4)
val newHeader = runCatching {
when (val metadata = KotlinClassMetadata.readStrict(header)) {
is KotlinClassMetadata.Class -> {
val klass = metadata.kmClass
klass.removePrivateDeclarations()
KotlinClassMetadata.writeClass(klass, metadataVersion, header.extraInt)
KotlinClassMetadata.transform(header) { metadata ->
when (metadata) {
is KotlinClassMetadata.Class -> {
metadata.kmClass.removePrivateDeclarations()
}
is KotlinClassMetadata.FileFacade -> {
metadata.kmPackage.removePrivateDeclarations()
}
is KotlinClassMetadata.MultiFileClassPart -> {
metadata.kmPackage.removePrivateDeclarations()
}
else -> Unit
}
is KotlinClassMetadata.FileFacade -> {
val pkg = metadata.kmPackage
pkg.removePrivateDeclarations()
KotlinClassMetadata.writeFileFacade(pkg, metadataVersion, header.extraInt)
}
is KotlinClassMetadata.MultiFileClassPart -> {
val pkg = metadata.kmPackage
pkg.removePrivateDeclarations()
KotlinClassMetadata.writeMultiFileClassPart(
pkg,
metadata.facadeClassName,
metadataVersion,
header.extraInt
)
}
else -> header
}
}.getOrElse { cause ->
// TODO: maybe jvm-abi-gen should throw this exception by default, and not only in tests.