Write "hasEnumEntries" flag into metadata when feature enabled

^KT-53929 Fixed
This commit is contained in:
Roman Efremov
2023-01-02 11:47:10 +01:00
parent 3c5e556ba6
commit 14b4cdc7c4
35 changed files with 210 additions and 80 deletions
@@ -12,6 +12,7 @@ import org.jetbrains.kotlin.backend.jvm.serialization.JvmIrSerializerSession
import org.jetbrains.kotlin.config.CompilerConfiguration
import org.jetbrains.kotlin.config.JVMConfigurationKeys
import org.jetbrains.kotlin.config.JvmSerializeIrMode
import org.jetbrains.kotlin.config.languageVersionSettings
import org.jetbrains.kotlin.ir.declarations.IrClass
import org.jetbrains.kotlin.ir.declarations.IrFile
import org.jetbrains.kotlin.ir.util.irMessageLogger
@@ -38,6 +39,7 @@ class JvmIrSerializerImpl(private val configuration: CompilerConfiguration) : Jv
declarationTable,
mutableMapOf(),
configuration.get(JVMConfigurationKeys.SERIALIZE_IR) ?: JvmSerializeIrMode.NONE,
fileClassFqName
fileClassFqName,
configuration.languageVersionSettings,
)
}
@@ -12,6 +12,7 @@ import org.jetbrains.kotlin.codegen.binding.CodegenBinding
import org.jetbrains.kotlin.codegen.createFreeFakeLambdaDescriptor
import org.jetbrains.kotlin.codegen.serialization.JvmSerializationBindings
import org.jetbrains.kotlin.codegen.serialization.JvmSerializerExtension
import org.jetbrains.kotlin.config.languageVersionSettings
import org.jetbrains.kotlin.ir.declarations.DescriptorMetadataSource
import org.jetbrains.kotlin.ir.declarations.IrClass
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin
@@ -32,18 +33,25 @@ class DescriptorMetadataSerializer(
parent: MetadataSerializer?
) : MetadataSerializer {
private val serializerExtension = JvmSerializerExtension(serializationBindings, context.state, context.defaultTypeMapper)
private val serializer: DescriptorSerializer? =
private val serializer: DescriptorSerializer? = run {
val languageVersionSettings = context.state.configuration.languageVersionSettings
when (val metadata = irClass.metadata) {
is DescriptorMetadataSource.Class -> DescriptorSerializer.create(
metadata.descriptor, serializerExtension, (parent as? DescriptorMetadataSerializer)?.serializer, context.state.project
metadata.descriptor, serializerExtension, (parent as? DescriptorMetadataSerializer)?.serializer,
languageVersionSettings, context.state.project,
)
is DescriptorMetadataSource.Script -> DescriptorSerializer.create(
metadata.descriptor, serializerExtension, (parent as? DescriptorMetadataSerializer)?.serializer, context.state.project
metadata.descriptor, serializerExtension, (parent as? DescriptorMetadataSerializer)?.serializer,
languageVersionSettings, context.state.project,
)
is DescriptorMetadataSource.File -> DescriptorSerializer.createTopLevel(serializerExtension, context.state.project)
is DescriptorMetadataSource.Function -> DescriptorSerializer.createForLambda(serializerExtension)
is DescriptorMetadataSource.File -> DescriptorSerializer.createTopLevel(
serializerExtension, languageVersionSettings,
context.state.project
)
is DescriptorMetadataSource.Function -> DescriptorSerializer.createForLambda(serializerExtension, languageVersionSettings)
else -> null
}
}
override fun serialize(metadata: MetadataSource): Pair<MessageLite, JvmStringTable>? {
val localDelegatedProperties = context.localDelegatedProperties[irClass.attributeOwnerId]
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.backend.common.serialization
import org.jetbrains.kotlin.backend.common.serialization.encodings.*
import org.jetbrains.kotlin.backend.common.serialization.proto.IrSimpleTypeNullability
import org.jetbrains.kotlin.config.LanguageVersionSettings
import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.ir.IrElement
import org.jetbrains.kotlin.ir.IrFileEntry
@@ -117,6 +118,7 @@ open class IrFileSerializer(
private val declarationTable: DeclarationTable,
private val expectDescriptorToSymbol: MutableMap<DeclarationDescriptor, IrSymbol>,
private val compatibilityMode: CompatibilityMode,
private val languageVersionSettings: LanguageVersionSettings,
private val bodiesOnlyForInlines: Boolean = false,
private val skipExpects: Boolean = false,
private val addDebugInfo: Boolean = true,
@@ -1228,7 +1230,7 @@ open class IrFileSerializer(
private fun serializeIrClass(clazz: IrClass): ProtoClass {
val proto = ProtoClass.newBuilder()
.setBase(serializeIrDeclarationBase(clazz, ClassFlags.encode(clazz)))
.setBase(serializeIrDeclarationBase(clazz, ClassFlags.encode(clazz, languageVersionSettings)))
.setName(serializeName(clazz.name))
@@ -6,6 +6,8 @@
package org.jetbrains.kotlin.backend.common.serialization.encodings
import org.jetbrains.kotlin.backend.common.serialization.IrFlags
import org.jetbrains.kotlin.config.LanguageFeature
import org.jetbrains.kotlin.config.LanguageVersionSettings
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor
import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.descriptors.DescriptorVisibility
@@ -33,15 +35,17 @@ value class ClassFlags(val flags: Long) {
val isFun: Boolean get() = IrFlags.IS_FUN_INTERFACE.get(flags.toInt())
companion object {
fun encode(clazz: IrClass): Long {
fun encode(clazz: IrClass, languageVersionSettings: LanguageVersionSettings): Long {
return clazz.run {
val hasAnnotation = annotations.isNotEmpty()
val visibility = ProtoEnumFlags.descriptorVisibility(visibility.normalize())
val modality = ProtoEnumFlags.modality(modality)
val kind = ProtoEnumFlags.classKind(kind, isCompanion)
val hasEnumEntries = kind == ProtoBuf.Class.Kind.ENUM_CLASS &&
languageVersionSettings.supportsFeature(LanguageFeature.EnumEntries)
val flags = IrFlags.getClassFlags(
hasAnnotation, visibility, modality, kind, isInner, isData, isExternal, isExpect, isValue, isFun
hasAnnotation, visibility, modality, kind, isInner, isData, isExternal, isExpect, isValue, isFun, hasEnumEntries
)
flags.toLong()
@@ -58,7 +58,7 @@ abstract class KlibMetadataSerializer(
)
return SerializerContext(
extension,
DescriptorSerializer.createTopLevel(extension, project)
DescriptorSerializer.createTopLevel(extension, languageVersionSettings, project)
)
}
@@ -73,7 +73,7 @@ abstract class KlibMetadataSerializer(
with(serializerContext) {
val previousSerializer = classSerializer
classSerializer = DescriptorSerializer.create(classDescriptor, serializerExtension, classSerializer, project)
classSerializer = DescriptorSerializer.create(classDescriptor, serializerExtension, classSerializer, languageVersionSettings, project)
val classProto = classSerializer.classProto(classDescriptor).build() ?: error("Class not serialized: $classDescriptor")
//builder.addClass(classProto)
@@ -62,7 +62,6 @@ import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.psi2ir.Psi2IrConfiguration
import org.jetbrains.kotlin.psi2ir.Psi2IrTranslator
import org.jetbrains.kotlin.psi2ir.descriptors.IrBuiltInsOverDescriptors
import org.jetbrains.kotlin.psi2ir.generators.DeclarationStubGeneratorImpl
import org.jetbrains.kotlin.psi2ir.generators.GeneratorContext
import org.jetbrains.kotlin.psi2ir.generators.TypeTranslatorImpl
import org.jetbrains.kotlin.resolve.BindingContext
@@ -622,6 +621,7 @@ fun serializeModuleIntoKlib(
skipExpects = !configuration.expectActualLinker,
normalizeAbsolutePaths = absolutePathNormalization,
sourceBaseDirs = sourceBaseDirs,
configuration.languageVersionSettings,
signatureClashChecks
).serializedIrModule(moduleFragment)
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.ir.backend.js.lower.serialization.ir
import org.jetbrains.kotlin.backend.common.serialization.CompatibilityMode
import org.jetbrains.kotlin.backend.common.serialization.DeclarationTable
import org.jetbrains.kotlin.backend.common.serialization.IrFileSerializer
import org.jetbrains.kotlin.config.LanguageVersionSettings
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
import org.jetbrains.kotlin.ir.declarations.IrAnnotationContainer
import org.jetbrains.kotlin.ir.symbols.IrSymbol
@@ -21,6 +22,7 @@ class JsIrFileSerializer(
expectDescriptorToSymbol: MutableMap<DeclarationDescriptor, IrSymbol>,
compatibilityMode: CompatibilityMode,
skipExpects: Boolean,
languageVersionSettings: LanguageVersionSettings,
bodiesOnlyForInlines: Boolean = false,
normalizeAbsolutePaths: Boolean,
sourceBaseDirs: Collection<String>
@@ -29,6 +31,7 @@ class JsIrFileSerializer(
declarationTable,
expectDescriptorToSymbol,
compatibilityMode,
languageVersionSettings,
bodiesOnlyForInlines = bodiesOnlyForInlines,
skipExpects = skipExpects,
normalizeAbsolutePaths = normalizeAbsolutePaths,
@@ -9,6 +9,7 @@ import org.jetbrains.kotlin.backend.common.serialization.CompatibilityMode
import org.jetbrains.kotlin.backend.common.serialization.DeclarationTable
import org.jetbrains.kotlin.backend.common.serialization.IdSignatureClashTracker
import org.jetbrains.kotlin.backend.common.serialization.IrModuleSerializer
import org.jetbrains.kotlin.config.LanguageVersionSettings
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
import org.jetbrains.kotlin.ir.IrBuiltIns
import org.jetbrains.kotlin.ir.declarations.IrFile
@@ -23,6 +24,7 @@ class JsIrModuleSerializer(
val skipExpects: Boolean,
normalizeAbsolutePaths: Boolean,
sourceBaseDirs: Collection<String>,
private val languageVersionSettings: LanguageVersionSettings,
shouldCheckSignaturesOnUniqueness: Boolean = true
) : IrModuleSerializer<JsIrFileSerializer>(messageLogger, compatibilityMode, normalizeAbsolutePaths, sourceBaseDirs) {
@@ -39,6 +41,7 @@ class JsIrModuleSerializer(
compatibilityMode = compatibilityMode,
skipExpects = skipExpects,
normalizeAbsolutePaths = normalizeAbsolutePaths,
sourceBaseDirs = sourceBaseDirs
sourceBaseDirs = sourceBaseDirs,
languageVersionSettings = languageVersionSettings,
)
}
@@ -10,6 +10,7 @@ import org.jetbrains.kotlin.backend.common.serialization.DeclarationTable
import org.jetbrains.kotlin.backend.common.serialization.IrFileSerializer
import org.jetbrains.kotlin.backend.jvm.serialization.proto.JvmIr
import org.jetbrains.kotlin.config.JvmSerializeIrMode
import org.jetbrains.kotlin.config.LanguageVersionSettings
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
import org.jetbrains.kotlin.ir.IrElement
import org.jetbrains.kotlin.ir.declarations.*
@@ -25,9 +26,10 @@ class JvmIrSerializerSession(
expectDescriptorToSymbol: MutableMap<DeclarationDescriptor, IrSymbol>,
private val mode: JvmSerializeIrMode,
private val fileClassFqName: FqName,
languageVersionSettings: LanguageVersionSettings,
skipExpects: Boolean = false,
) : IrFileSerializer(
messageLogger, declarationTable, expectDescriptorToSymbol, CompatibilityMode.CURRENT,
messageLogger, declarationTable, expectDescriptorToSymbol, CompatibilityMode.CURRENT, languageVersionSettings,
bodiesOnlyForInlines = mode == JvmSerializeIrMode.INLINE,
skipExpects, normalizeAbsolutePaths = false, sourceBaseDirs = emptyList()
) {