Skip to content

Commit 9db719a

Browse files
udalovSpace Team
authored and
Space Team
committed
kotlin-metadata: introduce KmClass.kmEnumEntries
This will be used to implement KT-71235. Also, it allows to get rid of KlibEnumEntry.
1 parent 9b8a4c2 commit 9db719a

File tree

22 files changed

+208
-103
lines changed

22 files changed

+208
-103
lines changed

kotlin-native/Interop/StubGenerator/src/org/jetbrains/kotlin/native/interop/gen/StubIrMetadataEmitter.kt

+8-11
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,11 @@
44
*/
55
package org.jetbrains.kotlin.native.interop.gen
66

7-
import kotlinx.metadata.klib.KlibEnumEntry
8-
import kotlinx.metadata.klib.KlibModuleMetadata
9-
import kotlin.metadata.*
107
import kotlinx.metadata.klib.*
11-
import kotlin.metadata.internal.common.KmModuleFragment
128
import org.jetbrains.kotlin.metadata.serialization.Interner
139
import org.jetbrains.kotlin.utils.addIfNotNull
10+
import kotlin.metadata.*
11+
import kotlin.metadata.internal.common.KmModuleFragment
1412

1513
class StubIrMetadataEmitter(
1614
private val context: StubIrContext,
@@ -132,7 +130,7 @@ internal class ModuleMetadataEmitter(
132130
km.constructors += elements.constructors.toList()
133131
km.companionObject = element.companion?.nestedName()
134132
if (element is ClassStub.Enum) {
135-
element.entries.mapTo(km.klibEnumEntries) { mapEnumEntry(it, classVisitingContext) }
133+
km.kmEnumEntries += element.entries.map { mapEnumEntry(it, classVisitingContext) }
136134
}
137135
}
138136
}
@@ -222,13 +220,12 @@ internal class ModuleMetadataEmitter(
222220
simpleStubContainer.children.mapNotNull { it.accept(this, data) } +
223221
simpleStubContainer.simpleContainers.flatMap { visitSimpleStubContainer(it, data) }
224222

225-
private fun mapEnumEntry(enumEntry: EnumEntryStub, data: VisitingContext): KlibEnumEntry =
223+
private fun mapEnumEntry(enumEntry: EnumEntryStub, data: VisitingContext): KmEnumEntry =
226224
data.withMappingExtensions {
227-
KlibEnumEntry(
228-
name = enumEntry.name,
229-
ordinal = enumEntry.ordinal,
230-
annotations = mutableListOf(enumEntry.constant.mapToConstantAnnotation())
231-
)
225+
KmEnumEntry(enumEntry.name).apply {
226+
ordinal = enumEntry.ordinal
227+
annotations.add(enumEntry.constant.mapToConstantAnnotation())
228+
}
232229
}
233230
}
234231
}

libraries/kotlinx-metadata/jvm/api/kotlin-metadata-jvm.api

