jvm-abi-gen: Reformat files and add comments

This commit is contained in:
Steven Schäfer
2021-08-19 14:15:08 +02:00
committed by Alexander Udalov
parent 023db4f376
commit fc6c2c9631
2 changed files with 55 additions and 28 deletions
@@ -65,14 +65,17 @@ sealed class AbiClassInfo {
class JvmAbiClassBuilderInterceptor : ClassBuilderInterceptorExtension { class JvmAbiClassBuilderInterceptor : ClassBuilderInterceptorExtension {
val abiClassInfo: MutableMap<String, AbiClassInfo> = mutableMapOf() val abiClassInfo: MutableMap<String, AbiClassInfo> = mutableMapOf()
override fun interceptClassBuilderFactory(interceptedFactory: ClassBuilderFactory, bindingContext: BindingContext, diagnostics: DiagnosticSink): ClassBuilderFactory = override fun interceptClassBuilderFactory(
object : DelegatingClassBuilderFactory(interceptedFactory) { interceptedFactory: ClassBuilderFactory,
override fun newClassBuilder(origin: JvmDeclarationOrigin): DelegatingClassBuilder { bindingContext: BindingContext,
val descriptor = origin.descriptor as? ClassDescriptor diagnostics: DiagnosticSink
val isPrivate = descriptor?.visibility?.let(DescriptorVisibilities::isPrivate) ?: false ): ClassBuilderFactory = object : DelegatingClassBuilderFactory(interceptedFactory) {
return AbiInfoClassBuilder(interceptedFactory.newClassBuilder(origin), isPrivate) override fun newClassBuilder(origin: JvmDeclarationOrigin): DelegatingClassBuilder {
} val descriptor = origin.descriptor as? ClassDescriptor
val isPrivate = descriptor?.visibility?.let(DescriptorVisibilities::isPrivate) ?: false
return AbiInfoClassBuilder(interceptedFactory.newClassBuilder(origin), isPrivate)
} }
}
private inner class AbiInfoClassBuilder( private inner class AbiInfoClassBuilder(
private val delegate: ClassBuilder, private val delegate: ClassBuilder,
@@ -86,8 +89,17 @@ class JvmAbiClassBuilderInterceptor : ClassBuilderInterceptorExtension {
override fun getDelegate(): ClassBuilder = delegate override fun getDelegate(): ClassBuilder = delegate
override fun defineClass(origin: PsiElement?, version: Int, access: Int, name: String, signature: String?, superName: String, interfaces: Array<out String>) { override fun defineClass(
origin: PsiElement?,
version: Int,
access: Int,
name: String,
signature: String?,
superName: String,
interfaces: Array<out String>
) {
// Always keep annotation classes // Always keep annotation classes
// TODO: Investigate whether there are cases where we can remove annotation classes from the ABI.
if (access and Opcodes.ACC_ANNOTATION != 0) { if (access and Opcodes.ACC_ANNOTATION != 0) {
publicAbi = true publicAbi = true
} }
@@ -101,7 +113,14 @@ class JvmAbiClassBuilderInterceptor : ClassBuilderInterceptorExtension {
super.visitOuterClass(owner, name, desc) super.visitOuterClass(owner, name, desc)
} }
override fun newMethod(origin: JvmDeclarationOrigin, access: Int, name: String, desc: String, signature: String?, exceptions: Array<out String>?): MethodVisitor { override fun newMethod(
origin: JvmDeclarationOrigin,
access: Int,
name: String,
desc: String,
signature: String?,
exceptions: Array<out String>?
): MethodVisitor {
if (publicAbi) { if (publicAbi) {
return super.newMethod(origin, access, name, desc, signature, exceptions) return super.newMethod(origin, access, name, desc, signature, exceptions)
} }
@@ -121,8 +140,10 @@ class JvmAbiClassBuilderInterceptor : ClassBuilderInterceptorExtension {
// Remove private functions from the ABI jars // Remove private functions from the ABI jars
val descriptor = origin.descriptor as? MemberDescriptor val descriptor = origin.descriptor as? MemberDescriptor
if (access and Opcodes.ACC_PRIVATE != 0 && descriptor?.visibility?.let(DescriptorVisibilities::isPrivate) == true if (
|| name == "<clinit>" || name.startsWith("access\$") && access and Opcodes.ACC_SYNTHETIC != 0) { access and Opcodes.ACC_PRIVATE != 0 && descriptor?.visibility?.let(DescriptorVisibilities::isPrivate) == true
|| name == "<clinit>" || name.startsWith("access\$") && access and Opcodes.ACC_SYNTHETIC != 0
) {
return super.newMethod(origin, access, name, desc, signature, exceptions) return super.newMethod(origin, access, name, desc, signature, exceptions)
} }
@@ -153,7 +174,7 @@ class JvmAbiClassBuilderInterceptor : ClassBuilderInterceptorExtension {
override fun done() { override fun done() {
// Remove local or anonymous classes unless they are in the scope of an inline function and // Remove local or anonymous classes unless they are in the scope of an inline function and
// strip non-inline methods from all other classe. // strip non-inline methods from all other classes.
when { when {
publicAbi -> publicAbi ->
abiClassInfo[internalName] = AbiClassInfo.Public abiClassInfo[internalName] = AbiClassInfo.Public
@@ -22,8 +22,12 @@ fun abiMetadataProcessor(annotationVisitor: AnnotationVisitor): AnnotationVisito
kotlinClassHeaderVisitor { header -> kotlinClassHeaderVisitor { header ->
// kotlinx-metadata only supports writing Kotlin metadata of version >= 1.4, so we need to // kotlinx-metadata only supports writing Kotlin metadata of version >= 1.4, so we need to
// update the metadata version if we encounter older metadata annotations. // update the metadata version if we encounter older metadata annotations.
val metadataVersion = val metadataVersion = header.metadataVersion.takeIf { v ->
if (header.metadataVersion.let { it.size >= 2 && it[0] >= 1 && it[1] >= 4 }) header.metadataVersion else intArrayOf(1, 4) val major = v.getOrNull(0) ?: 0
val minor = v.getOrNull(1) ?: 0
major > 1 || major == 1 && minor >= 4
} ?: intArrayOf(1, 4)
val newHeader = when (val metadata = KotlinClassMetadata.read(header)) { val newHeader = when (val metadata = KotlinClassMetadata.read(header)) {
is KotlinClassMetadata.Class -> { is KotlinClassMetadata.Class -> {
val writer = KotlinClassMetadata.Class.Writer() val writer = KotlinClassMetadata.Class.Writer()
@@ -70,30 +74,31 @@ private fun kotlinClassHeaderVisitor(body: (KotlinClassHeader) -> Unit): Annotat
} }
} }
override fun visitArray(name: String): AnnotationVisitor { override fun visitArray(name: String): AnnotationVisitor? {
val destination = when (name) { val destination = when (name) {
METADATA_DATA_FIELD_NAME -> data1 METADATA_DATA_FIELD_NAME -> data1
METADATA_STRINGS_FIELD_NAME -> data2 METADATA_STRINGS_FIELD_NAME -> data2
else -> error("Wrong array field in kotlin metadata: $name") else -> return null
} }
return object : AnnotationVisitor(Opcodes.ASM7) { return object : AnnotationVisitor(Opcodes.API_VERSION) {
override fun visit(name: String?, value: Any?) { override fun visit(name: String?, value: Any?) {
destination += value as String destination += value as String
} }
} }
} }
override fun visitEnd() { override fun visitEnd() {
body(KotlinClassHeader( body(
kind, KotlinClassHeader(
metadataVersion, kind,
data1.toTypedArray(), metadataVersion,
data2.toTypedArray(), data1.toTypedArray(),
extraString, data2.toTypedArray(),
packageName, extraString,
extraInt packageName,
)) extraInt
)
)
} }
} }
@@ -158,7 +163,8 @@ private class AbiKmClassVisitor(delegate: KmClassVisitor) : KmClassVisitor(deleg
} }
/** /**
* Class metadata adapter which removes private functions, properties, and type aliases. * Class metadata adapter which removes private functions, properties, type aliases,
* and local delegated properties.
*/ */
private class AbiKmPackageVisitor(delegate: KmPackageVisitor) : KmPackageVisitor(delegate) { private class AbiKmPackageVisitor(delegate: KmPackageVisitor) : KmPackageVisitor(delegate) {
override fun visitFunction(flags: Flags, name: String): KmFunctionVisitor? { override fun visitFunction(flags: Flags, name: String): KmFunctionVisitor? {