[kotlinx-metadata-klib] Proper support for enum entries

This commit is contained in:
Sergey Bogolepov
2019-12-27 11:35:12 +07:00
parent ffa2f97d2c
commit 595362b99f
5 changed files with 49 additions and 0 deletions
@@ -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<KmAnnotation> = mutableListOf()
)
@@ -68,6 +68,7 @@ internal class KlibFunctionExtension : KlibFunctionExtensionVisitor(), KmFunctio
internal class KlibClassExtension : KlibClassExtensionVisitor(), KmClassExtension {
val annotations: MutableList<KmAnnotation> = mutableListOf()
val enumEntries: MutableList<KlibEnumEntry> = 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)
}
@@ -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())
}
}
}
}
@@ -38,6 +38,9 @@ var KmClass.file: KlibSourceFile?
klibExtensions.file = value
}
val KmClass.klibEnumEntries: MutableList<KlibEnumEntry>
get() = klibExtensions.enumEntries
val KmProperty.annotations: MutableList<KmAnnotation>
get() = klibExtensions.annotations
@@ -31,6 +31,8 @@ abstract class KlibClassExtensionVisitor : KmClassExtensionVisitor {
abstract fun visitFile(file: KlibSourceFile)
abstract fun visitEnumEntry(entry: KlibEnumEntry)
override val type: KmExtensionType
get() = TYPE