From f450122d63b447cea460e32523d9f5dceab50a52 Mon Sep 17 00:00:00 2001 From: Leonid Startsev Date: Tue, 25 Jul 2023 16:41:51 +0200 Subject: [PATCH] Refactor MetadataExtensions.kt to remove extension visitors This helps to completely get rid of Visitors API during reading and writing of the JVM metadata. Note: Klib writers still use .accept and left for future refactorings. See also #KT-59442 --- .../metadata/jvm/JvmExtensionVisitors.kt | 2 +- .../metadata/jvm/KotlinClassMetadata.kt | 5 +- .../metadata/jvm/KotlinModuleMetadata.kt | 6 +- .../jvm/internal/JvmExtensionNodes.kt | 2 +- .../jvm/internal/JvmMetadataExtensions.kt | 274 +++++++----------- .../metadata/klib/KlibModuleMetadata.kt | 1 - .../metadata/klib/impl/klibExtensionNodes.kt | 2 +- .../klib/impl/klibMetadataExtensions.kt | 126 ++++---- .../klib/klibMetadataExtensionVisitors.kt | 2 +- .../src/kotlinx/metadata/Nodes.kt | 2 +- .../src/kotlinx/metadata/internal/Readers.kt | 40 +-- .../kotlinx/metadata/internal/WriteUtils.kt | 9 - .../src/kotlinx/metadata/internal/Writers.kt | 39 ++- .../internal/common/KotlinCommonMetadata.kt | 8 +- .../internal/extensions/ExtensionNodes.kt | 2 +- .../internal/extensions/ExtensionUtils.kt | 26 +- .../internal/extensions/MetadataExtensions.kt | 49 ++-- .../kotlin/kotlinp/test/KotlinpTestUtils.kt | 4 +- 18 files changed, 241 insertions(+), 358 deletions(-) diff --git a/libraries/kotlinx-metadata/jvm/src/kotlinx/metadata/jvm/JvmExtensionVisitors.kt b/libraries/kotlinx-metadata/jvm/src/kotlinx/metadata/jvm/JvmExtensionVisitors.kt index ac64ce6a913..8e9a9d30dc6 100644 --- a/libraries/kotlinx-metadata/jvm/src/kotlinx/metadata/jvm/JvmExtensionVisitors.kt +++ b/libraries/kotlinx-metadata/jvm/src/kotlinx/metadata/jvm/JvmExtensionVisitors.kt @@ -2,7 +2,7 @@ * Copyright 2010-2018 JetBrains s.r.o. and Kotlin Programming Language contributors. * 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_ERROR") +@file:Suppress("DEPRECATION_ERROR") // delegate implementation package kotlinx.metadata.jvm diff --git a/libraries/kotlinx-metadata/jvm/src/kotlinx/metadata/jvm/KotlinClassMetadata.kt b/libraries/kotlinx-metadata/jvm/src/kotlinx/metadata/jvm/KotlinClassMetadata.kt index f4ff16fc951..9fd3eb9e424 100644 --- a/libraries/kotlinx-metadata/jvm/src/kotlinx/metadata/jvm/KotlinClassMetadata.kt +++ b/libraries/kotlinx-metadata/jvm/src/kotlinx/metadata/jvm/KotlinClassMetadata.kt @@ -2,7 +2,10 @@ * Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors. * 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_ERROR", "UNUSED_PARAMETER") +@file:Suppress( + "DEPRECATION_ERROR", // Deprecated .accept implementation + "UNUSED_PARAMETER" // For deprecated Writer.write +) package kotlinx.metadata.jvm diff --git a/libraries/kotlinx-metadata/jvm/src/kotlinx/metadata/jvm/KotlinModuleMetadata.kt b/libraries/kotlinx-metadata/jvm/src/kotlinx/metadata/jvm/KotlinModuleMetadata.kt index 95d70cf4de4..0d3db83a896 100644 --- a/libraries/kotlinx-metadata/jvm/src/kotlinx/metadata/jvm/KotlinModuleMetadata.kt +++ b/libraries/kotlinx-metadata/jvm/src/kotlinx/metadata/jvm/KotlinModuleMetadata.kt @@ -5,11 +5,11 @@ @file:Suppress( "MemberVisibilityCanBePrivate", - "DEPRECATION", - "DEPRECATION_ERROR", + "DEPRECATION", // For KmModule.annotations — remove reading when deprecation is raised to error + "DEPRECATION_ERROR", // deprecated .accept implementation "INVISIBLE_MEMBER", // InconsistentKotlinMetadataException "INVISIBLE_REFERENCE", - "UNUSED_PARAMETER" + "UNUSED_PARAMETER" // For deprecated Writer.write ) package kotlinx.metadata.jvm diff --git a/libraries/kotlinx-metadata/jvm/src/kotlinx/metadata/jvm/internal/JvmExtensionNodes.kt b/libraries/kotlinx-metadata/jvm/src/kotlinx/metadata/jvm/internal/JvmExtensionNodes.kt index c5e28531812..f10c2c3b6a2 100644 --- a/libraries/kotlinx-metadata/jvm/src/kotlinx/metadata/jvm/internal/JvmExtensionNodes.kt +++ b/libraries/kotlinx-metadata/jvm/src/kotlinx/metadata/jvm/internal/JvmExtensionNodes.kt @@ -2,7 +2,7 @@ * Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors. * 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","DEPRECATION_ERROR") +@file:Suppress("DEPRECATION","DEPRECATION_ERROR") // inheritance of deprecated visitors will be removed with visitors package kotlinx.metadata.jvm.internal diff --git a/libraries/kotlinx-metadata/jvm/src/kotlinx/metadata/jvm/internal/JvmMetadataExtensions.kt b/libraries/kotlinx-metadata/jvm/src/kotlinx/metadata/jvm/internal/JvmMetadataExtensions.kt index dbd0212d1c7..3a4cf45d163 100644 --- a/libraries/kotlinx-metadata/jvm/src/kotlinx/metadata/jvm/internal/JvmMetadataExtensions.kt +++ b/libraries/kotlinx-metadata/jvm/src/kotlinx/metadata/jvm/internal/JvmMetadataExtensions.kt @@ -15,272 +15,212 @@ import org.jetbrains.kotlin.metadata.deserialization.getExtensionOrNull import org.jetbrains.kotlin.metadata.jvm.JvmProtoBuf import org.jetbrains.kotlin.metadata.jvm.deserialization.JvmProtoBufUtil -@Suppress("DEPRECATION_ERROR") internal class JvmMetadataExtensions : MetadataExtensions { - override fun readClassExtensions(v: KmClassVisitor, proto: ProtoBuf.Class, c: ReadContext) { - val ext = v.visitExtensions(JvmClassExtensionVisitor.TYPE) as? JvmClassExtensionVisitor ?: return - ext as JvmClassExtension + override fun readClassExtensions(kmClass: KmClass, proto: ProtoBuf.Class, c: ReadContext) { + val ext = kmClass.jvm val anonymousObjectOriginName = proto.getExtensionOrNull(JvmProtoBuf.anonymousObjectOriginName) if (anonymousObjectOriginName != null) { - ext.visitAnonymousObjectOriginName(c[anonymousObjectOriginName]) + ext.anonymousObjectOriginName = c[anonymousObjectOriginName] } for (property in proto.getExtension(JvmProtoBuf.classLocalVariable)) { ext.localDelegatedProperties.add(property.toKmProperty(c)) } - ext.visitModuleName(proto.getExtensionOrNull(JvmProtoBuf.classModuleName)?.let(c::get) ?: JvmProtoBufUtil.DEFAULT_MODULE_NAME) + ext.moduleName = proto.getExtensionOrNull(JvmProtoBuf.classModuleName)?.let(c::get) ?: JvmProtoBufUtil.DEFAULT_MODULE_NAME - proto.getExtensionOrNull(JvmProtoBuf.jvmClassFlags)?.let(ext::visitJvmFlags) - - ext.visitEnd() + proto.getExtensionOrNull(JvmProtoBuf.jvmClassFlags)?.let { + ext.jvmFlags = it + } } - override fun readPackageExtensions(v: KmPackageVisitor, proto: ProtoBuf.Package, c: ReadContext) { - val ext = v.visitExtensions(JvmPackageExtensionVisitor.TYPE) as? JvmPackageExtensionVisitor ?: return - ext as JvmPackageExtension + override fun readPackageExtensions(kmPackage: KmPackage, proto: ProtoBuf.Package, c: ReadContext) { + val ext = kmPackage.jvm for (property in proto.getExtension(JvmProtoBuf.packageLocalVariable)) { ext.localDelegatedProperties.add(property.toKmProperty(c)) } - ext.visitModuleName(proto.getExtensionOrNull(JvmProtoBuf.packageModuleName)?.let(c::get) ?: JvmProtoBufUtil.DEFAULT_MODULE_NAME) - - ext.visitEnd() + ext.moduleName = proto.getExtensionOrNull(JvmProtoBuf.packageModuleName)?.let(c::get) ?: JvmProtoBufUtil.DEFAULT_MODULE_NAME } // ModuleFragment is not used by JVM backend. - override fun readModuleFragmentExtensions(v: KmModuleFragmentVisitor, proto: ProtoBuf.PackageFragment, c: ReadContext) {} + override fun readModuleFragmentExtensions(kmModuleFragment: KmModuleFragment, proto: ProtoBuf.PackageFragment, c: ReadContext) {} - override fun readFunctionExtensions(v: KmFunctionVisitor, proto: ProtoBuf.Function, c: ReadContext) { - val ext = v.visitExtensions(JvmFunctionExtensionVisitor.TYPE) as? JvmFunctionExtensionVisitor ?: return - ext.visit(JvmProtoBufUtil.getJvmMethodSignature(proto, c.strings, c.types)?.wrapAsPublic()) + override fun readFunctionExtensions(kmFunction: KmFunction, proto: ProtoBuf.Function, c: ReadContext) { + val ext = kmFunction.jvm + ext.signature = JvmProtoBufUtil.getJvmMethodSignature(proto, c.strings, c.types)?.wrapAsPublic() val lambdaClassOriginName = proto.getExtensionOrNull(JvmProtoBuf.lambdaClassOriginName) if (lambdaClassOriginName != null) { - ext.visitLambdaClassOriginName(c[lambdaClassOriginName]) + ext.lambdaClassOriginName = c[lambdaClassOriginName] } - - ext.visitEnd() } - override fun readPropertyExtensions(v: KmPropertyVisitor, proto: ProtoBuf.Property, c: ReadContext) { - val ext = v.visitExtensions(JvmPropertyExtensionVisitor.TYPE) as? JvmPropertyExtensionVisitor ?: return + override fun readPropertyExtensions(kmProperty: KmProperty, proto: ProtoBuf.Property, c: ReadContext) { + val ext = kmProperty.jvm val fieldSignature = JvmProtoBufUtil.getJvmFieldSignature(proto, c.strings, c.types) val propertySignature = proto.getExtensionOrNull(JvmProtoBuf.propertySignature) val getterSignature = if (propertySignature != null && propertySignature.hasGetter()) propertySignature.getter else null val setterSignature = if (propertySignature != null && propertySignature.hasSetter()) propertySignature.setter else null - ext.visit( - proto.getExtension(JvmProtoBuf.flags), - fieldSignature?.wrapAsPublic(), - getterSignature?.run { JvmMethodSignature(c[name], c[desc]) }, - setterSignature?.run { JvmMethodSignature(c[name], c[desc]) } - ) + ext.jvmFlags = proto.getExtension(JvmProtoBuf.flags) + ext.fieldSignature = fieldSignature?.wrapAsPublic() + ext.getterSignature = getterSignature?.run { JvmMethodSignature(c[name], c[desc]) } + ext.setterSignature = setterSignature?.run { JvmMethodSignature(c[name], c[desc]) } val syntheticMethod = if (propertySignature != null && propertySignature.hasSyntheticMethod()) propertySignature.syntheticMethod else null - ext.visitSyntheticMethodForAnnotations(syntheticMethod?.run { JvmMethodSignature(c[name], c[desc]) }) + ext.syntheticMethodForAnnotations = syntheticMethod?.run { JvmMethodSignature(c[name], c[desc]) } val delegateMethod = if (propertySignature != null && propertySignature.hasDelegateMethod()) propertySignature.delegateMethod else null - ext.visitSyntheticMethodForDelegate(delegateMethod?.run { JvmMethodSignature(c[name], c[desc]) }) - - ext.visitEnd() + ext.syntheticMethodForDelegate = delegateMethod?.run { JvmMethodSignature(c[name], c[desc]) } } - override fun readConstructorExtensions(v: KmConstructorVisitor, proto: ProtoBuf.Constructor, c: ReadContext) { - val ext = v.visitExtensions(JvmConstructorExtensionVisitor.TYPE) as? JvmConstructorExtensionVisitor ?: return - ext.visit(JvmProtoBufUtil.getJvmConstructorSignature(proto, c.strings, c.types)?.wrapAsPublic()) + override fun readConstructorExtensions(kmConstructor: KmConstructor, proto: ProtoBuf.Constructor, c: ReadContext) { + val ext = kmConstructor.jvm + ext.signature = JvmProtoBufUtil.getJvmConstructorSignature(proto, c.strings, c.types)?.wrapAsPublic() } - override fun readTypeParameterExtensions(v: KmTypeParameterVisitor, proto: ProtoBuf.TypeParameter, c: ReadContext) { - val ext = v.visitExtensions(JvmTypeParameterExtensionVisitor.TYPE) as? JvmTypeParameterExtensionVisitor ?: return + override fun readTypeParameterExtensions(kmTypeParameter: KmTypeParameter, proto: ProtoBuf.TypeParameter, c: ReadContext) { + val ext = kmTypeParameter.jvm for (annotation in proto.getExtension(JvmProtoBuf.typeParameterAnnotation)) { - ext.visitAnnotation(annotation.readAnnotation(c.strings)) + ext.annotations.add(annotation.readAnnotation(c.strings)) } - ext.visitEnd() } - override fun readTypeExtensions(v: KmTypeVisitor, proto: ProtoBuf.Type, c: ReadContext) { - val ext = v.visitExtensions(JvmTypeExtensionVisitor.TYPE) as? JvmTypeExtensionVisitor ?: return - ext.visit(proto.getExtension(JvmProtoBuf.isRaw)) + override fun readTypeExtensions(kmType: KmType, proto: ProtoBuf.Type, c: ReadContext) { + val ext = kmType.jvm + ext.isRaw = proto.getExtension(JvmProtoBuf.isRaw) for (annotation in proto.getExtension(JvmProtoBuf.typeAnnotation)) { - ext.visitAnnotation(annotation.readAnnotation(c.strings)) + ext.annotations.add(annotation.readAnnotation(c.strings)) } - ext.visitEnd() } - override fun readTypeAliasExtensions(v: KmTypeAliasVisitor, proto: ProtoBuf.TypeAlias, c: ReadContext) {} + override fun readTypeAliasExtensions(kmTypeAlias: KmTypeAlias, proto: ProtoBuf.TypeAlias, c: ReadContext) {} - override fun readValueParameterExtensions(v: KmValueParameterVisitor, proto: ProtoBuf.ValueParameter, c: ReadContext) {} + override fun readValueParameterExtensions(kmValueParameter: KmValueParameter, proto: ProtoBuf.ValueParameter, c: ReadContext) {} - override fun writeClassExtensions(extension: KmClassExtension, proto: ProtoBuf.Class.Builder, c: WriteContext): Boolean { - if (extension.type != JvmClassExtensionVisitor.TYPE) return false - extension as JvmClassExtension - extension.anonymousObjectOriginName?.let { proto.setExtension(JvmProtoBuf.anonymousObjectOriginName, c[it]) } - extension.localDelegatedProperties.forEach { - proto.addExtension(JvmProtoBuf.classLocalVariable, c.writeProperty(it).build()) + override fun writeClassExtensions(kmClass: KmClass, proto: ProtoBuf.Class.Builder, c: WriteContext) = + with(kmClass.jvm) { + anonymousObjectOriginName?.let { + proto.setExtension(JvmProtoBuf.anonymousObjectOriginName, c[it]) + } + localDelegatedProperties.forEach { + proto.addExtension(JvmProtoBuf.classLocalVariable, c.writeProperty(it).build()) + } + moduleName?.let { moduleName -> + if (moduleName != JvmProtoBufUtil.DEFAULT_MODULE_NAME) proto.setExtension(JvmProtoBuf.classModuleName, c[moduleName]) + } + if (jvmFlags != 0) proto.setExtension(JvmProtoBuf.jvmClassFlags, jvmFlags) } - extension.moduleName?.let { moduleName -> - if (moduleName != JvmProtoBufUtil.DEFAULT_MODULE_NAME) proto.setExtension(JvmProtoBuf.classModuleName, c[moduleName]) - } - if (extension.jvmFlags != 0) proto.setExtension(JvmProtoBuf.jvmClassFlags, extension.jvmFlags) - return true - } override fun writePackageExtensions( - extension: KmPackageExtension, proto: ProtoBuf.Package.Builder, c: WriteContext - ): Boolean { - if (extension.type != JvmPackageExtensionVisitor.TYPE) return false - extension as JvmPackageExtension - extension.localDelegatedProperties.forEach { + kmPackage: KmPackage, proto: ProtoBuf.Package.Builder, c: WriteContext, + ): Unit = with(kmPackage.jvm) { + localDelegatedProperties.forEach { proto.addExtension(JvmProtoBuf.packageLocalVariable, c.writeProperty(it).build()) } - extension.moduleName?.let { name -> + moduleName?.let { name -> if (name != JvmProtoBufUtil.DEFAULT_MODULE_NAME) { proto.setExtension(JvmProtoBuf.packageModuleName, c[name]) } } - return true } // PackageFragment is not used by JVM backend. override fun writeModuleFragmentExtensions( - type: KmExtensionType, + kmModuleFragment: KmModuleFragment, proto: ProtoBuf.PackageFragment.Builder, - c: WriteContext - ): KmModuleFragmentExtensionVisitor? = null + c: WriteContext, + ) = Unit override fun writeFunctionExtensions( - type: KmExtensionType, proto: ProtoBuf.Function.Builder, c: WriteContext - ): KmFunctionExtensionVisitor? { - if (type != JvmFunctionExtensionVisitor.TYPE) return null - return object : JvmFunctionExtensionVisitor() { - override fun visit(signature: JvmMethodSignature?) { - if (signature != null) { - proto.setExtension(JvmProtoBuf.methodSignature, signature.toJvmMethodSignature(c)) - } - } - - override fun visitLambdaClassOriginName(internalName: String) { - proto.setExtension(JvmProtoBuf.lambdaClassOriginName, c[internalName]) - } + kmFunction: KmFunction, proto: ProtoBuf.Function.Builder, c: WriteContext, + ) { + with(kmFunction.jvm) { + signature?.let { proto.setExtension(JvmProtoBuf.methodSignature, it.toJvmMethodSignature(c)) } + lambdaClassOriginName?.let { proto.setExtension(JvmProtoBuf.lambdaClassOriginName, c[it]) } } } override fun writePropertyExtensions( - type: KmExtensionType, proto: ProtoBuf.Property.Builder, c: WriteContext - ): KmPropertyExtensionVisitor? { - if (type != JvmPropertyExtensionVisitor.TYPE) return null - return object : JvmPropertyExtensionVisitor() { - private var jvmFlags: Int = ProtoBuf.Property.getDefaultInstance().getExtension(JvmProtoBuf.flags) - private var signatureOrNull: JvmProtoBuf.JvmPropertySignature.Builder? = null + kmProperty: KmProperty, proto: ProtoBuf.Property.Builder, c: WriteContext, + ) = with(kmProperty.jvm) { + val composedSignature: JvmProtoBuf.JvmPropertySignature.Builder = JvmProtoBuf.JvmPropertySignature.newBuilder() + var hasSignature = false - private val signature: JvmProtoBuf.JvmPropertySignature.Builder - get() = signatureOrNull ?: JvmProtoBuf.JvmPropertySignature.newBuilder().also { signatureOrNull = it } - - override fun visit( - jvmFlags: Int, - fieldSignature: JvmFieldSignature?, - getterSignature: JvmMethodSignature?, - setterSignature: JvmMethodSignature? - ) { - this.jvmFlags = jvmFlags - if (fieldSignature != null) { - signature.field = JvmProtoBuf.JvmFieldSignature.newBuilder().also { field -> - field.name = c[fieldSignature.name] - field.desc = c[fieldSignature.descriptor] - }.build() - } - if (getterSignature != null) { - signature.getter = getterSignature.toJvmMethodSignature(c) - } - if (setterSignature != null) { - signature.setter = setterSignature.toJvmMethodSignature(c) - } - } - - override fun visitSyntheticMethodForAnnotations(signature: JvmMethodSignature?) { - if (signature == null) return - - this.signature.syntheticMethod = signature.toJvmMethodSignature(c) - } - - override fun visitSyntheticMethodForDelegate(signature: JvmMethodSignature?) { - if (signature == null) return - - this.signature.delegateMethod = signature.toJvmMethodSignature(c) - } - - override fun visitEnd() { - if (jvmFlags != ProtoBuf.Property.getDefaultInstance().getExtension(JvmProtoBuf.flags)) { - proto.setExtension(JvmProtoBuf.flags, jvmFlags) - } - if (signatureOrNull != null) { - proto.setExtension(JvmProtoBuf.propertySignature, signature.build()) - } - } + if (fieldSignature != null) { + hasSignature = true + composedSignature.field = JvmProtoBuf.JvmFieldSignature.newBuilder().also { field -> + field.name = c[fieldSignature!!.name] + field.desc = c[fieldSignature!!.descriptor] + }.build() + } + if (getterSignature != null) { + hasSignature = true + composedSignature.getter = getterSignature!!.toJvmMethodSignature(c) + } + if (setterSignature != null) { + hasSignature = true + composedSignature.setter = setterSignature!!.toJvmMethodSignature(c) + } + if (hasSignature && syntheticMethodForAnnotations != null) { + composedSignature.syntheticMethod = syntheticMethodForAnnotations!!.toJvmMethodSignature(c) + } + if (hasSignature && syntheticMethodForDelegate != null) { + composedSignature.delegateMethod = syntheticMethodForDelegate!!.toJvmMethodSignature(c) + } + if (jvmFlags != ProtoBuf.Property.getDefaultInstance().getExtension(JvmProtoBuf.flags)) { + proto.setExtension(JvmProtoBuf.flags, jvmFlags) + } + if (hasSignature) { + proto.setExtension(JvmProtoBuf.propertySignature, composedSignature.build()) } } override fun writeConstructorExtensions( - type: KmExtensionType, proto: ProtoBuf.Constructor.Builder, c: WriteContext - ): KmConstructorExtensionVisitor? { - if (type != JvmConstructorExtensionVisitor.TYPE) return null - return object : JvmConstructorExtensionVisitor() { - override fun visit(signature: JvmMethodSignature?) { - if (signature != null) { - proto.setExtension(JvmProtoBuf.constructorSignature, signature.toJvmMethodSignature(c)) - } - } - } + kmConstructor: KmConstructor, proto: ProtoBuf.Constructor.Builder, c: WriteContext, + ): Unit = with(kmConstructor.jvm) { + signature?.let { proto.setExtension(JvmProtoBuf.constructorSignature, it.toJvmMethodSignature(c)) } } override fun writeTypeParameterExtensions( - type: KmExtensionType, proto: ProtoBuf.TypeParameter.Builder, c: WriteContext - ): KmTypeParameterExtensionVisitor? { - if (type != JvmTypeParameterExtensionVisitor.TYPE) return null - return object : JvmTypeParameterExtensionVisitor() { - override fun visitAnnotation(annotation: KmAnnotation) { - proto.addExtension(JvmProtoBuf.typeParameterAnnotation, annotation.writeAnnotation(c.strings).build()) - } + kmTypeParameter: KmTypeParameter, proto: ProtoBuf.TypeParameter.Builder, c: WriteContext, + ) = with(kmTypeParameter.jvm) { + annotations.forEach { annotation -> + proto.addExtension(JvmProtoBuf.typeParameterAnnotation, annotation.writeAnnotation(c.strings).build()) } } - override fun writeTypeExtensions(type: KmExtensionType, proto: ProtoBuf.Type.Builder, c: WriteContext): KmTypeExtensionVisitor? { - if (type != JvmTypeExtensionVisitor.TYPE) return null - return object : JvmTypeExtensionVisitor() { - override fun visit(isRaw: Boolean) { - if (isRaw) { - proto.setExtension(JvmProtoBuf.isRaw, true) - } - } - - override fun visitAnnotation(annotation: KmAnnotation) { + override fun writeTypeExtensions(type: KmType, proto: ProtoBuf.Type.Builder, c: WriteContext) = + with(type.jvm) { + if (isRaw) proto.setExtension(JvmProtoBuf.isRaw, true) + annotations.forEach { annotation -> proto.addExtension(JvmProtoBuf.typeAnnotation, annotation.writeAnnotation(c.strings).build()) } } - } override fun writeTypeAliasExtensions( - type: KmExtensionType, + typeAlias: KmTypeAlias, proto: ProtoBuf.TypeAlias.Builder, - c: WriteContext - ): KmTypeAliasExtensionVisitor? = null + c: WriteContext, + ) = Unit override fun writeValueParameterExtensions( - type: KmExtensionType, + valueParameter: KmValueParameter, proto: ProtoBuf.ValueParameter.Builder, - c: WriteContext - ): KmValueParameterExtensionVisitor? = null + c: WriteContext, + ) = Unit override fun createClassExtension(): KmClassExtension = JvmClassExtension() override fun createPackageExtension(): KmPackageExtension = JvmPackageExtension() + @Suppress("DEPRECATION_ERROR") override fun createModuleFragmentExtensions(): KmModuleFragmentExtension = object : KmModuleFragmentExtension { override val type: KmExtensionType = KmExtensionType(KmModuleFragmentExtension::class) diff --git a/libraries/kotlinx-metadata/klib/src/kotlinx/metadata/klib/KlibModuleMetadata.kt b/libraries/kotlinx-metadata/klib/src/kotlinx/metadata/klib/KlibModuleMetadata.kt index 2492b4e1571..f70b086dc44 100644 --- a/libraries/kotlinx-metadata/klib/src/kotlinx/metadata/klib/KlibModuleMetadata.kt +++ b/libraries/kotlinx-metadata/klib/src/kotlinx/metadata/klib/KlibModuleMetadata.kt @@ -2,7 +2,6 @@ * Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors. * 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_ERROR") package kotlinx.metadata.klib diff --git a/libraries/kotlinx-metadata/klib/src/kotlinx/metadata/klib/impl/klibExtensionNodes.kt b/libraries/kotlinx-metadata/klib/src/kotlinx/metadata/klib/impl/klibExtensionNodes.kt index 635a9bbd322..edf52ffbab3 100644 --- a/libraries/kotlinx-metadata/klib/src/kotlinx/metadata/klib/impl/klibExtensionNodes.kt +++ b/libraries/kotlinx-metadata/klib/src/kotlinx/metadata/klib/impl/klibExtensionNodes.kt @@ -2,7 +2,7 @@ * Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors. * 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_ERROR") +@file:Suppress("DEPRECATION_ERROR") // Extension visitors package kotlinx.metadata.klib.impl diff --git a/libraries/kotlinx-metadata/klib/src/kotlinx/metadata/klib/impl/klibMetadataExtensions.kt b/libraries/kotlinx-metadata/klib/src/kotlinx/metadata/klib/impl/klibMetadataExtensions.kt index 273e74a72f2..1d5403f66ec 100644 --- a/libraries/kotlinx-metadata/klib/src/kotlinx/metadata/klib/impl/klibMetadataExtensions.kt +++ b/libraries/kotlinx-metadata/klib/src/kotlinx/metadata/klib/impl/klibMetadataExtensions.kt @@ -18,7 +18,7 @@ import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.serialization.StringTableImpl -@Suppress("DEPRECATION", "DEPRECATION_ERROR") +@Suppress("DEPRECATION_ERROR") internal class KlibMetadataExtensions : MetadataExtensions { private fun ReadContext.getSourceFile(index: Int) = @@ -27,8 +27,8 @@ internal class KlibMetadataExtensions : MetadataExtensions { private fun WriteContext.getIndexOf(file: KlibSourceFile) = strings.getStringIndex(file.name) - override fun readClassExtensions(v: KmClassVisitor, proto: ProtoBuf.Class, c: ReadContext) { - val extension = v.visitExtensions(KlibClassExtensionVisitor.TYPE) as? KlibClassExtensionVisitor ?: return + override fun readClassExtensions(kmClass: KmClass, proto: ProtoBuf.Class, c: ReadContext) { + val extension = kmClass.visitExtensions(KlibClassExtensionVisitor.TYPE) as? KlibClassExtensionVisitor ?: return proto.getExtension(KlibMetadataProtoBuf.classAnnotation).forEach { annotation -> extension.visitAnnotation(annotation.readAnnotation(c.strings)) @@ -48,8 +48,8 @@ internal class KlibMetadataExtensions : MetadataExtensions { } } - override fun readPackageExtensions(v: KmPackageVisitor, proto: ProtoBuf.Package, c: ReadContext) { - val extension = v.visitExtensions(KlibPackageExtensionVisitor.TYPE) as? KlibPackageExtensionVisitor ?: return + override fun readPackageExtensions(kmPackage: KmPackage, proto: ProtoBuf.Package, c: ReadContext) { + val extension = kmPackage.visitExtensions(KlibPackageExtensionVisitor.TYPE) as? KlibPackageExtensionVisitor ?: return proto.getExtensionOrNull(KlibMetadataProtoBuf.packageFqName)?.let { val fqName = (c.strings as NameResolverImpl).getPackageFqName(it) @@ -57,8 +57,8 @@ internal class KlibMetadataExtensions : MetadataExtensions { } } - override fun readModuleFragmentExtensions(v: KmModuleFragmentVisitor, proto: ProtoBuf.PackageFragment, c: ReadContext) { - val extension = v.visitExtensions(KlibModuleFragmentExtensionVisitor.TYPE) as? KlibModuleFragmentExtensionVisitor ?: return + override fun readModuleFragmentExtensions(kmModuleFragment: KmModuleFragment, proto: ProtoBuf.PackageFragment, c: ReadContext) { + val extension = kmModuleFragment.visitExtensions(KlibModuleFragmentExtensionVisitor.TYPE) as? KlibModuleFragmentExtensionVisitor ?: return proto.getExtension(KlibMetadataProtoBuf.packageFragmentFiles) .map { c.getSourceFile(it) } @@ -69,8 +69,8 @@ internal class KlibMetadataExtensions : MetadataExtensions { .forEach(extension::visitClassName) } - override fun readFunctionExtensions(v: KmFunctionVisitor, proto: ProtoBuf.Function, c: ReadContext) { - val extension = v.visitExtensions(KlibFunctionExtensionVisitor.TYPE) as? KlibFunctionExtensionVisitor ?: return + override fun readFunctionExtensions(kmFunction: KmFunction, proto: ProtoBuf.Function, c: ReadContext) { + val extension = kmFunction.visitExtensions(KlibFunctionExtensionVisitor.TYPE) as? KlibFunctionExtensionVisitor ?: return proto.getExtension(KlibMetadataProtoBuf.functionAnnotation).forEach { annotation -> extension.visitAnnotation(annotation.readAnnotation(c.strings)) @@ -84,8 +84,8 @@ internal class KlibMetadataExtensions : MetadataExtensions { } } - override fun readPropertyExtensions(v: KmPropertyVisitor, proto: ProtoBuf.Property, c: ReadContext) { - val extension = v.visitExtensions(KlibPropertyExtensionVisitor.TYPE) as? KlibPropertyExtensionVisitor ?: return + override fun readPropertyExtensions(kmProperty: KmProperty, proto: ProtoBuf.Property, c: ReadContext) { + val extension = kmProperty.visitExtensions(KlibPropertyExtensionVisitor.TYPE) as? KlibPropertyExtensionVisitor ?: return proto.getExtension(KlibMetadataProtoBuf.propertyAnnotation).forEach { annotation -> extension.visitAnnotation(annotation.readAnnotation(c.strings)) @@ -105,8 +105,8 @@ internal class KlibMetadataExtensions : MetadataExtensions { } } - override fun readConstructorExtensions(v: KmConstructorVisitor, proto: ProtoBuf.Constructor, c: ReadContext) { - val extension = v.visitExtensions(KlibConstructorExtensionVisitor.TYPE) as? KlibConstructorExtensionVisitor ?: return + override fun readConstructorExtensions(kmConstructor: KmConstructor, proto: ProtoBuf.Constructor, c: ReadContext) { + val extension = kmConstructor.visitExtensions(KlibConstructorExtensionVisitor.TYPE) as? KlibConstructorExtensionVisitor ?: return proto.getExtension(KlibMetadataProtoBuf.constructorAnnotation).forEach { annotation -> extension.visitAnnotation(annotation.readAnnotation(c.strings)) @@ -116,8 +116,8 @@ internal class KlibMetadataExtensions : MetadataExtensions { } } - override fun readTypeParameterExtensions(v: KmTypeParameterVisitor, proto: ProtoBuf.TypeParameter, c: ReadContext) { - val extension = v.visitExtensions(KlibTypeParameterExtensionVisitor.TYPE) as? KlibTypeParameterExtensionVisitor ?: return + override fun readTypeParameterExtensions(kmTypeParameter: KmTypeParameter, proto: ProtoBuf.TypeParameter, c: ReadContext) { + val extension = kmTypeParameter.visitExtensions(KlibTypeParameterExtensionVisitor.TYPE) as? KlibTypeParameterExtensionVisitor ?: return proto.getExtension(KlibMetadataProtoBuf.typeParameterAnnotation).forEach { annotation -> extension.visitAnnotation(annotation.readAnnotation(c.strings)) @@ -127,33 +127,32 @@ internal class KlibMetadataExtensions : MetadataExtensions { } } - override fun readTypeExtensions(v: KmTypeVisitor, proto: ProtoBuf.Type, c: ReadContext) { - val extension = v.visitExtensions(KlibTypeExtensionVisitor.TYPE) as? KlibTypeExtensionVisitor ?: return + override fun readTypeExtensions(kmType: KmType, proto: ProtoBuf.Type, c: ReadContext) { + val extension = kmType.visitExtensions(KlibTypeExtensionVisitor.TYPE) as? KlibTypeExtensionVisitor ?: return proto.getExtension(KlibMetadataProtoBuf.typeAnnotation).forEach { annotation -> extension.visitAnnotation(annotation.readAnnotation(c.strings)) } } - override fun readTypeAliasExtensions(v: KmTypeAliasVisitor, proto: ProtoBuf.TypeAlias, c: ReadContext) { - val extension = v.visitExtensions(KlibTypeAliasExtensionVisitor.TYPE) as? KlibTypeAliasExtensionVisitor ?: return + override fun readTypeAliasExtensions(kmTypeAlias: KmTypeAlias, proto: ProtoBuf.TypeAlias, c: ReadContext) { + val extension = kmTypeAlias.visitExtensions(KlibTypeAliasExtensionVisitor.TYPE) as? KlibTypeAliasExtensionVisitor ?: return proto.getExtension(KlibMetadataProtoBuf.typeAliasUniqId).let { descriptorUniqId -> extension.visitUniqId(descriptorUniqId.readUniqId()) } } - override fun readValueParameterExtensions(v: KmValueParameterVisitor, proto: ProtoBuf.ValueParameter, c: ReadContext) { - val extension = v.visitExtensions(KlibValueParameterExtensionVisitor.TYPE) as? KlibValueParameterExtensionVisitor ?: return + override fun readValueParameterExtensions(kmValueParameter: KmValueParameter, proto: ProtoBuf.ValueParameter, c: ReadContext) { + val extension = kmValueParameter.visitExtensions(KlibValueParameterExtensionVisitor.TYPE) as? KlibValueParameterExtensionVisitor ?: return proto.getExtension(KlibMetadataProtoBuf.parameterAnnotation).forEach { annotation -> extension.visitAnnotation(annotation.readAnnotation(c.strings)) } } - override fun writeClassExtensions(extension: KmClassExtension, proto: ProtoBuf.Class.Builder, c: WriteContext): Boolean { - if (extension.type != KlibClassExtensionVisitor.TYPE) return false - extension.accept(object : KlibClassExtensionVisitor() { + override fun writeClassExtensions(kmClass: KmClass, proto: ProtoBuf.Class.Builder, c: WriteContext) { + kmClass.klibExtensions.accept(object : KlibClassExtensionVisitor() { override fun visitAnnotation(annotation: KmAnnotation) { proto.addExtension( KlibMetadataProtoBuf.classAnnotation, @@ -192,31 +191,27 @@ internal class KlibMetadataExtensions : MetadataExtensions { } } }) - return true } override fun writePackageExtensions( - extension: KmPackageExtension, + kmPackage: KmPackage, proto: ProtoBuf.Package.Builder, c: WriteContext - ): Boolean { - if (extension.type != KlibPackageExtensionVisitor.TYPE) return false - extension.accept(object : KlibPackageExtensionVisitor() { + ) { + kmPackage.klibExtensions.accept(object : KlibPackageExtensionVisitor() { override fun visitFqName(name: String) { val nameIdx = (c.strings as StringTableImpl).getPackageFqNameIndex(FqName(name)) proto.setExtension(KlibMetadataProtoBuf.packageFqName, nameIdx) } }) - return true } override fun writeModuleFragmentExtensions( - type: KmExtensionType, + kmModuleFragment: KmModuleFragment, proto: ProtoBuf.PackageFragment.Builder, c: WriteContext - ): KmModuleFragmentExtensionVisitor? { - if (type != KlibModuleFragmentExtensionVisitor.TYPE) return null - return object : KlibModuleFragmentExtensionVisitor() { + ) { + kmModuleFragment.klibExtensions.accept(object : KlibModuleFragmentExtensionVisitor() { override fun visitFile(file: KlibSourceFile) { val fileIdx = c.getIndexOf(file) proto.addExtension(KlibMetadataProtoBuf.packageFragmentFiles, fileIdx) @@ -230,16 +225,15 @@ internal class KlibMetadataExtensions : MetadataExtensions { val classNameIdx = (c.strings as StringTableImpl).getQualifiedClassNameIndex(ClassId.fromString(className)) proto.addExtension(KlibMetadataProtoBuf.className, classNameIdx) } - } + }) } override fun writeFunctionExtensions( - type: KmExtensionType, + kmFunction: KmFunction, proto: ProtoBuf.Function.Builder, c: WriteContext - ): KmFunctionExtensionVisitor? { - if (type != KlibFunctionExtensionVisitor.TYPE) return null - return object : KlibFunctionExtensionVisitor() { + ) { + kmFunction.klibExtensions.accept(object : KlibFunctionExtensionVisitor() { override fun visitAnnotation(annotation: KmAnnotation) { proto.addExtension( KlibMetadataProtoBuf.functionAnnotation, @@ -258,16 +252,15 @@ internal class KlibMetadataExtensions : MetadataExtensions { val index = c.getIndexOf(file) proto.setExtension(KlibMetadataProtoBuf.functionFile, index) } - } + }) } override fun writePropertyExtensions( - type: KmExtensionType, + kmProperty: KmProperty, proto: ProtoBuf.Property.Builder, c: WriteContext - ): KmPropertyExtensionVisitor? { - if (type != KlibPropertyExtensionVisitor.TYPE) return null - return object : KlibPropertyExtensionVisitor() { + ) { + kmProperty.klibExtensions.accept(object : KlibPropertyExtensionVisitor() { override fun visitAnnotation(annotation: KmAnnotation) { proto.addExtension( KlibMetadataProtoBuf.propertyAnnotation, @@ -309,16 +302,15 @@ internal class KlibMetadataExtensions : MetadataExtensions { value.writeAnnotationArgument(c.strings).build() ) } - } + }) } override fun writeConstructorExtensions( - type: KmExtensionType, + kmConstructor: KmConstructor, proto: ProtoBuf.Constructor.Builder, c: WriteContext - ): KmConstructorExtensionVisitor? { - if (type != KlibConstructorExtensionVisitor.TYPE) return null - return object : KlibConstructorExtensionVisitor() { + ) { + kmConstructor.klibExtensions.accept(object : KlibConstructorExtensionVisitor() { override fun visitAnnotation(annotation: KmAnnotation) { proto.addExtension( KlibMetadataProtoBuf.constructorAnnotation, @@ -332,16 +324,15 @@ internal class KlibMetadataExtensions : MetadataExtensions { uniqId.writeUniqId().build() ) } - } + }) } override fun writeTypeParameterExtensions( - type: KmExtensionType, + kmTypeParameter: KmTypeParameter, proto: ProtoBuf.TypeParameter.Builder, c: WriteContext - ): KmTypeParameterExtensionVisitor? { - if (type != KlibTypeParameterExtensionVisitor.TYPE) return null - return object : KlibTypeParameterExtensionVisitor() { + ) { + kmTypeParameter.klibExtensions.accept(object : KlibTypeParameterExtensionVisitor() { override fun visitAnnotation(annotation: KmAnnotation) { proto.addExtension( KlibMetadataProtoBuf.typeParameterAnnotation, @@ -355,51 +346,48 @@ internal class KlibMetadataExtensions : MetadataExtensions { uniqId.writeUniqId().build() ) } - } + }) } - override fun writeTypeExtensions(type: KmExtensionType, proto: ProtoBuf.Type.Builder, c: WriteContext): KmTypeExtensionVisitor? { - if (type != KlibTypeExtensionVisitor.TYPE) return null - return object : KlibTypeExtensionVisitor() { + override fun writeTypeExtensions(type: KmType, proto: ProtoBuf.Type.Builder, c: WriteContext) { + type.klibExtensions.accept(object : KlibTypeExtensionVisitor() { override fun visitAnnotation(annotation: KmAnnotation) { proto.addExtension( KlibMetadataProtoBuf.typeAnnotation, annotation.writeAnnotation(c.strings).build() ) } - } + }) } override fun writeTypeAliasExtensions( - type: KmExtensionType, + typeAlias: KmTypeAlias, proto: ProtoBuf.TypeAlias.Builder, c: WriteContext - ): KmTypeAliasExtensionVisitor? { - if (type != KlibTypeAliasExtensionVisitor.TYPE) return null - return object : KlibTypeAliasExtensionVisitor() { + ) { + typeAlias.klibExtensions.accept(object : KlibTypeAliasExtensionVisitor() { override fun visitUniqId(uniqId: UniqId) { proto.setExtension( KlibMetadataProtoBuf.typeAliasUniqId, uniqId.writeUniqId().build() ) } - } + }) } override fun writeValueParameterExtensions( - type: KmExtensionType, + valueParameter: KmValueParameter, proto: ProtoBuf.ValueParameter.Builder, c: WriteContext - ): KmValueParameterExtensionVisitor? { - if (type != KlibValueParameterExtensionVisitor.TYPE) return null - return object : KlibValueParameterExtensionVisitor() { + ) { + valueParameter.klibExtensions.accept(object : KlibValueParameterExtensionVisitor() { override fun visitAnnotation(annotation: KmAnnotation) { proto.addExtension( KlibMetadataProtoBuf.parameterAnnotation, annotation.writeAnnotation(c.strings).build() ) } - } + }) } override fun createClassExtension(): KmClassExtension = diff --git a/libraries/kotlinx-metadata/klib/src/kotlinx/metadata/klib/klibMetadataExtensionVisitors.kt b/libraries/kotlinx-metadata/klib/src/kotlinx/metadata/klib/klibMetadataExtensionVisitors.kt index 488c41339d6..56c11c5e983 100644 --- a/libraries/kotlinx-metadata/klib/src/kotlinx/metadata/klib/klibMetadataExtensionVisitors.kt +++ b/libraries/kotlinx-metadata/klib/src/kotlinx/metadata/klib/klibMetadataExtensionVisitors.kt @@ -2,7 +2,7 @@ * Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors. * 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_ERROR") +@file:Suppress("DEPRECATION_ERROR") // Extension visitors package kotlinx.metadata.klib diff --git a/libraries/kotlinx-metadata/src/kotlinx/metadata/Nodes.kt b/libraries/kotlinx-metadata/src/kotlinx/metadata/Nodes.kt index 34f2fbfb861..9bb6402ddab 100644 --- a/libraries/kotlinx-metadata/src/kotlinx/metadata/Nodes.kt +++ b/libraries/kotlinx-metadata/src/kotlinx/metadata/Nodes.kt @@ -821,7 +821,7 @@ public class KmTypeParameter @Deprecated(flagsCtorDeprecated) constructor( KmType(flags).addTo(upperBounds) @Deprecated(VISITOR_API_MESSAGE, level = DeprecationLevel.ERROR) - override fun visitExtensions(type: KmExtensionType): KmTypeParameterExtensionVisitor? = + override fun visitExtensions(type: KmExtensionType): KmTypeParameterExtensionVisitor = extensions.singleOfType(type) /** diff --git a/libraries/kotlinx-metadata/src/kotlinx/metadata/internal/Readers.kt b/libraries/kotlinx-metadata/src/kotlinx/metadata/internal/Readers.kt index 7c328ac5110..da289175572 100644 --- a/libraries/kotlinx-metadata/src/kotlinx/metadata/internal/Readers.kt +++ b/libraries/kotlinx-metadata/src/kotlinx/metadata/internal/Readers.kt @@ -86,9 +86,7 @@ public fun ProtoBuf.Class.toKmClass( contextReceiverTypes(c.types).mapTo(v.contextReceiverTypes) { it.toKmType(c) } versionRequirementList.mapTo(v.versionRequirements) { readVersionRequirement(it, c) } - for (extension in c.extensions) { - extension.readClassExtensions(v, this, c) - } + c.extensions.forEach { it.readClassExtensions(v, this, c) } return v } @@ -119,9 +117,7 @@ public fun ProtoBuf.Package.toKmPackage( v.visitDeclarations(functionList, propertyList, typeAliasList, c) - for (extension in c.extensions) { - extension.readPackageExtensions(v, this, c) - } + c.extensions.forEach { it.readPackageExtensions(v, this, c) } return v } @@ -141,9 +137,7 @@ public fun ProtoBuf.PackageFragment.toKmModuleFragment( v.pkg = `package`.toKmPackage(strings, contextExtensions) class_List.mapTo(v.classes) { it.toKmClass(strings, contextExtensions) } - for (extension in c.extensions) { - extension.readModuleFragmentExtensions(v, this, c) - } + c.extensions.forEach { it.readModuleFragmentExtensions(v, this, c) } return v } @@ -171,9 +165,7 @@ private fun ProtoBuf.Constructor.toKmConstructor(c: ReadContext): KmConstructor valueParameterList.mapTo(v.valueParameters) { it.toKmValueParameter(c) } versionRequirementList.mapTo(v.versionRequirements) { readVersionRequirement(it, c) } - for (extension in c.extensions) { - extension.readConstructorExtensions(v, this, c) - } + c.extensions.forEach { it.readConstructorExtensions(v, this, c) } return v } @@ -196,9 +188,7 @@ private fun ProtoBuf.Function.toKmFunction(outer: ReadContext): KmFunction { versionRequirementList.mapTo(v.versionRequirements) { readVersionRequirement(it, c) } - for (extension in c.extensions) { - extension.readFunctionExtensions(v, this, c) - } + c.extensions.forEach { it.readFunctionExtensions(v, this, c) } return v } @@ -217,9 +207,7 @@ public fun ProtoBuf.Property.toKmProperty(outer: ReadContext): KmProperty { v.returnType = returnType(c.types).toKmType(c) versionRequirementList.mapTo(v.versionRequirements) { readVersionRequirement(it, c) } - for (extension in c.extensions) { - extension.readPropertyExtensions(v, this, c) - } + c.extensions.forEach { it.readPropertyExtensions(v, this, c) } return v } @@ -236,9 +224,7 @@ private fun ProtoBuf.TypeAlias.toKmTypeAlias(outer: ReadContext): KmTypeAlias { versionRequirementList.mapTo(v.versionRequirements) { readVersionRequirement(it, c) } - for (extension in c.extensions) { - extension.readTypeAliasExtensions(v, this, c) - } + c.extensions.forEach { it.readTypeAliasExtensions(v, this, c) } return v } @@ -249,9 +235,7 @@ private fun ProtoBuf.ValueParameter.toKmValueParameter(c: ReadContext): KmValueP v.varargElementType = varargElementType(c.types)?.toKmType(c) - for (extension in c.extensions) { - extension.readValueParameterExtensions(v, this, c) - } + c.extensions.forEach { it.readValueParameterExtensions(v, this, c) } return v } @@ -268,9 +252,7 @@ private fun ProtoBuf.TypeParameter.toKmTypeParameter( upperBounds(c.types).mapTo(ktp.upperBounds) { it.toKmType(c) } - for (extension in c.extensions) { - extension.readTypeParameterExtensions(ktp, this, c) - } + c.extensions.forEach { it.readTypeParameterExtensions(ktp, this, c) } return ktp } @@ -313,9 +295,7 @@ private fun ProtoBuf.Type.toKmType(c: ReadContext): KmType { KmFlexibleTypeUpperBound(it, if (hasFlexibleTypeCapabilitiesId()) c[flexibleTypeCapabilitiesId] else null) } - for (extension in c.extensions) { - extension.readTypeExtensions(v, this, c) - } + c.extensions.forEach { it.readTypeExtensions(v, this, c) } return v } diff --git a/libraries/kotlinx-metadata/src/kotlinx/metadata/internal/WriteUtils.kt b/libraries/kotlinx-metadata/src/kotlinx/metadata/internal/WriteUtils.kt index 8818f8283e8..864d0d7c2a3 100644 --- a/libraries/kotlinx-metadata/src/kotlinx/metadata/internal/WriteUtils.kt +++ b/libraries/kotlinx-metadata/src/kotlinx/metadata/internal/WriteUtils.kt @@ -6,9 +6,6 @@ package kotlinx.metadata.internal import kotlinx.metadata.* -import kotlinx.metadata.internal.extensions.KmExtension -import kotlinx.metadata.internal.extensions.MetadataExtensions -import kotlinx.metadata.internal.extensions.applySingleExtension import org.jetbrains.kotlin.metadata.ProtoBuf import org.jetbrains.kotlin.metadata.deserialization.Flags import org.jetbrains.kotlin.metadata.serialization.StringTable @@ -115,9 +112,3 @@ internal fun StringTable.getClassNameIndex(name: ClassName): Int = getQualifiedClassNameIndex(name.substring(1), true) else getQualifiedClassNameIndex(name, false) - -@Suppress("DEPRECATION_ERROR") -internal fun > List.writeExtensions(writer: MetadataExtensions.(KmExtensionType) -> V?) = - forEach { ext -> - applySingleExtension(ext.type) { writer(ext.type) }?.let { ext.accept(it) } - } diff --git a/libraries/kotlinx-metadata/src/kotlinx/metadata/internal/Writers.kt b/libraries/kotlinx-metadata/src/kotlinx/metadata/internal/Writers.kt index 2407a485e9d..8e885c580d7 100644 --- a/libraries/kotlinx-metadata/src/kotlinx/metadata/internal/Writers.kt +++ b/libraries/kotlinx-metadata/src/kotlinx/metadata/internal/Writers.kt @@ -8,7 +8,6 @@ package kotlinx.metadata.internal import kotlinx.metadata.* import kotlinx.metadata.internal.common.KmModuleFragment import kotlinx.metadata.internal.extensions.MetadataExtensions -import kotlinx.metadata.internal.extensions.matchExtensions import org.jetbrains.kotlin.metadata.ProtoBuf import org.jetbrains.kotlin.metadata.deserialization.VersionRequirement import org.jetbrains.kotlin.metadata.serialization.MutableVersionRequirementTable @@ -24,6 +23,8 @@ public interface WriteContextExtension public open class WriteContext(public val strings: StringTable, public val contextExtensions: List = emptyList()) { internal val versionRequirements: MutableVersionRequirementTable = MutableVersionRequirementTable() + internal val extensions = MetadataExtensions.INSTANCES + public operator fun get(string: String): Int = strings.getStringIndex(string) @@ -36,8 +37,8 @@ private fun WriteContext.writeTypeParameter(kmTypeParameter: KmTypeParameter): P kmTypeParameter.upperBounds.forEach { ub -> t.addUpperBound(writeType(ub).build()) } - kmTypeParameter.extensions.writeExtensions { - writeTypeParameterExtensions(it, t, this@writeTypeParameter) + extensions.forEach { + it.writeTypeParameterExtensions(kmTypeParameter, t, this) } t.name = this[kmTypeParameter.name] t.id = kmTypeParameter.id @@ -91,9 +92,7 @@ private fun WriteContext.writeType(kmType: KmType): ProtoBuf.Type.Builder { t.flexibleUpperBound = fubType.build() } - kmType.extensions.writeExtensions { - writeTypeExtensions(it, t, this@writeType) - } + extensions.forEach { it.writeTypeExtensions(kmType, t, this) } if (kmType.isNullable) { t.nullable = true @@ -112,8 +111,8 @@ private fun WriteContext.writeConstructor(kmConstructor: KmConstructor): ProtoBu t.addValueParameter(writeValueParameter(it).build()) } kmConstructor.versionRequirements.forEach { t.addVersionRequirement(writeVersionRequirement(it)) } - kmConstructor.extensions.writeExtensions { - writeConstructorExtensions(it, t, this@writeConstructor) + extensions.forEach { + it.writeConstructorExtensions(kmConstructor, t, this) } if (kmConstructor.flags != ProtoBuf.Constructor.getDefaultInstance().flags) { t.flags = kmConstructor.flags @@ -125,14 +124,18 @@ private fun WriteContext.writeFunction(kmFunction: KmFunction): ProtoBuf.Functio val t = ProtoBuf.Function.newBuilder() t.addAllTypeParameter(kmFunction.typeParameters.map { writeTypeParameter(it).build() }) kmFunction.receiverParameterType?.let { t.receiverType = writeType(it).build() } + @OptIn(ExperimentalContextReceivers::class) t.addAllContextReceiverType(kmFunction.contextReceiverTypes.map { writeType(it).build() }) t.addAllValueParameter(kmFunction.valueParameters.map { writeValueParameter(it).build() }) t.returnType = writeType(kmFunction.returnType).build() t.addAllVersionRequirement(kmFunction.versionRequirements.map(::writeVersionRequirement)) + @OptIn(ExperimentalContracts::class) kmFunction.contract?.let { t.contract = writeContract(it) } - kmFunction.extensions.writeExtensions { writeFunctionExtensions(it, t, this@writeFunction) } + + extensions.forEach { it.writeFunctionExtensions(kmFunction, t, this) } + t.name = this[kmFunction.name] if (kmFunction.flags != ProtoBuf.Function.getDefaultInstance().flags) { t.flags = kmFunction.flags @@ -148,12 +151,15 @@ public fun WriteContext.writeProperty(kmProperty: KmProperty): ProtoBuf.Property t.addTypeParameter(writeTypeParameter(tp).build()) } kmProperty.receiverParameterType?.let { t.receiverType = writeType(it).build() } + @OptIn(ExperimentalContextReceivers::class) t.addAllContextReceiverType(kmProperty.contextReceiverTypes.map { writeType(it).build() }) kmProperty.setterParameter?.let { t.setterValueParameter = writeValueParameter(it).build() } t.returnType = writeType(kmProperty.returnType).build() t.addAllVersionRequirement(kmProperty.versionRequirements.map { writeVersionRequirement(it) }) - kmProperty.extensions.writeExtensions { writePropertyExtensions(it, t, this@writeProperty) } + + extensions.forEach { it.writePropertyExtensions(kmProperty, t, this) } + t.name = this[kmProperty.name] if (kmProperty.flags != ProtoBuf.Property.getDefaultInstance().flags) { t.flags = kmProperty.flags @@ -170,7 +176,7 @@ private fun WriteContext.writeValueParameter( val t = ProtoBuf.ValueParameter.newBuilder() t.type = writeType(kmValueParameter.type).build() kmValueParameter.varargElementType?.let { t.varargElementType = writeType(it).build() } - kmValueParameter.extensions.writeExtensions { writeValueParameterExtensions(it, t, this@writeValueParameter) } + extensions.forEach { it.writeValueParameterExtensions(kmValueParameter, t, this) } if (kmValueParameter.flags != ProtoBuf.ValueParameter.getDefaultInstance().flags) { t.flags = kmValueParameter.flags } @@ -187,7 +193,7 @@ private fun WriteContext.writeTypeAlias( t.expandedType = writeType(typeAlias.expandedType).build() t.addAllAnnotation(typeAlias.annotations.map { it.writeAnnotation(strings).build() }) t.addAllVersionRequirement(typeAlias.versionRequirements.map(::writeVersionRequirement)) - typeAlias.extensions.writeExtensions { writeTypeAliasExtensions(it, t, this@writeTypeAlias) } + extensions.forEach { it.writeTypeAliasExtensions(typeAlias, t, this) } if (typeAlias.flags != ProtoBuf.TypeAlias.getDefaultInstance().flags) { t.flags = typeAlias.flags @@ -232,7 +238,7 @@ private fun WriteContext.writeVersionRequirement(kmVersionRequirement: KmVersion writeVersionFull = { t!!.versionFull = it } ) - return this.versionRequirements[t] //?? + return this.versionRequirements[t] } @ExperimentalContracts @@ -324,7 +330,8 @@ public open class ClassWriter(stringTable: StringTable, contextExtensions: List< t.addAllContextReceiverType(kmClass.contextReceiverTypes.map { c.writeType(it).build() }) t.addAllVersionRequirement(kmClass.versionRequirements.map { c.writeVersionRequirement(it) }) - kmClass.extensions.matchExtensions { writeClassExtensions(it, t, c) } + + c.extensions.forEach { it.writeClassExtensions(kmClass, t, c) } c.versionRequirements.serialize()?.let { t.versionRequirementTable = it @@ -340,7 +347,7 @@ public open class PackageWriter(stringTable: StringTable, contextExtensions: Lis t.addAllFunction(kmPackage.functions.map { c.writeFunction(it).build() }) t.addAllProperty(kmPackage.properties.map { c.writeProperty(it).build() }) t.addAllTypeAlias(kmPackage.typeAliases.map { c.writeTypeAlias(it).build() }) - kmPackage.extensions.matchExtensions { writePackageExtensions(it, t, c) } + c.extensions.forEach { it.writePackageExtensions(kmPackage, t, c) } c.versionRequirements.serialize()?.let { t.versionRequirementTable = it } @@ -364,7 +371,7 @@ public open class ModuleFragmentWriter(stringTable: StringTable, contextExtensio t.addClass_(classWriter.t) } - kmPackageFragment.extensions.writeExtensions { writeModuleFragmentExtensions(it, t, c) } + c.extensions.forEach { it.writeModuleFragmentExtensions(kmPackageFragment, t, c) } } } diff --git a/libraries/kotlinx-metadata/src/kotlinx/metadata/internal/common/KotlinCommonMetadata.kt b/libraries/kotlinx-metadata/src/kotlinx/metadata/internal/common/KotlinCommonMetadata.kt index ee2a519cf2d..30e2d45ce87 100644 --- a/libraries/kotlinx-metadata/src/kotlinx/metadata/internal/common/KotlinCommonMetadata.kt +++ b/libraries/kotlinx-metadata/src/kotlinx/metadata/internal/common/KotlinCommonMetadata.kt @@ -2,7 +2,7 @@ * Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors. * 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_ERROR") +@file:Suppress("DEPRECATION_ERROR") // deprecated .accept implementation package kotlinx.metadata.internal.common @@ -23,9 +23,9 @@ import java.io.ByteArrayInputStream * Usually such metadata comes from serialized klibs. However, special `kotlin_builtins` file from standard library * distribution can also be read with this reader. */ -public class KotlinCommonMetadata private constructor(private val proto: ProtoBuf.PackageFragment) { +public class KotlinCommonMetadata private constructor(proto: ProtoBuf.PackageFragment) { - public val kmModuleFragment: KmModuleFragment = readImpl() + public val kmModuleFragment: KmModuleFragment = readImpl(proto) @Deprecated( "To avoid excessive copying, use .kmModuleFragment property instead. Note that it returns a view and not a copy.", @@ -43,7 +43,7 @@ public class KotlinCommonMetadata private constructor(private val proto: ProtoBu @Deprecated(VISITOR_API_MESSAGE, level = DeprecationLevel.ERROR) public fun accept(v: KmModuleFragmentVisitor): Unit = kmModuleFragment.accept(v) - private fun readImpl(): KmModuleFragment { + private fun readImpl(proto: ProtoBuf.PackageFragment): KmModuleFragment { val v = KmModuleFragment() val strings = NameResolverImpl(proto.strings, proto.qualifiedNames) if (proto.hasPackage()) { diff --git a/libraries/kotlinx-metadata/src/kotlinx/metadata/internal/extensions/ExtensionNodes.kt b/libraries/kotlinx-metadata/src/kotlinx/metadata/internal/extensions/ExtensionNodes.kt index 7c6812c199b..9996a97b173 100644 --- a/libraries/kotlinx-metadata/src/kotlinx/metadata/internal/extensions/ExtensionNodes.kt +++ b/libraries/kotlinx-metadata/src/kotlinx/metadata/internal/extensions/ExtensionNodes.kt @@ -2,7 +2,7 @@ * Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors. * 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_ERROR") +@file:Suppress("DEPRECATION_ERROR") // deprecated visitors API package kotlinx.metadata.internal.extensions diff --git a/libraries/kotlinx-metadata/src/kotlinx/metadata/internal/extensions/ExtensionUtils.kt b/libraries/kotlinx-metadata/src/kotlinx/metadata/internal/extensions/ExtensionUtils.kt index 5f4b38709c5..849446afb8f 100644 --- a/libraries/kotlinx-metadata/src/kotlinx/metadata/internal/extensions/ExtensionUtils.kt +++ b/libraries/kotlinx-metadata/src/kotlinx/metadata/internal/extensions/ExtensionUtils.kt @@ -2,34 +2,10 @@ * Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors. * 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_ERROR") +@file:Suppress("DEPRECATION_ERROR") // KmExtensionType will be moved to an internal package package kotlinx.metadata.internal.extensions import kotlinx.metadata.KmExtensionType -import kotlinx.metadata.KmExtensionVisitor - -internal fun applySingleExtension(type: KmExtensionType, block: MetadataExtensions.() -> T?): T? { - var result: T? = null - for (extension in MetadataExtensions.INSTANCES) { - val current = block(extension) ?: continue - if (result != null) { - throw IllegalStateException("Multiple extensions handle the same extension type: $type") - } - result = current - } - return result -} - -internal fun > List.matchExtensions(block: MetadataExtensions.(E) -> Boolean) { - forEach { ext -> - var processed = false - for (extesion in MetadataExtensions.INSTANCES) { - val current = extesion.block(ext) - if (processed && current) throw IllegalStateException("Multiple extensions handle the same extension type: ${ext.type}") - processed = current - } - } -} internal fun > Collection.singleOfType(type: KmExtensionType): N { var result: N? = null diff --git a/libraries/kotlinx-metadata/src/kotlinx/metadata/internal/extensions/MetadataExtensions.kt b/libraries/kotlinx-metadata/src/kotlinx/metadata/internal/extensions/MetadataExtensions.kt index e238d75b51d..29878955f32 100644 --- a/libraries/kotlinx-metadata/src/kotlinx/metadata/internal/extensions/MetadataExtensions.kt +++ b/libraries/kotlinx-metadata/src/kotlinx/metadata/internal/extensions/MetadataExtensions.kt @@ -11,55 +11,54 @@ import kotlinx.metadata.internal.common.* import org.jetbrains.kotlin.metadata.ProtoBuf import java.util.* -@Suppress("DEPRECATION_ERROR") public interface MetadataExtensions { - public fun readClassExtensions(v: KmClassVisitor, proto: ProtoBuf.Class, c: ReadContext) + public fun readClassExtensions(kmClass: KmClass, proto: ProtoBuf.Class, c: ReadContext) - public fun readPackageExtensions(v: KmPackageVisitor, proto: ProtoBuf.Package, c: ReadContext) + public fun readPackageExtensions(kmPackage: KmPackage, proto: ProtoBuf.Package, c: ReadContext) - public fun readModuleFragmentExtensions(v: KmModuleFragmentVisitor, proto: ProtoBuf.PackageFragment, c: ReadContext) + public fun readModuleFragmentExtensions(kmModuleFragment: KmModuleFragment, proto: ProtoBuf.PackageFragment, c: ReadContext) - public fun readFunctionExtensions(v: KmFunctionVisitor, proto: ProtoBuf.Function, c: ReadContext) + public fun readFunctionExtensions(kmFunction: KmFunction, proto: ProtoBuf.Function, c: ReadContext) - public fun readPropertyExtensions(v: KmPropertyVisitor, proto: ProtoBuf.Property, c: ReadContext) + public fun readPropertyExtensions(kmProperty: KmProperty, proto: ProtoBuf.Property, c: ReadContext) - public fun readConstructorExtensions(v: KmConstructorVisitor, proto: ProtoBuf.Constructor, c: ReadContext) + public fun readConstructorExtensions(kmConstructor: KmConstructor, proto: ProtoBuf.Constructor, c: ReadContext) - public fun readTypeParameterExtensions(v: KmTypeParameterVisitor, proto: ProtoBuf.TypeParameter, c: ReadContext) + public fun readTypeParameterExtensions(kmTypeParameter: KmTypeParameter, proto: ProtoBuf.TypeParameter, c: ReadContext) - public fun readTypeExtensions(v: KmTypeVisitor, proto: ProtoBuf.Type, c: ReadContext) + public fun readTypeExtensions(kmType: KmType, proto: ProtoBuf.Type, c: ReadContext) - public fun readTypeAliasExtensions(v: KmTypeAliasVisitor, proto: ProtoBuf.TypeAlias, c: ReadContext) + public fun readTypeAliasExtensions(kmTypeAlias: KmTypeAlias, proto: ProtoBuf.TypeAlias, c: ReadContext) - public fun readValueParameterExtensions(v: KmValueParameterVisitor, proto: ProtoBuf.ValueParameter, c: ReadContext) + public fun readValueParameterExtensions(kmValueParameter: KmValueParameter, proto: ProtoBuf.ValueParameter, c: ReadContext) - public fun writeClassExtensions(extension: KmClassExtension, proto: ProtoBuf.Class.Builder, c: WriteContext): Boolean + public fun writeClassExtensions(kmClass: KmClass, proto: ProtoBuf.Class.Builder, c: WriteContext) - public fun writePackageExtensions(extension: KmPackageExtension, proto: ProtoBuf.Package.Builder, c: WriteContext): Boolean + public fun writePackageExtensions(kmPackage: KmPackage, proto: ProtoBuf.Package.Builder, c: WriteContext) public fun writeModuleFragmentExtensions( - type: KmExtensionType, proto: ProtoBuf.PackageFragment.Builder, c: WriteContext - ): KmModuleFragmentExtensionVisitor? + kmModuleFragment: KmModuleFragment, proto: ProtoBuf.PackageFragment.Builder, c: WriteContext + ) - public fun writeFunctionExtensions(type: KmExtensionType, proto: ProtoBuf.Function.Builder, c: WriteContext): KmFunctionExtensionVisitor? + public fun writeFunctionExtensions(kmFunction: KmFunction, proto: ProtoBuf.Function.Builder, c: WriteContext) - public fun writePropertyExtensions(type: KmExtensionType, proto: ProtoBuf.Property.Builder, c: WriteContext): KmPropertyExtensionVisitor? + public fun writePropertyExtensions(kmProperty: KmProperty, proto: ProtoBuf.Property.Builder, c: WriteContext) public fun writeConstructorExtensions( - type: KmExtensionType, proto: ProtoBuf.Constructor.Builder, c: WriteContext - ): KmConstructorExtensionVisitor? + kmConstructor: KmConstructor, proto: ProtoBuf.Constructor.Builder, c: WriteContext + ) public fun writeTypeParameterExtensions( - type: KmExtensionType, proto: ProtoBuf.TypeParameter.Builder, c: WriteContext - ): KmTypeParameterExtensionVisitor? + kmTypeParameter: KmTypeParameter, proto: ProtoBuf.TypeParameter.Builder, c: WriteContext + ) - public fun writeTypeExtensions(type: KmExtensionType, proto: ProtoBuf.Type.Builder, c: WriteContext): KmTypeExtensionVisitor? + public fun writeTypeExtensions(type: KmType, proto: ProtoBuf.Type.Builder, c: WriteContext) - public fun writeTypeAliasExtensions(type: KmExtensionType, proto: ProtoBuf.TypeAlias.Builder, c: WriteContext): KmTypeAliasExtensionVisitor? + public fun writeTypeAliasExtensions(typeAlias: KmTypeAlias, proto: ProtoBuf.TypeAlias.Builder, c: WriteContext) public fun writeValueParameterExtensions( - type: KmExtensionType, proto: ProtoBuf.ValueParameter.Builder, c: WriteContext - ): KmValueParameterExtensionVisitor? + valueParameter: KmValueParameter, proto: ProtoBuf.ValueParameter.Builder, c: WriteContext + ) public fun createClassExtension(): KmClassExtension diff --git a/libraries/tools/kotlinp/test/org/jetbrains/kotlin/kotlinp/test/KotlinpTestUtils.kt b/libraries/tools/kotlinp/test/org/jetbrains/kotlin/kotlinp/test/KotlinpTestUtils.kt index 8e4b85abfde..97919079421 100644 --- a/libraries/tools/kotlinp/test/org/jetbrains/kotlin/kotlinp/test/KotlinpTestUtils.kt +++ b/libraries/tools/kotlinp/test/org/jetbrains/kotlin/kotlinp/test/KotlinpTestUtils.kt @@ -81,10 +81,10 @@ private fun compileAndPrintAllFiles( "class" -> { val metadata = kotlinp.readClassFile(outputFile) val classFile = kotlinp.readMetadata(metadata) - val classFile3 = KotlinClassMetadata.read(transformClassFileWithNodes(metadata, classFile)) + val classFile2 = KotlinClassMetadata.read(transformClassFileWithNodes(metadata, classFile)) for ((sb, classFileToRender) in listOf( - main to classFile, afterNodes to classFile3 + main to classFile, afterNodes to classFile2 )) { sb.appendFileName(outputFile.relativeTo(tmpdir)) sb.append(kotlinp.renderClassFile(classFileToRender))