[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
@@ -107,6 +107,8 @@ internal class JvmMetadataExtensions : MetadataExtensions {
ext.visitEnd()
}
override fun readTypeAliasExtensions(v: KmTypeAliasVisitor, proto: ProtoBuf.TypeAlias, c: ReadContext) {}
override fun writeClassExtensions(type: KmExtensionType, proto: ProtoBuf.Class.Builder, c: WriteContext): KmClassExtensionVisitor? {
if (type != JvmClassExtensionVisitor.TYPE) return null
return object : JvmClassExtensionVisitor() {
@@ -268,6 +270,12 @@ internal class JvmMetadataExtensions : MetadataExtensions {
}
}
override fun writeTypeAliasExtensions(
type: KmExtensionType,
proto: ProtoBuf.TypeAlias.Builder,
c: WriteContext
): KmTypeAliasExtensionVisitor? = null
override fun createClassExtension(): KmClassExtension = JvmClassExtension()
override fun createPackageExtension(): KmPackageExtension = JvmPackageExtension()
@@ -285,6 +293,8 @@ internal class JvmMetadataExtensions : MetadataExtensions {
override fun createTypeExtension(): KmTypeExtension = JvmTypeExtension()
override fun createTypeAliasExtension(): KmTypeAliasExtension = JvmTypeAliasExtension()
private fun JvmMemberSignature.toJvmMethodSignature(c: WriteContext): JvmProtoBuf.JvmMethodSignature =
JvmProtoBuf.JvmMethodSignature.newBuilder().apply {
name = c[this@toJvmMethodSignature.name]
@@ -176,3 +176,10 @@ internal class JvmTypeExtension : JvmTypeExtensionVisitor(), KmTypeExtension {
visitor.visitEnd()
}
}
internal class JvmTypeAliasExtension : JvmTypeAliasExtensionVisitor(), KmTypeAliasExtension {
override fun accept(visitor: KmTypeExtensionVisitor) {
require(visitor is JvmTypeAliasExtensionVisitor)
visitor.visitEnd()
}
}
@@ -348,3 +348,30 @@ open class JvmTypeExtensionVisitor @JvmOverloads constructor(
const val PLATFORM_TYPE_ID = JvmProtoBufUtil.PLATFORM_TYPE_ID
}
}
/**
* A visitor to visit JVM extensions for a type alias.
*/
open class JvmTypeAliasExtensionVisitor @JvmOverloads constructor(
private val delegate: JvmTypeAliasExtensionVisitor? = null
) : KmTypeAliasExtensionVisitor {
final override val type: KmExtensionType
get() = TYPE
/**
* Visits the end of JVM extensions for the type alias.
*/
open fun visitEnd() {
delegate?.visitEnd()
}
companion object {
/**
* The type of this extension visitor.
*
* @see KmExtensionType
*/
@JvmField
val TYPE: KmExtensionType = KmExtensionType(JvmTypeAliasExtensionVisitor::class)
}
}
@@ -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)
}
}
@@ -93,3 +93,8 @@ interface KmTypeParameterExtensionVisitor : KmExtensionVisitor
* A visitor to visit platform-specific extensions for a type.
*/
interface KmTypeExtensionVisitor : KmExtensionVisitor
/**
* A visitor to visit platform-specific extensions for a type alias.
*/
interface KmTypeAliasExtensionVisitor : KmExtensionVisitor
@@ -28,6 +28,8 @@ interface MetadataExtensions {
fun readTypeExtensions(v: KmTypeVisitor, proto: ProtoBuf.Type, c: ReadContext)
fun readTypeAliasExtensions(v: KmTypeAliasVisitor, proto: ProtoBuf.TypeAlias, c: ReadContext)
fun writeClassExtensions(type: KmExtensionType, proto: ProtoBuf.Class.Builder, c: WriteContext): KmClassExtensionVisitor?
fun writePackageExtensions(type: KmExtensionType, proto: ProtoBuf.Package.Builder, c: WriteContext): KmPackageExtensionVisitor?
@@ -50,6 +52,8 @@ interface MetadataExtensions {
fun writeTypeExtensions(type: KmExtensionType, proto: ProtoBuf.Type.Builder, c: WriteContext): KmTypeExtensionVisitor?
fun writeTypeAliasExtensions(type: KmExtensionType, proto: ProtoBuf.TypeAlias.Builder, c: WriteContext): KmTypeAliasExtensionVisitor?
fun createClassExtension(): KmClassExtension
fun createPackageExtension(): KmPackageExtension
@@ -66,6 +70,8 @@ interface MetadataExtensions {
fun createTypeExtension(): KmTypeExtension
fun createTypeAliasExtension(): KmTypeAliasExtension
companion object {
val INSTANCES: List<MetadataExtensions> by lazy {
ServiceLoader.load(MetadataExtensions::class.java, MetadataExtensions::class.java.classLoader).toList().also {
@@ -26,3 +26,5 @@ interface KmConstructorExtension : KmConstructorExtensionVisitor, KmExtension<Km
interface KmTypeParameterExtension : KmTypeParameterExtensionVisitor, KmExtension<KmTypeParameterExtensionVisitor>
interface KmTypeExtension : KmTypeExtensionVisitor, KmExtension<KmTypeExtensionVisitor>
interface KmTypeAliasExtension : KmTypeAliasExtensionVisitor, KmExtension<KmTypeExtensionVisitor>
@@ -516,6 +516,9 @@ class KmTypeAlias(
*/
val versionRequirements: MutableList<KmVersionRequirement> = ArrayList(0)
private val extensions: List<KmTypeAliasExtension> =
MetadataExtensions.INSTANCES.map(MetadataExtensions::createTypeAliasExtension)
override fun visitTypeParameter(flags: Flags, name: String, id: Int, variance: KmVariance): KmTypeParameterVisitor =
KmTypeParameter(flags, name, id, variance).addTo(typeParameters)
@@ -529,6 +532,9 @@ class KmTypeAlias(
annotations.add(annotation)
}
override fun visitExtensions(type: KmExtensionType): KmTypeAliasExtensionVisitor? =
extensions.singleOfType(type)
override fun visitVersionRequirement(): KmVersionRequirementVisitor =
KmVersionRequirement().addTo(versionRequirements)
@@ -464,6 +464,14 @@ abstract class KmTypeAliasVisitor @JvmOverloads constructor(private val delegate
open fun visitVersionRequirement(): KmVersionRequirementVisitor? =
delegate?.visitVersionRequirement()
/**
* Visits the extensions of the given type on the type alias.
*
* @param type the type of extension visitor to be returned
*/
open fun visitExtensions(type: KmExtensionType): KmTypeAliasExtensionVisitor? =
delegate?.visitExtensions(type)
/**
* Visits the end of the type alias.
*/