[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 {
|
internal class KlibClassExtension : KlibClassExtensionVisitor(), KmClassExtension {
|
||||||
|
|
||||||
val annotations: MutableList<KmAnnotation> = mutableListOf()
|
val annotations: MutableList<KmAnnotation> = mutableListOf()
|
||||||
|
val enumEntries: MutableList<KlibEnumEntry> = mutableListOf()
|
||||||
var uniqId: UniqId? = null
|
var uniqId: UniqId? = null
|
||||||
var file: KlibSourceFile? = null
|
var file: KlibSourceFile? = null
|
||||||
|
|
||||||
@@ -83,9 +84,14 @@ internal class KlibClassExtension : KlibClassExtensionVisitor(), KmClassExtensio
|
|||||||
this.file = file
|
this.file = file
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun visitEnumEntry(entry: KlibEnumEntry) {
|
||||||
|
enumEntries += entry
|
||||||
|
}
|
||||||
|
|
||||||
override fun accept(visitor: KmClassExtensionVisitor) {
|
override fun accept(visitor: KmClassExtensionVisitor) {
|
||||||
require(visitor is KlibClassExtensionVisitor)
|
require(visitor is KlibClassExtensionVisitor)
|
||||||
annotations.forEach(visitor::visitAnnotation)
|
annotations.forEach(visitor::visitAnnotation)
|
||||||
|
enumEntries.forEach(visitor::visitEnumEntry)
|
||||||
uniqId?.let(visitor::visitUniqId)
|
uniqId?.let(visitor::visitUniqId)
|
||||||
file?.let(visitor::visitFile)
|
file?.let(visitor::visitFile)
|
||||||
}
|
}
|
||||||
|
|||||||
+22
@@ -37,6 +37,13 @@ internal class KlibMetadataExtensions : MetadataExtensions {
|
|||||||
proto.getExtensionOrNull(KlibMetadataProtoBuf.classFile)?.let {
|
proto.getExtensionOrNull(KlibMetadataProtoBuf.classFile)?.let {
|
||||||
extension.visitFile(c.getSourceFile(it))
|
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) {
|
override fun readPackageExtensions(v: KmPackageVisitor, proto: ProtoBuf.Package, c: ReadContext) {
|
||||||
@@ -163,6 +170,21 @@ internal class KlibMetadataExtensions : MetadataExtensions {
|
|||||||
val fileIdx = c.getIndexOf(file)
|
val fileIdx = c.getIndexOf(file)
|
||||||
proto.setExtension(KlibMetadataProtoBuf.classFile, fileIdx)
|
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
|
klibExtensions.file = value
|
||||||
}
|
}
|
||||||
|
|
||||||
|
val KmClass.klibEnumEntries: MutableList<KlibEnumEntry>
|
||||||
|
get() = klibExtensions.enumEntries
|
||||||
|
|
||||||
val KmProperty.annotations: MutableList<KmAnnotation>
|
val KmProperty.annotations: MutableList<KmAnnotation>
|
||||||
get() = klibExtensions.annotations
|
get() = klibExtensions.annotations
|
||||||
|
|
||||||
|
|||||||
+2
@@ -31,6 +31,8 @@ abstract class KlibClassExtensionVisitor : KmClassExtensionVisitor {
|
|||||||
|
|
||||||
abstract fun visitFile(file: KlibSourceFile)
|
abstract fun visitFile(file: KlibSourceFile)
|
||||||
|
|
||||||
|
abstract fun visitEnumEntry(entry: KlibEnumEntry)
|
||||||
|
|
||||||
override val type: KmExtensionType
|
override val type: KmExtensionType
|
||||||
get() = TYPE
|
get() = TYPE
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user