[kotlinx-metadata-klib] Proper support for enum entries
This commit is contained in:
@@ -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)
|
||||
}
|
||||
|
||||
+22
@@ -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
|
||||
|
||||
|
||||
+2
@@ -31,6 +31,8 @@ abstract class KlibClassExtensionVisitor : KmClassExtensionVisitor {
|
||||
|
||||
abstract fun visitFile(file: KlibSourceFile)
|
||||
|
||||
abstract fun visitEnumEntry(entry: KlibEnumEntry)
|
||||
|
||||
override val type: KmExtensionType
|
||||
get() = TYPE
|
||||
|
||||
|
||||
Reference in New Issue
Block a user