diff --git a/libraries/kotlinx-metadata/jvm/src/kotlinx/metadata/jvm/impl/JvmMetadataExtensions.kt b/libraries/kotlinx-metadata/jvm/src/kotlinx/metadata/jvm/impl/JvmMetadataExtensions.kt index 81466d839b2..16d492e0daa 100644 --- a/libraries/kotlinx-metadata/jvm/src/kotlinx/metadata/jvm/impl/JvmMetadataExtensions.kt +++ b/libraries/kotlinx-metadata/jvm/src/kotlinx/metadata/jvm/impl/JvmMetadataExtensions.kt @@ -107,6 +107,8 @@ internal class JvmMetadataExtensions : MetadataExtensions { ext.visitEnd() } + override fun readTypeAliasExtensions(v: KmTypeAliasVisitor, proto: ProtoBuf.TypeAlias, c: ReadContext) {} + override fun writeClassExtensions(type: KmExtensionType, proto: ProtoBuf.Class.Builder, c: WriteContext): KmClassExtensionVisitor? { if (type != JvmClassExtensionVisitor.TYPE) return null return object : JvmClassExtensionVisitor() { @@ -268,6 +270,12 @@ internal class JvmMetadataExtensions : MetadataExtensions { } } + override fun writeTypeAliasExtensions( + type: KmExtensionType, + proto: ProtoBuf.TypeAlias.Builder, + c: WriteContext + ): KmTypeAliasExtensionVisitor? = null + override fun createClassExtension(): KmClassExtension = JvmClassExtension() override fun createPackageExtension(): KmPackageExtension = JvmPackageExtension() @@ -285,6 +293,8 @@ internal class JvmMetadataExtensions : MetadataExtensions { override fun createTypeExtension(): KmTypeExtension = JvmTypeExtension() + override fun createTypeAliasExtension(): KmTypeAliasExtension = JvmTypeAliasExtension() + private fun JvmMemberSignature.toJvmMethodSignature(c: WriteContext): JvmProtoBuf.JvmMethodSignature = JvmProtoBuf.JvmMethodSignature.newBuilder().apply { name = c[this@toJvmMethodSignature.name] diff --git a/libraries/kotlinx-metadata/jvm/src/kotlinx/metadata/jvm/impl/jvmExtensionNodes.kt b/libraries/kotlinx-metadata/jvm/src/kotlinx/metadata/jvm/impl/jvmExtensionNodes.kt index 588acfb24a9..3d2bd6f467f 100644 --- a/libraries/kotlinx-metadata/jvm/src/kotlinx/metadata/jvm/impl/jvmExtensionNodes.kt +++ b/libraries/kotlinx-metadata/jvm/src/kotlinx/metadata/jvm/impl/jvmExtensionNodes.kt @@ -176,3 +176,10 @@ internal class JvmTypeExtension : JvmTypeExtensionVisitor(), KmTypeExtension { visitor.visitEnd() } } + +internal class JvmTypeAliasExtension : JvmTypeAliasExtensionVisitor(), KmTypeAliasExtension { + override fun accept(visitor: KmTypeExtensionVisitor) { + require(visitor is JvmTypeAliasExtensionVisitor) + visitor.visitEnd() + } +} 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 1d210843f05..11b7c4a63f3 100644 --- a/libraries/kotlinx-metadata/jvm/src/kotlinx/metadata/jvm/jvmExtensionVisitors.kt +++ b/libraries/kotlinx-metadata/jvm/src/kotlinx/metadata/jvm/jvmExtensionVisitors.kt @@ -348,3 +348,30 @@ open class JvmTypeExtensionVisitor @JvmOverloads constructor( const val PLATFORM_TYPE_ID = JvmProtoBufUtil.PLATFORM_TYPE_ID } } + +/** + * A visitor to visit JVM extensions for a type alias. + */ +open class JvmTypeAliasExtensionVisitor @JvmOverloads constructor( + private val delegate: JvmTypeAliasExtensionVisitor? = null +) : KmTypeAliasExtensionVisitor { + final override val type: KmExtensionType + get() = TYPE + + /** + * Visits the end of JVM extensions for the type alias. + */ + open fun visitEnd() { + delegate?.visitEnd() + } + + companion object { + /** + * The type of this extension visitor. + * + * @see KmExtensionType + */ + @JvmField + val TYPE: KmExtensionType = KmExtensionType(JvmTypeAliasExtensionVisitor::class) + } +} 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 635fb3e790d..c6546c95aef 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 @@ -33,6 +33,9 @@ internal val KmPackage.klibExtensions: KlibPackageExtension internal val KmModuleFragment.klibExtensions: KlibModuleFragmentExtension get() = visitExtensions(KlibModuleFragmentExtensionVisitor.TYPE) as KlibModuleFragmentExtension +internal val KmTypeAlias.klibExtensions: KlibTypeAliasExtension + get() = visitExtensions(KlibTypeAliasExtensionVisitor.TYPE) as KlibTypeAliasExtension + internal class KlibFunctionExtension : KlibFunctionExtensionVisitor(), KmFunctionExtension { val annotations: MutableList = mutableListOf() @@ -221,4 +224,17 @@ internal class KlibModuleFragmentExtension : KlibModuleFragmentExtensionVisitor( fqName?.let(visitor::visitFqName) className.forEach(visitor::visitClassName) } +} + +internal class KlibTypeAliasExtension : KlibTypeAliasExtensionVisitor(), KmTypeAliasExtension { + var uniqId: UniqId? = null + + override fun visitUniqId(uniqId: UniqId) { + this.uniqId = uniqId + } + + override fun accept(visitor: KmTypeExtensionVisitor) { + require(visitor is KlibTypeAliasExtensionVisitor) + uniqId?.let(visitor::visitUniqId) + } } \ No newline at end of file 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 13dce51f84b..0fdbde0dde7 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 @@ -126,6 +126,14 @@ internal class KlibMetadataExtensions : MetadataExtensions { } } + override fun readTypeAliasExtensions(v: KmTypeAliasVisitor, proto: ProtoBuf.TypeAlias, c: ReadContext) { + val extension = v.visitExtensions(KlibTypeAliasExtensionVisitor.TYPE) as? KlibTypeAliasExtensionVisitor ?: return + + proto.getExtension(KlibMetadataProtoBuf.typeAliasUniqId).let { descriptorUniqId -> + extension.visitUniqId(descriptorUniqId.readUniqId()) + } + } + override fun writeClassExtensions(type: KmExtensionType, proto: ProtoBuf.Class.Builder, c: WriteContext): KmClassExtensionVisitor? { if (type != KlibClassExtensionVisitor.TYPE) return null return object : KlibClassExtensionVisitor() { @@ -324,6 +332,22 @@ internal class KlibMetadataExtensions : MetadataExtensions { } } + override fun writeTypeAliasExtensions( + type: KmExtensionType, + proto: ProtoBuf.TypeAlias.Builder, + c: WriteContext + ): KmTypeAliasExtensionVisitor? { + if (type != KlibTypeAliasExtensionVisitor.TYPE) return null + return object : KlibTypeAliasExtensionVisitor() { + override fun visitUniqId(uniqId: UniqId) { + proto.setExtension( + KlibMetadataProtoBuf.typeAliasUniqId, + uniqId.writeUniqId().build() + ) + } + } + } + override fun createClassExtension(): KmClassExtension = KlibClassExtension() @@ -347,4 +371,7 @@ internal class KlibMetadataExtensions : MetadataExtensions { override fun createTypeExtension(): KmTypeExtension = KlibTypeExtension() + + override fun createTypeAliasExtension(): KmTypeAliasExtension = + KlibTypeAliasExtension() } \ No newline at end of file diff --git a/libraries/kotlinx-metadata/klib/src/kotlinx/metadata/klib/klibExtensions.kt b/libraries/kotlinx-metadata/klib/src/kotlinx/metadata/klib/klibExtensions.kt index f86cdca26a7..7ec5f42c46e 100644 --- a/libraries/kotlinx-metadata/klib/src/kotlinx/metadata/klib/klibExtensions.kt +++ b/libraries/kotlinx-metadata/klib/src/kotlinx/metadata/klib/klibExtensions.kt @@ -99,6 +99,12 @@ val KmTypeParameter.annotations: MutableList get() = klibExtensions.annotations var KmTypeParameter.uniqId: UniqId? + get() = klibExtensions.uniqId + set(value) { + klibExtensions.uniqId = value + } + +var KmTypeAlias.uniqId: UniqId? get() = klibExtensions.uniqId set(value) { klibExtensions.uniqId = value 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 1c5e479ae09..f7db040dffb 100644 --- a/libraries/kotlinx-metadata/klib/src/kotlinx/metadata/klib/klibMetadataExtensionVisitors.kt +++ b/libraries/kotlinx-metadata/klib/src/kotlinx/metadata/klib/klibMetadataExtensionVisitors.kt @@ -127,4 +127,16 @@ abstract class KlibModuleFragmentExtensionVisitor : KmModuleFragmentExtensionVis companion object { val TYPE = KmExtensionType(KlibModuleFragmentExtensionVisitor::class) } +} + +abstract class KlibTypeAliasExtensionVisitor : KmTypeAliasExtensionVisitor { + + abstract fun visitUniqId(uniqId: UniqId) + + override val type: KmExtensionType + get() = TYPE + + companion object { + val TYPE = KmExtensionType(KlibTypeAliasExtensionVisitor::class) + } } \ No newline at end of file diff --git a/libraries/kotlinx-metadata/src/kotlinx/metadata/extensions.kt b/libraries/kotlinx-metadata/src/kotlinx/metadata/extensions.kt index c7e750b27ca..93bb31e5af1 100644 --- a/libraries/kotlinx-metadata/src/kotlinx/metadata/extensions.kt +++ b/libraries/kotlinx-metadata/src/kotlinx/metadata/extensions.kt @@ -93,3 +93,8 @@ interface KmTypeParameterExtensionVisitor : KmExtensionVisitor * A visitor to visit platform-specific extensions for a type. */ interface KmTypeExtensionVisitor : KmExtensionVisitor + +/** + * A visitor to visit platform-specific extensions for a type alias. + */ +interface KmTypeAliasExtensionVisitor : KmExtensionVisitor diff --git a/libraries/kotlinx-metadata/src/kotlinx/metadata/impl/extensions/MetadataExtensions.kt b/libraries/kotlinx-metadata/src/kotlinx/metadata/impl/extensions/MetadataExtensions.kt index 5eb608e6350..644f4ebcb56 100644 --- a/libraries/kotlinx-metadata/src/kotlinx/metadata/impl/extensions/MetadataExtensions.kt +++ b/libraries/kotlinx-metadata/src/kotlinx/metadata/impl/extensions/MetadataExtensions.kt @@ -28,6 +28,8 @@ interface MetadataExtensions { fun readTypeExtensions(v: KmTypeVisitor, proto: ProtoBuf.Type, c: ReadContext) + fun readTypeAliasExtensions(v: KmTypeAliasVisitor, proto: ProtoBuf.TypeAlias, c: ReadContext) + fun writeClassExtensions(type: KmExtensionType, proto: ProtoBuf.Class.Builder, c: WriteContext): KmClassExtensionVisitor? fun writePackageExtensions(type: KmExtensionType, proto: ProtoBuf.Package.Builder, c: WriteContext): KmPackageExtensionVisitor? @@ -50,6 +52,8 @@ interface MetadataExtensions { fun writeTypeExtensions(type: KmExtensionType, proto: ProtoBuf.Type.Builder, c: WriteContext): KmTypeExtensionVisitor? + fun writeTypeAliasExtensions(type: KmExtensionType, proto: ProtoBuf.TypeAlias.Builder, c: WriteContext): KmTypeAliasExtensionVisitor? + fun createClassExtension(): KmClassExtension fun createPackageExtension(): KmPackageExtension @@ -66,6 +70,8 @@ interface MetadataExtensions { fun createTypeExtension(): KmTypeExtension + fun createTypeAliasExtension(): KmTypeAliasExtension + companion object { val INSTANCES: List by lazy { ServiceLoader.load(MetadataExtensions::class.java, MetadataExtensions::class.java.classLoader).toList().also { diff --git a/libraries/kotlinx-metadata/src/kotlinx/metadata/impl/extensions/extensionNodes.kt b/libraries/kotlinx-metadata/src/kotlinx/metadata/impl/extensions/extensionNodes.kt index 370ce88e455..ae34d2faaa9 100644 --- a/libraries/kotlinx-metadata/src/kotlinx/metadata/impl/extensions/extensionNodes.kt +++ b/libraries/kotlinx-metadata/src/kotlinx/metadata/impl/extensions/extensionNodes.kt @@ -26,3 +26,5 @@ interface KmConstructorExtension : KmConstructorExtensionVisitor, KmExtension interface KmTypeExtension : KmTypeExtensionVisitor, KmExtension + +interface KmTypeAliasExtension : KmTypeAliasExtensionVisitor, KmExtension \ No newline at end of file diff --git a/libraries/kotlinx-metadata/src/kotlinx/metadata/nodes.kt b/libraries/kotlinx-metadata/src/kotlinx/metadata/nodes.kt index 525da1767df..053b9ae6982 100644 --- a/libraries/kotlinx-metadata/src/kotlinx/metadata/nodes.kt +++ b/libraries/kotlinx-metadata/src/kotlinx/metadata/nodes.kt @@ -516,6 +516,9 @@ class KmTypeAlias( */ val versionRequirements: MutableList = ArrayList(0) + private val extensions: List = + MetadataExtensions.INSTANCES.map(MetadataExtensions::createTypeAliasExtension) + override fun visitTypeParameter(flags: Flags, name: String, id: Int, variance: KmVariance): KmTypeParameterVisitor = KmTypeParameter(flags, name, id, variance).addTo(typeParameters) @@ -529,6 +532,9 @@ class KmTypeAlias( annotations.add(annotation) } + override fun visitExtensions(type: KmExtensionType): KmTypeAliasExtensionVisitor? = + extensions.singleOfType(type) + override fun visitVersionRequirement(): KmVersionRequirementVisitor = KmVersionRequirement().addTo(versionRequirements) diff --git a/libraries/kotlinx-metadata/src/kotlinx/metadata/visitors.kt b/libraries/kotlinx-metadata/src/kotlinx/metadata/visitors.kt index 912e597e981..57f43573825 100644 --- a/libraries/kotlinx-metadata/src/kotlinx/metadata/visitors.kt +++ b/libraries/kotlinx-metadata/src/kotlinx/metadata/visitors.kt @@ -464,6 +464,14 @@ abstract class KmTypeAliasVisitor @JvmOverloads constructor(private val delegate open fun visitVersionRequirement(): KmVersionRequirementVisitor? = delegate?.visitVersionRequirement() + /** + * Visits the extensions of the given type on the type alias. + * + * @param type the type of extension visitor to be returned + */ + open fun visitExtensions(type: KmExtensionType): KmTypeAliasExtensionVisitor? = + delegate?.visitExtensions(type) + /** * Visits the end of the type alias. */