diff --git a/libraries/kotlinx-metadata/klib/src/kotlinx/metadata/klib/KlibEnumEntry.kt b/libraries/kotlinx-metadata/klib/src/kotlinx/metadata/klib/KlibEnumEntry.kt new file mode 100644 index 00000000000..c77dc82493b --- /dev/null +++ b/libraries/kotlinx-metadata/klib/src/kotlinx/metadata/klib/KlibEnumEntry.kt @@ -0,0 +1,16 @@ +/* + * 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. + */ + +package kotlinx.metadata.klib + +import kotlinx.metadata.KmAnnotation + +// TODO: Add to common kotlinx-metadata. +class KlibEnumEntry( + val name: String, + var uniqId: UniqId? = null, + var ordinal: Int? = null, + val annotations: MutableList = mutableListOf() +) 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 d895fa0c62f..36c8ebbb726 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 @@ -68,6 +68,7 @@ internal class KlibFunctionExtension : KlibFunctionExtensionVisitor(), KmFunctio internal class KlibClassExtension : KlibClassExtensionVisitor(), KmClassExtension { val annotations: MutableList = mutableListOf() + val enumEntries: MutableList = mutableListOf() var uniqId: UniqId? = null var file: KlibSourceFile? = null @@ -83,9 +84,14 @@ internal class KlibClassExtension : KlibClassExtensionVisitor(), KmClassExtensio this.file = file } + override fun visitEnumEntry(entry: KlibEnumEntry) { + enumEntries += entry + } + override fun accept(visitor: KmClassExtensionVisitor) { require(visitor is KlibClassExtensionVisitor) annotations.forEach(visitor::visitAnnotation) + enumEntries.forEach(visitor::visitEnumEntry) uniqId?.let(visitor::visitUniqId) file?.let(visitor::visitFile) } 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 63703e7f2a6..7e454d7eb96 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 @@ -37,6 +37,13 @@ internal class KlibMetadataExtensions : MetadataExtensions { proto.getExtensionOrNull(KlibMetadataProtoBuf.classFile)?.let { extension.visitFile(c.getSourceFile(it)) } + proto.enumEntryList.forEach { entryProto -> + val ordinal = entryProto.getExtensionOrNull(KlibMetadataProtoBuf.enumEntryOrdinal) + val name = c[entryProto.name] + val uniqId = entryProto.getExtensionOrNull(KlibMetadataProtoBuf.enumEntryUniqId)?.readUniqId() + val annotations = entryProto.getExtension(KlibMetadataProtoBuf.enumEntryAnnotation).map { it.readAnnotation(c.strings) } + extension.visitEnumEntry(KlibEnumEntry(name, uniqId, ordinal, annotations.toMutableList())) + } } override fun readPackageExtensions(v: KmPackageVisitor, proto: ProtoBuf.Package, c: ReadContext) { @@ -163,6 +170,21 @@ internal class KlibMetadataExtensions : MetadataExtensions { val fileIdx = c.getIndexOf(file) proto.setExtension(KlibMetadataProtoBuf.classFile, fileIdx) } + + override fun visitEnumEntry(entry: KlibEnumEntry) { + val entryIndex = proto.enumEntryList.indexOfFirst { it.name == c[entry.name] } + val entryAnnotationsProto = entry.annotations.map { it.writeAnnotation(c.strings).build() } + val entryProto = ProtoBuf.EnumEntry.newBuilder() + .setName(c[entry.name]) + .setExtension(KlibMetadataProtoBuf.enumEntryAnnotation, entryAnnotationsProto) + .setExtension(KlibMetadataProtoBuf.enumEntryUniqId, entry.uniqId!!.writeUniqId().build()) + .setExtension(KlibMetadataProtoBuf.enumEntryOrdinal, entry.ordinal!!) + if (entryIndex == -1) { + proto.addEnumEntry(entryProto.build()) + } else { + proto.setEnumEntry(entryIndex, entryProto.build()) + } + } } } 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 a8ff49ec2ef..9050f916e5a 100644 --- a/libraries/kotlinx-metadata/klib/src/kotlinx/metadata/klib/klibExtensions.kt +++ b/libraries/kotlinx-metadata/klib/src/kotlinx/metadata/klib/klibExtensions.kt @@ -38,6 +38,9 @@ var KmClass.file: KlibSourceFile? klibExtensions.file = value } +val KmClass.klibEnumEntries: MutableList + get() = klibExtensions.enumEntries + val KmProperty.annotations: MutableList get() = klibExtensions.annotations 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 197b01469db..56e4194a650 100644 --- a/libraries/kotlinx-metadata/klib/src/kotlinx/metadata/klib/klibMetadataExtensionVisitors.kt +++ b/libraries/kotlinx-metadata/klib/src/kotlinx/metadata/klib/klibMetadataExtensionVisitors.kt @@ -31,6 +31,8 @@ abstract class KlibClassExtensionVisitor : KmClassExtensionVisitor { abstract fun visitFile(file: KlibSourceFile) + abstract fun visitEnumEntry(entry: KlibEnumEntry) + override val type: KmExtensionType get() = TYPE