[kotlinx-metadata] Add extensions for KmValueParameter

There is no extension on jvm, but klibs have parameter annotations.
This commit is contained in:
Sergey Bogolepov
2019-11-27 17:33:09 +07:00
parent 18bb615dd9
commit a08cf59017
14 changed files with 152 additions and 3 deletions
@@ -36,6 +36,9 @@ internal val KmModuleFragment.klibExtensions: KlibModuleFragmentExtension
internal val KmTypeAlias.klibExtensions: KlibTypeAliasExtension
get() = visitExtensions(KlibTypeAliasExtensionVisitor.TYPE) as KlibTypeAliasExtension
internal val KmValueParameter.klibExtensions: KlibValueParameterExtension
get() = visitExtensions(KlibValueParameterExtensionVisitor.TYPE) as KlibValueParameterExtension
internal class KlibFunctionExtension : KlibFunctionExtensionVisitor(), KmFunctionExtension {
val annotations: MutableList<KmAnnotation> = mutableListOf()
@@ -233,8 +236,21 @@ internal class KlibTypeAliasExtension : KlibTypeAliasExtensionVisitor(), KmTypeA
this.uniqId = uniqId
}
override fun accept(visitor: KmTypeExtensionVisitor) {
override fun accept(visitor: KmTypeAliasExtensionVisitor) {
require(visitor is KlibTypeAliasExtensionVisitor)
uniqId?.let(visitor::visitUniqId)
}
}
internal class KlibValueParameterExtension : KlibValueParameterExtensionVisitor(), KmValueParameterExtension {
val annotations: MutableList<KmAnnotation> = mutableListOf()
override fun visitAnnotation(annotation: KmAnnotation) {
annotations += annotation
}
override fun accept(visitor: KmValueParameterExtensionVisitor) {
require(visitor is KlibValueParameterExtensionVisitor)
annotations.forEach(visitor::visitAnnotation)
}
}
@@ -134,6 +134,14 @@ internal class KlibMetadataExtensions : MetadataExtensions {
}
}
override fun readValueParameterExtensions(v: KmValueParameterVisitor, proto: ProtoBuf.ValueParameter, c: ReadContext) {
val extension = v.visitExtensions(KlibValueParameterExtensionVisitor.TYPE) as? KlibValueParameterExtensionVisitor ?: return
proto.getExtension(KlibMetadataProtoBuf.parameterAnnotation).forEach { annotation ->
extension.visitAnnotation(annotation.readAnnotation(c.strings))
}
}
override fun writeClassExtensions(type: KmExtensionType, proto: ProtoBuf.Class.Builder, c: WriteContext): KmClassExtensionVisitor? {
if (type != KlibClassExtensionVisitor.TYPE) return null
return object : KlibClassExtensionVisitor() {
@@ -348,6 +356,22 @@ internal class KlibMetadataExtensions : MetadataExtensions {
}
}
override fun writeValueParameterExtensions(
type: KmExtensionType,
proto: ProtoBuf.ValueParameter.Builder,
c: WriteContext
): KmValueParameterExtensionVisitor? {
if (type != KlibValueParameterExtensionVisitor.TYPE) return null
return object : KlibValueParameterExtensionVisitor() {
override fun visitAnnotation(annotation: KmAnnotation) {
proto.addExtension(
KlibMetadataProtoBuf.parameterAnnotation,
annotation.writeAnnotation(c.strings).build()
)
}
}
}
override fun createClassExtension(): KmClassExtension =
KlibClassExtension()
@@ -374,4 +398,7 @@ internal class KlibMetadataExtensions : MetadataExtensions {
override fun createTypeAliasExtension(): KmTypeAliasExtension =
KlibTypeAliasExtension()
override fun createValueParameterExtension(): KmValueParameterExtension =
KlibValueParameterExtension()
}
@@ -108,4 +108,7 @@ var KmTypeAlias.uniqId: UniqId?
get() = klibExtensions.uniqId
set(value) {
klibExtensions.uniqId = value
}
}
val KmValueParameter.annotations: MutableList<KmAnnotation>
get() = klibExtensions.annotations
@@ -139,4 +139,16 @@ abstract class KlibTypeAliasExtensionVisitor : KmTypeAliasExtensionVisitor {
companion object {
val TYPE = KmExtensionType(KlibTypeAliasExtensionVisitor::class)
}
}
abstract class KlibValueParameterExtensionVisitor : KmValueParameterExtensionVisitor {
abstract fun visitAnnotation(annotation: KmAnnotation)
override val type: KmExtensionType
get() = TYPE
companion object {
val TYPE = KmExtensionType(KlibValueParameterExtensionVisitor::class)
}
}