Update jvm-abi-gen to kotlinx-metadata-jvm's Km* node API

This commit is contained in:
Alexander Udalov
2023-01-11 23:39:26 +01:00
parent 5ef372aab5
commit 3197a118ab
@@ -3,15 +3,15 @@
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
@file:Suppress("DEPRECATION")
package org.jetbrains.kotlin.jvm.abi
import kotlinx.metadata.*
import kotlinx.metadata.jvm.JvmClassExtensionVisitor
import kotlinx.metadata.jvm.JvmPackageExtensionVisitor
import kotlinx.metadata.jvm.KotlinClassHeader
import kotlinx.metadata.Flag
import kotlinx.metadata.Flags
import kotlinx.metadata.KmClass
import kotlinx.metadata.KmPackage
import kotlinx.metadata.jvm.KotlinClassMetadata
import kotlinx.metadata.jvm.Metadata
import kotlinx.metadata.jvm.localDelegatedProperties
import org.jetbrains.kotlin.load.java.JvmAnnotationNames.*
import org.jetbrains.org.objectweb.asm.AnnotationVisitor
import org.jetbrains.org.objectweb.asm.Opcodes
@@ -32,19 +32,19 @@ fun abiMetadataProcessor(annotationVisitor: AnnotationVisitor): AnnotationVisito
val newHeader = when (val metadata = KotlinClassMetadata.read(header)) {
is KotlinClassMetadata.Class -> {
val writer = KotlinClassMetadata.Class.Writer()
metadata.accept(AbiKmClassVisitor(writer))
writer.write(metadataVersion, header.extraInt).annotationData
val klass = metadata.toKmClass()
klass.removePrivateDeclarations()
KotlinClassMetadata.writeClass(klass, metadataVersion, header.extraInt).annotationData
}
is KotlinClassMetadata.FileFacade -> {
val writer = KotlinClassMetadata.FileFacade.Writer()
metadata.accept(AbiKmPackageVisitor(writer))
writer.write(metadataVersion, header.extraInt).annotationData
val pkg = metadata.toKmPackage()
pkg.removePrivateDeclarations()
KotlinClassMetadata.writeFileFacade(pkg, metadataVersion, header.extraInt).annotationData
}
is KotlinClassMetadata.MultiFileClassPart -> {
val writer = KotlinClassMetadata.MultiFileClassPart.Writer()
metadata.accept(AbiKmPackageVisitor(writer))
writer.write(metadata.facadeClassName, metadataVersion, header.extraInt).annotationData
val pkg = metadata.toKmPackage()
pkg.removePrivateDeclarations()
KotlinClassMetadata.writeMultiFileClassPart(pkg, metadata.facadeClassName, metadataVersion, header.extraInt).annotationData
}
else -> header
}
@@ -56,7 +56,7 @@ fun abiMetadataProcessor(annotationVisitor: AnnotationVisitor): AnnotationVisito
/**
* Parse a KotlinClassHeader from an existing Kotlin Metadata annotation visitor.
*/
private fun kotlinClassHeaderVisitor(body: (KotlinClassHeader) -> Unit): AnnotationVisitor =
private fun kotlinClassHeaderVisitor(body: (Metadata) -> Unit): AnnotationVisitor =
object : AnnotationVisitor(Opcodes.API_VERSION) {
var kind: Int = 1
var metadataVersion: IntArray = intArrayOf()
@@ -91,7 +91,7 @@ private fun kotlinClassHeaderVisitor(body: (KotlinClassHeader) -> Unit): Annotat
override fun visitEnd() {
body(
KotlinClassHeader(
Metadata(
kind,
metadataVersion,
data1.toTypedArray(),
@@ -134,70 +134,19 @@ private fun AnnotationVisitor.visitKotlinMetadata(header: Metadata) {
visitEnd()
}
/**
* Class metadata adapter which removes private functions, properties, type aliases,
* and local delegated properties.
*/
private class AbiKmClassVisitor(delegate: KmClassVisitor) : KmClassVisitor(delegate) {
override fun visitConstructor(flags: Flags): KmConstructorVisitor? {
if (!isPrivateDeclaration(flags))
return super.visitConstructor(flags)
return null
}
override fun visitFunction(flags: Flags, name: String): KmFunctionVisitor? {
if (!isPrivateDeclaration(flags))
return super.visitFunction(flags, name)
return null
}
override fun visitProperty(flags: Flags, name: String, getterFlags: Flags, setterFlags: Flags): KmPropertyVisitor? {
if (!isPrivateDeclaration(flags))
return super.visitProperty(flags, name, getterFlags, setterFlags)
return null
}
private fun KmClass.removePrivateDeclarations() {
constructors.removeIf { isPrivateDeclaration(it.flags) }
functions.removeIf { isPrivateDeclaration(it.flags) }
properties.removeIf { isPrivateDeclaration(it.flags) }
localDelegatedProperties.clear()
// TODO: do not serialize private type aliases once KT-17229 is fixed.
override fun visitExtensions(type: KmExtensionType): KmClassExtensionVisitor? {
val delegate = super.visitExtensions(type)
if (type != JvmClassExtensionVisitor.TYPE) return delegate
return object : JvmClassExtensionVisitor(delegate as JvmClassExtensionVisitor?) {
override fun visitLocalDelegatedProperty(
flags: Flags, name: String, getterFlags: Flags, setterFlags: Flags
): KmPropertyVisitor? = null
}
}
}
/**
* Class metadata adapter which removes private functions, properties, type aliases,
* and local delegated properties.
*/
private class AbiKmPackageVisitor(delegate: KmPackageVisitor) : KmPackageVisitor(delegate) {
override fun visitFunction(flags: Flags, name: String): KmFunctionVisitor? {
if (!isPrivateDeclaration(flags))
return super.visitFunction(flags, name)
return null
}
override fun visitProperty(flags: Flags, name: String, getterFlags: Flags, setterFlags: Flags): KmPropertyVisitor? {
if (!isPrivateDeclaration(flags))
return super.visitProperty(flags, name, getterFlags, setterFlags)
return null
}
private fun KmPackage.removePrivateDeclarations() {
functions.removeIf { isPrivateDeclaration(it.flags) }
properties.removeIf { isPrivateDeclaration(it.flags) }
localDelegatedProperties.clear()
// TODO: do not serialize private type aliases once KT-17229 is fixed.
override fun visitExtensions(type: KmExtensionType): KmPackageExtensionVisitor? {
val delegate = super.visitExtensions(type)
if (type != JvmPackageExtensionVisitor.TYPE) return delegate
return object : JvmPackageExtensionVisitor(delegate as JvmPackageExtensionVisitor?) {
override fun visitLocalDelegatedProperty(
flags: Flags, name: String, getterFlags: Flags, setterFlags: Flags
): KmPropertyVisitor? = null
}
}
}
private fun isPrivateDeclaration(flags: Flags): Boolean =