[kotlinx-metadata] Add extensions for type aliases.
This commit is contained in:
@@ -107,6 +107,8 @@ internal class JvmMetadataExtensions : MetadataExtensions {
|
|||||||
ext.visitEnd()
|
ext.visitEnd()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun readTypeAliasExtensions(v: KmTypeAliasVisitor, proto: ProtoBuf.TypeAlias, c: ReadContext) {}
|
||||||
|
|
||||||
override fun writeClassExtensions(type: KmExtensionType, proto: ProtoBuf.Class.Builder, c: WriteContext): KmClassExtensionVisitor? {
|
override fun writeClassExtensions(type: KmExtensionType, proto: ProtoBuf.Class.Builder, c: WriteContext): KmClassExtensionVisitor? {
|
||||||
if (type != JvmClassExtensionVisitor.TYPE) return null
|
if (type != JvmClassExtensionVisitor.TYPE) return null
|
||||||
return object : JvmClassExtensionVisitor() {
|
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 createClassExtension(): KmClassExtension = JvmClassExtension()
|
||||||
|
|
||||||
override fun createPackageExtension(): KmPackageExtension = JvmPackageExtension()
|
override fun createPackageExtension(): KmPackageExtension = JvmPackageExtension()
|
||||||
@@ -285,6 +293,8 @@ internal class JvmMetadataExtensions : MetadataExtensions {
|
|||||||
|
|
||||||
override fun createTypeExtension(): KmTypeExtension = JvmTypeExtension()
|
override fun createTypeExtension(): KmTypeExtension = JvmTypeExtension()
|
||||||
|
|
||||||
|
override fun createTypeAliasExtension(): KmTypeAliasExtension = JvmTypeAliasExtension()
|
||||||
|
|
||||||
private fun JvmMemberSignature.toJvmMethodSignature(c: WriteContext): JvmProtoBuf.JvmMethodSignature =
|
private fun JvmMemberSignature.toJvmMethodSignature(c: WriteContext): JvmProtoBuf.JvmMethodSignature =
|
||||||
JvmProtoBuf.JvmMethodSignature.newBuilder().apply {
|
JvmProtoBuf.JvmMethodSignature.newBuilder().apply {
|
||||||
name = c[this@toJvmMethodSignature.name]
|
name = c[this@toJvmMethodSignature.name]
|
||||||
|
|||||||
@@ -176,3 +176,10 @@ internal class JvmTypeExtension : JvmTypeExtensionVisitor(), KmTypeExtension {
|
|||||||
visitor.visitEnd()
|
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
|
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
|
internal val KmModuleFragment.klibExtensions: KlibModuleFragmentExtension
|
||||||
get() = visitExtensions(KlibModuleFragmentExtensionVisitor.TYPE) as KlibModuleFragmentExtension
|
get() = visitExtensions(KlibModuleFragmentExtensionVisitor.TYPE) as KlibModuleFragmentExtension
|
||||||
|
|
||||||
|
internal val KmTypeAlias.klibExtensions: KlibTypeAliasExtension
|
||||||
|
get() = visitExtensions(KlibTypeAliasExtensionVisitor.TYPE) as KlibTypeAliasExtension
|
||||||
|
|
||||||
internal class KlibFunctionExtension : KlibFunctionExtensionVisitor(), KmFunctionExtension {
|
internal class KlibFunctionExtension : KlibFunctionExtensionVisitor(), KmFunctionExtension {
|
||||||
|
|
||||||
val annotations: MutableList<KmAnnotation> = mutableListOf()
|
val annotations: MutableList<KmAnnotation> = mutableListOf()
|
||||||
@@ -222,3 +225,16 @@ internal class KlibModuleFragmentExtension : KlibModuleFragmentExtensionVisitor(
|
|||||||
className.forEach(visitor::visitClassName)
|
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? {
|
override fun writeClassExtensions(type: KmExtensionType, proto: ProtoBuf.Class.Builder, c: WriteContext): KmClassExtensionVisitor? {
|
||||||
if (type != KlibClassExtensionVisitor.TYPE) return null
|
if (type != KlibClassExtensionVisitor.TYPE) return null
|
||||||
return object : KlibClassExtensionVisitor() {
|
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 =
|
override fun createClassExtension(): KmClassExtension =
|
||||||
KlibClassExtension()
|
KlibClassExtension()
|
||||||
|
|
||||||
@@ -347,4 +371,7 @@ internal class KlibMetadataExtensions : MetadataExtensions {
|
|||||||
|
|
||||||
override fun createTypeExtension(): KmTypeExtension =
|
override fun createTypeExtension(): KmTypeExtension =
|
||||||
KlibTypeExtension()
|
KlibTypeExtension()
|
||||||
|
|
||||||
|
override fun createTypeAliasExtension(): KmTypeAliasExtension =
|
||||||
|
KlibTypeAliasExtension()
|
||||||
}
|
}
|
||||||
@@ -103,3 +103,9 @@ var KmTypeParameter.uniqId: UniqId?
|
|||||||
set(value) {
|
set(value) {
|
||||||
klibExtensions.uniqId = value
|
klibExtensions.uniqId = value
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var KmTypeAlias.uniqId: UniqId?
|
||||||
|
get() = klibExtensions.uniqId
|
||||||
|
set(value) {
|
||||||
|
klibExtensions.uniqId = value
|
||||||
|
}
|
||||||
+12
@@ -128,3 +128,15 @@ abstract class KlibModuleFragmentExtensionVisitor : KmModuleFragmentExtensionVis
|
|||||||
val TYPE = KmExtensionType(KlibModuleFragmentExtensionVisitor::class)
|
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.
|
* A visitor to visit platform-specific extensions for a type.
|
||||||
*/
|
*/
|
||||||
interface KmTypeExtensionVisitor : KmExtensionVisitor
|
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 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 writeClassExtensions(type: KmExtensionType, proto: ProtoBuf.Class.Builder, c: WriteContext): KmClassExtensionVisitor?
|
||||||
|
|
||||||
fun writePackageExtensions(type: KmExtensionType, proto: ProtoBuf.Package.Builder, c: WriteContext): KmPackageExtensionVisitor?
|
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 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 createClassExtension(): KmClassExtension
|
||||||
|
|
||||||
fun createPackageExtension(): KmPackageExtension
|
fun createPackageExtension(): KmPackageExtension
|
||||||
@@ -66,6 +70,8 @@ interface MetadataExtensions {
|
|||||||
|
|
||||||
fun createTypeExtension(): KmTypeExtension
|
fun createTypeExtension(): KmTypeExtension
|
||||||
|
|
||||||
|
fun createTypeAliasExtension(): KmTypeAliasExtension
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
val INSTANCES: List<MetadataExtensions> by lazy {
|
val INSTANCES: List<MetadataExtensions> by lazy {
|
||||||
ServiceLoader.load(MetadataExtensions::class.java, MetadataExtensions::class.java.classLoader).toList().also {
|
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 KmTypeParameterExtension : KmTypeParameterExtensionVisitor, KmExtension<KmTypeParameterExtensionVisitor>
|
||||||
|
|
||||||
interface KmTypeExtension : KmTypeExtensionVisitor, KmExtension<KmTypeExtensionVisitor>
|
interface KmTypeExtension : KmTypeExtensionVisitor, KmExtension<KmTypeExtensionVisitor>
|
||||||
|
|
||||||
|
interface KmTypeAliasExtension : KmTypeAliasExtensionVisitor, KmExtension<KmTypeExtensionVisitor>
|
||||||
@@ -516,6 +516,9 @@ class KmTypeAlias(
|
|||||||
*/
|
*/
|
||||||
val versionRequirements: MutableList<KmVersionRequirement> = ArrayList(0)
|
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 =
|
override fun visitTypeParameter(flags: Flags, name: String, id: Int, variance: KmVariance): KmTypeParameterVisitor =
|
||||||
KmTypeParameter(flags, name, id, variance).addTo(typeParameters)
|
KmTypeParameter(flags, name, id, variance).addTo(typeParameters)
|
||||||
|
|
||||||
@@ -529,6 +532,9 @@ class KmTypeAlias(
|
|||||||
annotations.add(annotation)
|
annotations.add(annotation)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun visitExtensions(type: KmExtensionType): KmTypeAliasExtensionVisitor? =
|
||||||
|
extensions.singleOfType(type)
|
||||||
|
|
||||||
override fun visitVersionRequirement(): KmVersionRequirementVisitor =
|
override fun visitVersionRequirement(): KmVersionRequirementVisitor =
|
||||||
KmVersionRequirement().addTo(versionRequirements)
|
KmVersionRequirement().addTo(versionRequirements)
|
||||||
|
|
||||||
|
|||||||
@@ -464,6 +464,14 @@ abstract class KmTypeAliasVisitor @JvmOverloads constructor(private val delegate
|
|||||||
open fun visitVersionRequirement(): KmVersionRequirementVisitor? =
|
open fun visitVersionRequirement(): KmVersionRequirementVisitor? =
|
||||||
delegate?.visitVersionRequirement()
|
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.
|
* Visits the end of the type alias.
|
||||||
*/
|
*/
|
||||||
|
|||||||
Reference in New Issue
Block a user