[kotlinx-metadata] Add extensions for type aliases.

This commit is contained in:
Sergey Bogolepov
2019-11-18 17:11:56 +07:00
parent 85b36dcd88
commit e4702bf438
12 changed files with 132 additions and 0 deletions
@@ -33,6 +33,9 @@ internal val KmPackage.klibExtensions: KlibPackageExtension
internal val KmModuleFragment.klibExtensions: KlibModuleFragmentExtension
get() = visitExtensions(KlibModuleFragmentExtensionVisitor.TYPE) as KlibModuleFragmentExtension
internal val KmTypeAlias.klibExtensions: KlibTypeAliasExtension
get() = visitExtensions(KlibTypeAliasExtensionVisitor.TYPE) as KlibTypeAliasExtension
internal class KlibFunctionExtension : KlibFunctionExtensionVisitor(), KmFunctionExtension {
val annotations: MutableList<KmAnnotation> = mutableListOf()
@@ -221,4 +224,17 @@ internal class KlibModuleFragmentExtension : KlibModuleFragmentExtensionVisitor(
fqName?.let(visitor::visitFqName)
className.forEach(visitor::visitClassName)
}
}
internal class KlibTypeAliasExtension : KlibTypeAliasExtensionVisitor(), KmTypeAliasExtension {
var uniqId: UniqId? = null
override fun visitUniqId(uniqId: UniqId) {
this.uniqId = uniqId
}
override fun accept(visitor: KmTypeExtensionVisitor) {
require(visitor is KlibTypeAliasExtensionVisitor)
uniqId?.let(visitor::visitUniqId)
}
}
@@ -126,6 +126,14 @@ internal class KlibMetadataExtensions : MetadataExtensions {
}
}
override fun readTypeAliasExtensions(v: KmTypeAliasVisitor, proto: ProtoBuf.TypeAlias, c: ReadContext) {
val extension = v.visitExtensions(KlibTypeAliasExtensionVisitor.TYPE) as? KlibTypeAliasExtensionVisitor ?: return
proto.getExtension(KlibMetadataProtoBuf.typeAliasUniqId).let { descriptorUniqId ->
extension.visitUniqId(descriptorUniqId.readUniqId())
}
}
override fun writeClassExtensions(type: KmExtensionType, proto: ProtoBuf.Class.Builder, c: WriteContext): KmClassExtensionVisitor? {
if (type != KlibClassExtensionVisitor.TYPE) return null
return object : KlibClassExtensionVisitor() {
@@ -324,6 +332,22 @@ internal class KlibMetadataExtensions : MetadataExtensions {
}
}
override fun writeTypeAliasExtensions(
type: KmExtensionType,
proto: ProtoBuf.TypeAlias.Builder,
c: WriteContext
): KmTypeAliasExtensionVisitor? {
if (type != KlibTypeAliasExtensionVisitor.TYPE) return null
return object : KlibTypeAliasExtensionVisitor() {
override fun visitUniqId(uniqId: UniqId) {
proto.setExtension(
KlibMetadataProtoBuf.typeAliasUniqId,
uniqId.writeUniqId().build()
)
}
}
}
override fun createClassExtension(): KmClassExtension =
KlibClassExtension()
@@ -347,4 +371,7 @@ internal class KlibMetadataExtensions : MetadataExtensions {
override fun createTypeExtension(): KmTypeExtension =
KlibTypeExtension()
override fun createTypeAliasExtension(): KmTypeAliasExtension =
KlibTypeAliasExtension()
}
@@ -99,6 +99,12 @@ val KmTypeParameter.annotations: MutableList<KmAnnotation>
get() = klibExtensions.annotations
var KmTypeParameter.uniqId: UniqId?
get() = klibExtensions.uniqId
set(value) {
klibExtensions.uniqId = value
}
var KmTypeAlias.uniqId: UniqId?
get() = klibExtensions.uniqId
set(value) {
klibExtensions.uniqId = value
@@ -127,4 +127,16 @@ abstract class KlibModuleFragmentExtensionVisitor : KmModuleFragmentExtensionVis
companion object {
val TYPE = KmExtensionType(KlibModuleFragmentExtensionVisitor::class)
}
}
abstract class KlibTypeAliasExtensionVisitor : KmTypeAliasExtensionVisitor {
abstract fun visitUniqId(uniqId: UniqId)
override val type: KmExtensionType
get() = TYPE
companion object {
val TYPE = KmExtensionType(KlibTypeAliasExtensionVisitor::class)
}
}