From fc6c2c9631cc152f5ec22cf3285706ece86d043e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Steven=20Sch=C3=A4fer?= Date: Thu, 19 Aug 2021 14:15:08 +0200 Subject: [PATCH] jvm-abi-gen: Reformat files and add comments --- .../jvm/abi/JvmAbiClassBuilderInterceptor.kt | 45 ++++++++++++++----- .../kotlin/jvm/abi/JvmAbiMetadataProcessor.kt | 38 +++++++++------- 2 files changed, 55 insertions(+), 28 deletions(-) diff --git a/plugins/jvm-abi-gen/src/org/jetbrains/kotlin/jvm/abi/JvmAbiClassBuilderInterceptor.kt b/plugins/jvm-abi-gen/src/org/jetbrains/kotlin/jvm/abi/JvmAbiClassBuilderInterceptor.kt index 78124b9d8de..837d7d9f863 100644 --- a/plugins/jvm-abi-gen/src/org/jetbrains/kotlin/jvm/abi/JvmAbiClassBuilderInterceptor.kt +++ b/plugins/jvm-abi-gen/src/org/jetbrains/kotlin/jvm/abi/JvmAbiClassBuilderInterceptor.kt @@ -65,14 +65,17 @@ sealed class AbiClassInfo { class JvmAbiClassBuilderInterceptor : ClassBuilderInterceptorExtension { val abiClassInfo: MutableMap = mutableMapOf() - override fun interceptClassBuilderFactory(interceptedFactory: ClassBuilderFactory, bindingContext: BindingContext, diagnostics: DiagnosticSink): ClassBuilderFactory = - object : DelegatingClassBuilderFactory(interceptedFactory) { - 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) - } + override fun interceptClassBuilderFactory( + interceptedFactory: ClassBuilderFactory, + bindingContext: BindingContext, + diagnostics: DiagnosticSink + ): ClassBuilderFactory = object : DelegatingClassBuilderFactory(interceptedFactory) { + 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 val delegate: ClassBuilder, @@ -86,8 +89,17 @@ class JvmAbiClassBuilderInterceptor : ClassBuilderInterceptorExtension { override fun getDelegate(): ClassBuilder = delegate - override fun defineClass(origin: PsiElement?, version: Int, access: Int, name: String, signature: String?, superName: String, interfaces: Array) { + override fun defineClass( + origin: PsiElement?, + version: Int, + access: Int, + name: String, + signature: String?, + superName: String, + interfaces: Array + ) { // 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) { publicAbi = true } @@ -101,7 +113,14 @@ class JvmAbiClassBuilderInterceptor : ClassBuilderInterceptorExtension { super.visitOuterClass(owner, name, desc) } - override fun newMethod(origin: JvmDeclarationOrigin, access: Int, name: String, desc: String, signature: String?, exceptions: Array?): MethodVisitor { + override fun newMethod( + origin: JvmDeclarationOrigin, + access: Int, + name: String, + desc: String, + signature: String?, + exceptions: Array? + ): MethodVisitor { if (publicAbi) { return super.newMethod(origin, access, name, desc, signature, exceptions) } @@ -121,8 +140,10 @@ class JvmAbiClassBuilderInterceptor : ClassBuilderInterceptorExtension { // Remove private functions from the ABI jars val descriptor = origin.descriptor as? MemberDescriptor - if (access and Opcodes.ACC_PRIVATE != 0 && descriptor?.visibility?.let(DescriptorVisibilities::isPrivate) == true - || name == "" || name.startsWith("access\$") && access and Opcodes.ACC_SYNTHETIC != 0) { + if ( + access and Opcodes.ACC_PRIVATE != 0 && descriptor?.visibility?.let(DescriptorVisibilities::isPrivate) == true + || name == "" || name.startsWith("access\$") && access and Opcodes.ACC_SYNTHETIC != 0 + ) { return super.newMethod(origin, access, name, desc, signature, exceptions) } @@ -153,7 +174,7 @@ class JvmAbiClassBuilderInterceptor : ClassBuilderInterceptorExtension { override fun done() { // 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 { publicAbi -> abiClassInfo[internalName] = AbiClassInfo.Public diff --git a/plugins/jvm-abi-gen/src/org/jetbrains/kotlin/jvm/abi/JvmAbiMetadataProcessor.kt b/plugins/jvm-abi-gen/src/org/jetbrains/kotlin/jvm/abi/JvmAbiMetadataProcessor.kt index ef7b09f8149..15d7d6dd3ff 100644 --- a/plugins/jvm-abi-gen/src/org/jetbrains/kotlin/jvm/abi/JvmAbiMetadataProcessor.kt +++ b/plugins/jvm-abi-gen/src/org/jetbrains/kotlin/jvm/abi/JvmAbiMetadataProcessor.kt @@ -22,8 +22,12 @@ fun abiMetadataProcessor(annotationVisitor: AnnotationVisitor): AnnotationVisito kotlinClassHeaderVisitor { header -> // 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. - val metadataVersion = - if (header.metadataVersion.let { it.size >= 2 && it[0] >= 1 && it[1] >= 4 }) header.metadataVersion else intArrayOf(1, 4) + val metadataVersion = header.metadataVersion.takeIf { v -> + 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)) { is KotlinClassMetadata.Class -> { 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) { METADATA_DATA_FIELD_NAME -> data1 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?) { destination += value as String } } } - override fun visitEnd() { - body(KotlinClassHeader( - kind, - metadataVersion, - data1.toTypedArray(), - data2.toTypedArray(), - extraString, - packageName, - extraInt - )) + body( + KotlinClassHeader( + kind, + metadataVersion, + data1.toTypedArray(), + data2.toTypedArray(), + extraString, + 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) { override fun visitFunction(flags: Flags, name: String): KmFunctionVisitor? {