[kotlinx-metadata] Add extensions for type aliases.
This commit is contained in:
@@ -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)
|
||||
}
|
||||
}
|
||||
+27
@@ -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
|
||||
|
||||
+12
@@ -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.
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user