+8
Original file line numberDiff line numberDiff line change
@@ -364,6 +364,7 @@ public final class kotlin/metadata/KmClass : kotlin/metadata/KmDeclarationContai
364364
public fun getFunctions ()Ljava/util/List;
365365
public final fun getInlineClassUnderlyingPropertyName ()Ljava/lang/String;
366366
public final fun getInlineClassUnderlyingType ()Lkotlin/metadata/KmType;
367+
public final fun getKmEnumEntries ()Ljava/util/List;
367368
public final fun getName ()Ljava/lang/String;
368369
public final fun getNestedClasses ()Ljava/util/List;
369370
public fun getProperties ()Ljava/util/List;
@@ -484,6 +485,13 @@ public final class kotlin/metadata/KmEffectType : java/lang/Enum {
484485
public static fun values ()[Lkotlin/metadata/KmEffectType;
485486
}
486487

488+
public final class kotlin/metadata/KmEnumEntry {
489+
public fun <init> (Ljava/lang/String;)V
490+
public final fun getName ()Ljava/lang/String;
491+
public final fun setName (Ljava/lang/String;)V
492+
public fun toString ()Ljava/lang/String;
493+
}
494+
487495
public final class kotlin/metadata/KmFlexibleTypeUpperBound {
488496
public static final field Companion Lkotlin/metadata/KmFlexibleTypeUpperBound$Companion;
489497
public fun <init> (Lkotlin/metadata/KmType;Ljava/lang/String;)V

libraries/kotlinx-metadata/jvm/src/kotlin/metadata/jvm/internal/JvmMetadataExtensions.kt

+8
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,9 @@ internal class JvmMetadataExtensions : MetadataExtensions {
105105
}
106106
}
107107

108+
override fun readEnumEntryExtensions(kmEnumEntry: KmEnumEntry, proto: ProtoBuf.EnumEntry, c: ReadContext) {
109+
}
110+
108111
override fun readTypeExtensions(kmType: KmType, proto: ProtoBuf.Type, c: ReadContext) {
109112
val ext = kmType.jvm
110113
ext.isRaw = proto.getExtension(JvmProtoBuf.isRaw)
@@ -220,6 +223,9 @@ internal class JvmMetadataExtensions : MetadataExtensions {
220223
}
221224
}
222225

226+
override fun writeEnumEntryExtensions(enumEntry: KmEnumEntry, proto: ProtoBuf.EnumEntry.Builder, c: WriteContext) {
227+
}
228+
223229
override fun writeTypeExtensions(type: KmType, proto: ProtoBuf.Type.Builder, c: WriteContext) =
224230
with(type.jvm) {
225231
if (isRaw) proto.setExtension(JvmProtoBuf.isRaw, true)
@@ -259,6 +265,8 @@ internal class JvmMetadataExtensions : MetadataExtensions {
259265

260266
override fun createTypeParameterExtension(): KmTypeParameterExtension = JvmTypeParameterExtension()
261267

268+
override fun createEnumEntryExtension(): KmEnumEntryExtension? = null
269+
262270
override fun createTypeExtension(): KmTypeExtension = JvmTypeExtension()
263271

264272
override fun createTypeAliasExtension(): KmTypeAliasExtension? = null

libraries/kotlinx-metadata/klib/src/kotlinx/metadata/klib/KlibEnumEntry.kt

-16
This file was deleted.

libraries/kotlinx-metadata/klib/src/kotlinx/metadata/klib/impl/klibExtensionNodes.kt

+16-2
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
*/
55
package kotlinx.metadata.klib.impl
66

7-
import kotlinx.metadata.klib.KlibEnumEntry
87
import kotlinx.metadata.klib.KlibSourceFile
98
import kotlinx.metadata.klib.UniqId
109
import kotlin.metadata.*
@@ -29,6 +28,9 @@ internal val KmConstructor.klibExtensions: KlibConstructorExtension
2928
internal val KmTypeParameter.klibExtensions: KlibTypeParameterExtension
3029
get() = getExtension(KlibTypeParameterExtension.TYPE) as KlibTypeParameterExtension
3130

31+
internal val KmEnumEntry.klibExtensions: KlibEnumEntryExtension
32+
get() = getExtension(KlibEnumEntryExtension.TYPE) as KlibEnumEntryExtension
33+
3234
internal val KmPackage.klibExtensions: KlibPackageExtension
3335
get() = getExtension(KlibPackageExtension.TYPE) as KlibPackageExtension
3436

@@ -51,7 +53,6 @@ internal class KlibFunctionExtension : KmFunctionExtension {
5153
}
5254

5355
internal class KlibClassExtension : KmClassExtension {
54-
val enumEntries: MutableList<KlibEnumEntry> = mutableListOf()
5556
var uniqId: UniqId? = null
5657
var file: KlibSourceFile? = null
5758

@@ -124,6 +125,19 @@ internal class KlibTypeParameterExtension : KmTypeParameterExtension {
124125
}
125126
}
126127

128+
internal class KlibEnumEntryExtension : KmEnumEntryExtension {
129+
var ordinal: Int? = null
130+
var uniqId: UniqId? = null
131+
val annotations: MutableList<KmAnnotation> = mutableListOf()
132+
133+
override val type: KmExtensionType
134+
get() = TYPE
135+
136+
companion object {
137+
val TYPE = KmExtensionType(KlibEnumEntryExtension::class)
138+
}
139+
}
140+
127141
internal class KlibPackageExtension : KmPackageExtension {
128142
var fqName: String? = null
129143

libraries/kotlinx-metadata/klib/src/kotlinx/metadata/klib/impl/klibMetadataExtensions.kt

+25-26
Original file line numberDiff line numberDiff line change
@@ -37,13 +37,6 @@ internal class KlibMetadataExtensions : MetadataExtensions {
3737
proto.getExtensionOrNull(KlibMetadataProtoBuf.classFile)?.let {
3838
extension.file = c.getSourceFile(it)
3939
}
40-
for (entryProto in proto.enumEntryList) {
41-
val ordinal = entryProto.getExtensionOrNull(KlibMetadataProtoBuf.enumEntryOrdinal)
42-
val name = c[entryProto.name]
43-
val uniqId = entryProto.getExtensionOrNull(KlibMetadataProtoBuf.enumEntryUniqId)?.readUniqId()
44-
val annotations = entryProto.getExtension(KlibMetadataProtoBuf.enumEntryAnnotation).map { it.readAnnotation(c.strings) }
45-
extension.enumEntries.add(KlibEnumEntry(name, uniqId, ordinal, annotations.toMutableList()))
46-
}
4740
}
4841

4942
override fun readPackageExtensions(kmPackage: KmPackage, proto: ProtoBuf.Package, c: ReadContext) {
@@ -131,6 +124,16 @@ internal class KlibMetadataExtensions : MetadataExtensions {
131124
}
132125
}
133126

127+
override fun readEnumEntryExtensions(kmEnumEntry: KmEnumEntry, proto: ProtoBuf.EnumEntry, c: ReadContext) {
128+
val extension = kmEnumEntry.klibExtensions
129+
130+
extension.ordinal = proto.getExtensionOrNull(KlibMetadataProtoBuf.enumEntryOrdinal)
131+
extension.uniqId = proto.getExtensionOrNull(KlibMetadataProtoBuf.enumEntryUniqId)?.readUniqId()
132+
for (annotation in proto.getExtension(KlibMetadataProtoBuf.enumEntryAnnotation)) {
133+
extension.annotations.add(annotation.readAnnotation(c.strings))
134+
}
135+
}
136+
134137
override fun readTypeExtensions(kmType: KmType, proto: ProtoBuf.Type, c: ReadContext) {
135138
val extension = kmType.klibExtensions
136139

@@ -158,25 +161,6 @@ internal class KlibMetadataExtensions : MetadataExtensions {
158161
proto.addExtension(KlibMetadataProtoBuf.classAnnotation, annotation.writeAnnotation(c.strings).build())
159162
}
160163

161-
for (entry in kmClass.klibEnumEntries) {
162-
val entryIndex = proto.enumEntryList.indexOfFirst { it.name == c[entry.name] }
163-
val entryAnnotationsProto = entry.annotations.map { it.writeAnnotation(c.strings).build() }
164-
val entryProto = ProtoBuf.EnumEntry.newBuilder()
165-
.setName(c[entry.name])
166-
.setExtension(KlibMetadataProtoBuf.enumEntryAnnotation, entryAnnotationsProto)
167-
entry.uniqId?.let { uniqId ->
168-
entryProto.setExtension(KlibMetadataProtoBuf.enumEntryUniqId, uniqId.writeUniqId().build())
169-
}
170-
entry.ordinal?.let { ordinal ->
171-
entryProto.setExtension(KlibMetadataProtoBuf.enumEntryOrdinal, ordinal)
172-
}
173-
if (entryIndex == -1) {
174-
proto.addEnumEntry(entryProto.build())
175-
} else {
176-
proto.setEnumEntry(entryIndex, entryProto.build())
177-
}
178-
}
179-
180164
kmClass.uniqId?.let { uniqId ->
181165
proto.setExtension(KlibMetadataProtoBuf.classUniqId, uniqId.writeUniqId().build())
182166
}
@@ -267,6 +251,18 @@ internal class KlibMetadataExtensions : MetadataExtensions {
267251
}
268252
}
269253

254+
override fun writeEnumEntryExtensions(enumEntry: KmEnumEntry, proto: ProtoBuf.EnumEntry.Builder, c: WriteContext) {
255+
enumEntry.ordinal?.let { ordinal ->
256+
proto.setExtension(KlibMetadataProtoBuf.enumEntryOrdinal, ordinal)
257+
}
258+
enumEntry.uniqId?.let { uniqId ->
259+
proto.setExtension(KlibMetadataProtoBuf.enumEntryUniqId, uniqId.writeUniqId().build())
260+
}
261+
for (annotation in enumEntry.annotations) {
262+
proto.addExtension(KlibMetadataProtoBuf.enumEntryAnnotation, annotation.writeAnnotation(c.strings).build())
263+
}
264+
}
265+
270266
override fun writeTypeExtensions(type: KmType, proto: ProtoBuf.Type.Builder, c: WriteContext) {
271267
for (annotation in type.annotations) {
272268
proto.addExtension(KlibMetadataProtoBuf.typeAnnotation, annotation.writeAnnotation(c.strings).build())
@@ -306,6 +302,9 @@ internal class KlibMetadataExtensions : MetadataExtensions {
306302
override fun createTypeParameterExtension(): KmTypeParameterExtension =
307303
KlibTypeParameterExtension()
308304

305+
override fun createEnumEntryExtension(): KlibEnumEntryExtension? =
306+
KlibEnumEntryExtension()
307+
309308
override fun createTypeExtension(): KmTypeExtension =
310309
KlibTypeExtension()
311310

libraries/kotlinx-metadata/klib/src/kotlinx/metadata/klib/klibExtensions.kt

+15-3
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,6 @@ var KmClass.file: KlibSourceFile?
3333
klibExtensions.file = value
3434
}
3535

36-
val KmClass.klibEnumEntries: MutableList<KlibEnumEntry>
37-
get() = klibExtensions.enumEntries
38-
3936
var KmProperty.uniqId: UniqId?
4037
get() = klibExtensions.uniqId
4138
set(value) {
@@ -95,3 +92,18 @@ var KmTypeAlias.uniqId: UniqId?
9592
set(value) {
9693
klibExtensions.uniqId = value
9794
}
95+
96+
var KmEnumEntry.ordinal: Int?
97+
get() = klibExtensions.ordinal
98+
set(value) {
99+
klibExtensions.ordinal = value
100+
}
101+
102+
var KmEnumEntry.uniqId: UniqId?
103+
get() = klibExtensions.uniqId
104+
set(value) {
105+
klibExtensions.uniqId = value
106+
}
107+
108+
val KmEnumEntry.annotations: MutableList<KmAnnotation>
109+
get() = klibExtensions.annotations

libraries/kotlinx-metadata/src/kotlin/metadata/Nodes.kt

+18
Original file line numberDiff line numberDiff line change
@@ -91,8 +91,14 @@ public class KmClass : KmDeclarationContainer {
9191
/**
9292
* Names of enum entries, if this class is an enum class.
9393
*/
94+
@Deprecated("Use `kmEnumEntries` instead.")
9495
public val enumEntries: MutableList<String> = ArrayList(0)
9596

97+
/**
98+
* Enum entries, if this class is an enum class.
99+
*/
100+
public val kmEnumEntries: MutableList<KmEnumEntry> = ArrayList(0)
101+
96102
/**
97103
* Names of direct subclasses of this class, if this class is `sealed`.
98104
*/
@@ -465,6 +471,18 @@ public class KmTypeParameter internal constructor(
465471
MetadataExtensions.INSTANCES.map(MetadataExtensions::createTypeParameterExtension)
466472
}
467473

474+
/**
475+
* Represents an enum entry.
476+
*
477+
* @property name the name of the enum entry
478+
*/
479+
public class KmEnumEntry(public var name: String) {
480+
internal val extensions: List<KmEnumEntryExtension> =
481+
MetadataExtensions.INSTANCES.mapNotNull(MetadataExtensions::createEnumEntryExtension)
482+
483+
override fun toString(): String = name
484+
}
485+
468486
/**
469487
* Represents a type.
470488
*

libraries/kotlinx-metadata/src/kotlin/metadata/internal/Readers.kt

+10
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,9 @@ public fun ProtoBuf.Class.toKmClass(
7676
nestedClassNameList.mapTo(v.nestedClasses) { c[it] }
7777
for (enumEntry in enumEntryList) {
7878
if (!enumEntry.hasName()) throw InconsistentKotlinMetadataException("No name for EnumEntry")
79+
@Suppress("DEPRECATION")
7980
v.enumEntries.add(c[enumEntry.name])
81+
v.kmEnumEntries.add(enumEntry.toKmEnumEntry(c))
8082
}
8183
sealedSubclassFqNameList.mapTo(v.sealedSubclasses) { c.className(it) }
8284
if (hasInlineClassUnderlyingPropertyName()) {
@@ -92,6 +94,14 @@ public fun ProtoBuf.Class.toKmClass(
9294
return v
9395
}
9496

97+
private fun ProtoBuf.EnumEntry.toKmEnumEntry(c: ReadContext): KmEnumEntry {
98+
val v = KmEnumEntry(c[name])
99+
100+
c.extensions.forEach { it.readEnumEntryExtensions(v, this, c) }
101+
102+
return v
103+
}
104+
95105
private fun ProtoBuf.Class.loadInlineClassUnderlyingType(c: ReadContext): ProtoBuf.Type? {
96106
val type = inlineClassUnderlyingType(c.types)
97107
if (type != null) return type

libraries/kotlinx-metadata/src/kotlin/metadata/internal/Writers.kt

+21-4
Original file line numberDiff line numberDiff line change
@@ -244,6 +244,16 @@ private fun WriteContext.writeVersionRequirement(kmVersionRequirement: KmVersion
244244
return this.versionRequirements[t]
245245
}
246246

247+
private fun WriteContext.writeEnumEntry(kmEnumEntry: KmEnumEntry): ProtoBuf.EnumEntry.Builder {
248+
val t = ProtoBuf.EnumEntry.newBuilder()
249+
250+
t.name = this[kmEnumEntry.name]
251+
252+
extensions.forEach { it.writeEnumEntryExtensions(kmEnumEntry, t, this) }
253+
254+
return t
255+
}
256+
247257
@ExperimentalContracts
248258
private fun WriteContext.writeContract(contract: KmContract): ProtoBuf.Contract {
249259
val t = ProtoBuf.Contract.newBuilder()
@@ -318,10 +328,17 @@ public open class ClassWriter(stringTable: StringTable, contextExtensions: List<
318328
kmClass.companionObject?.let { t.companionObjectName = c[it] }
319329
kmClass.nestedClasses.forEach { t.addNestedClassName(c[it]) }
320330

321-
kmClass.enumEntries.forEach { name ->
322-
t.addEnumEntry(ProtoBuf.EnumEntry.newBuilder().also { enumEntry ->
323-
enumEntry.name = c[name]
324-
})
331+
if (kmClass.kmEnumEntries.isNotEmpty()) {
332+
kmClass.kmEnumEntries.forEach { entry ->
333+
t.addEnumEntry(c.writeEnumEntry(entry).build())
334+
}
335+
} else {
336+
@Suppress("DEPRECATION")
337+
kmClass.enumEntries.forEach { name ->
338+
t.addEnumEntry(ProtoBuf.EnumEntry.newBuilder().also { enumEntry ->
339+
enumEntry.name = c[name]
340+
})
341+
}
325342
}
326343

327344
t.addAllSealedSubclassFqName(kmClass.sealedSubclasses.map { c.getClassName(it) })

libraries/kotlinx-metadata/src/kotlin/metadata/internal/common/BuiltInMetadataExtensions.kt

+8
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,9 @@ public class BuiltInsMetadataExtensions : MetadataExtensions {
6666
}
6767
}
6868

69+
override fun readEnumEntryExtensions(kmEnumEntry: KmEnumEntry, proto: ProtoBuf.EnumEntry, c: ReadContext) {
70+
}
71+
6972
override fun readTypeExtensions(kmType: KmType, proto: ProtoBuf.Type, c: ReadContext) {
7073
val ext = kmType.builtins
7174
proto.getExtension(BuiltInsProtoBuf.typeAnnotation).forEach { annotation ->
@@ -129,6 +132,9 @@ public class BuiltInsMetadataExtensions : MetadataExtensions {
129132
}
130133
}
131134

135+
override fun writeEnumEntryExtensions(enumEntry: KmEnumEntry, proto: ProtoBuf.EnumEntry.Builder, c: WriteContext) {
136+
}
137+
132138
override fun writeTypeExtensions(type: KmType, proto: ProtoBuf.Type.Builder, c: WriteContext) {
133139
for (annotation in extension { type.annotations }) {
134140
proto.addExtension(BuiltInsProtoBuf.typeAnnotation, annotation.writeAnnotation(c.strings).build())
@@ -161,6 +167,8 @@ public class BuiltInsMetadataExtensions : MetadataExtensions {
161167

162168
override fun createTypeParameterExtension(): KmTypeParameterExtension = BuiltInTypeParameterExtension()
163169

170+
override fun createEnumEntryExtension(): KmEnumEntryExtension? = null
171+
164172
override fun createTypeExtension(): KmTypeExtension = BuiltInTypeExtension()
165173

166174
override fun createTypeAliasExtension(): KmTypeAliasExtension? = null

0 commit comments

Comments
 (0)