diff --git a/build-common/src/org/jetbrains/kotlin/incremental/JavaClassesSerializerExtension.kt b/build-common/src/org/jetbrains/kotlin/incremental/JavaClassesSerializerExtension.kt index 9c7cd0aa499..c1a6a665c42 100644 --- a/build-common/src/org/jetbrains/kotlin/incremental/JavaClassesSerializerExtension.kt +++ b/build-common/src/org/jetbrains/kotlin/incremental/JavaClassesSerializerExtension.kt @@ -71,7 +71,7 @@ class JavaClassesSerializerExtension : KotlinSerializerExtensionBase(BuiltInSeri override fun serializeProperty( descriptor: PropertyDescriptor, proto: ProtoBuf.Property.Builder, - versionRequirementTable: MutableVersionRequirementTable, + versionRequirementTable: MutableVersionRequirementTable?, childSerializer: DescriptorSerializer ) { super.serializeProperty(descriptor, proto, versionRequirementTable, childSerializer) diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/serialization/JvmSerializerExtension.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/serialization/JvmSerializerExtension.kt index ee3eb1ec306..8a5b6ea8eca 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/serialization/JvmSerializerExtension.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/serialization/JvmSerializerExtension.kt @@ -178,7 +178,7 @@ class JvmSerializerExtension(private val bindings: JvmSerializationBindings, sta override fun serializeProperty( descriptor: PropertyDescriptor, proto: ProtoBuf.Property.Builder, - versionRequirementTable: MutableVersionRequirementTable, + versionRequirementTable: MutableVersionRequirementTable?, childSerializer: DescriptorSerializer ) { val signatureSerializer = SignatureSerializer() @@ -204,7 +204,7 @@ class JvmSerializerExtension(private val bindings: JvmSerializationBindings, sta proto.setExtension(JvmProtoBuf.propertySignature, signature) } - if (descriptor.isJvmFieldPropertyInInterfaceCompanion()) { + if (descriptor.isJvmFieldPropertyInInterfaceCompanion() && versionRequirementTable != null) { proto.setExtension(JvmProtoBuf.flags, JvmFlags.getPropertyFlags(true)) proto.addVersionRequirement( diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/serialization/metadata/JsKlibMetadataSerializerExtension.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/serialization/metadata/JsKlibMetadataSerializerExtension.kt index 7d895ec0f9a..5154e2462b7 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/serialization/metadata/JsKlibMetadataSerializerExtension.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/serialization/metadata/JsKlibMetadataSerializerExtension.kt @@ -75,7 +75,7 @@ class JsKlibMetadataSerializerExtension( override fun serializeProperty( descriptor: PropertyDescriptor, proto: ProtoBuf.Property.Builder, - versionRequirementTable: MutableVersionRequirementTable, + versionRequirementTable: MutableVersionRequirementTable?, childSerializer: DescriptorSerializer ) { uniqId(descriptor)?.let { proto.setExtension(JsKlibMetadataProtoBuf.propertyUniqId, it) } diff --git a/compiler/serialization/src/org/jetbrains/kotlin/serialization/DescriptorSerializer.kt b/compiler/serialization/src/org/jetbrains/kotlin/serialization/DescriptorSerializer.kt index 924623ab7ca..263be74ca11 100644 --- a/compiler/serialization/src/org/jetbrains/kotlin/serialization/DescriptorSerializer.kt +++ b/compiler/serialization/src/org/jetbrains/kotlin/serialization/DescriptorSerializer.kt @@ -45,7 +45,7 @@ class DescriptorSerializer private constructor( private val typeParameters: Interner, private val extension: SerializerExtension, val typeTable: MutableTypeTable, - private val versionRequirementTable: MutableVersionRequirementTable, + private val versionRequirementTable: MutableVersionRequirementTable?, private val serializeTypeTableToFunction: Boolean ) { private val contractSerializer = ContractSerializer() @@ -146,7 +146,9 @@ class DescriptorSerializer private constructor( builder.typeTable = typeTableProto } - builder.addAllVersionRequirement(serializeVersionRequirements(classDescriptor)) + if (versionRequirementTable == null) error("Version requirements must be serialized for classes: $classDescriptor") + + builder.addAllVersionRequirement(versionRequirementTable.serializeVersionRequirements(classDescriptor)) extension.serializeClass(classDescriptor, builder, versionRequirementTable, this) @@ -262,14 +264,16 @@ class DescriptorSerializer private constructor( } } - builder.addAllVersionRequirement(serializeVersionRequirements(descriptor)) + versionRequirementTable?.run { + builder.addAllVersionRequirement(serializeVersionRequirements(descriptor)) - if (descriptor.isSuspendOrHasSuspendTypesInSignature()) { - builder.addVersionRequirement(writeVersionRequirementDependingOnCoroutinesVersion()) - } + if (descriptor.isSuspendOrHasSuspendTypesInSignature()) { + builder.addVersionRequirement(writeVersionRequirementDependingOnCoroutinesVersion()) + } - if (descriptor.hasInlineClassTypesInSignature()) { - builder.addVersionRequirement(writeVersionRequirement(LanguageFeature.InlineClasses)) + if (descriptor.hasInlineClassTypesInSignature()) { + builder.addVersionRequirement(writeVersionRequirement(LanguageFeature.InlineClasses)) + } } extension.serializeProperty(descriptor, builder, versionRequirementTable, local) @@ -335,14 +339,16 @@ class DescriptorSerializer private constructor( } } - builder.addAllVersionRequirement(serializeVersionRequirements(descriptor)) + versionRequirementTable?.run { + builder.addAllVersionRequirement(serializeVersionRequirements(descriptor)) - if (descriptor.isSuspendOrHasSuspendTypesInSignature()) { - builder.addVersionRequirement(writeVersionRequirementDependingOnCoroutinesVersion()) - } + if (descriptor.isSuspendOrHasSuspendTypesInSignature()) { + builder.addVersionRequirement(writeVersionRequirementDependingOnCoroutinesVersion()) + } - if (descriptor.hasInlineClassTypesInSignature()) { - builder.addVersionRequirement(writeVersionRequirement(LanguageFeature.InlineClasses)) + if (descriptor.hasInlineClassTypesInSignature()) { + builder.addVersionRequirement(writeVersionRequirement(LanguageFeature.InlineClasses)) + } } contractSerializer.serializeContractOfFunctionIfAny(descriptor, builder, this) @@ -368,14 +374,16 @@ class DescriptorSerializer private constructor( builder.addValueParameter(local.valueParameter(valueParameterDescriptor)) } - builder.addAllVersionRequirement(serializeVersionRequirements(descriptor)) + versionRequirementTable?.run { + builder.addAllVersionRequirement(serializeVersionRequirements(descriptor)) - if (descriptor.isSuspendOrHasSuspendTypesInSignature()) { - builder.addVersionRequirement(writeVersionRequirementDependingOnCoroutinesVersion()) - } + if (descriptor.isSuspendOrHasSuspendTypesInSignature()) { + builder.addVersionRequirement(writeVersionRequirementDependingOnCoroutinesVersion()) + } - if (descriptor.hasInlineClassTypesInSignature()) { - builder.addVersionRequirement(writeVersionRequirement(LanguageFeature.InlineClasses)) + if (descriptor.hasInlineClassTypesInSignature()) { + builder.addVersionRequirement(writeVersionRequirement(LanguageFeature.InlineClasses)) + } } extension.serializeConstructor(descriptor, builder, local) @@ -383,8 +391,8 @@ class DescriptorSerializer private constructor( return builder } - private fun writeVersionRequirementDependingOnCoroutinesVersion(): Int = - writeVersionRequirement(if (this.extension.releaseCoroutines()) LanguageFeature.ReleaseCoroutines else LanguageFeature.Coroutines) + private fun MutableVersionRequirementTable.writeVersionRequirementDependingOnCoroutinesVersion(): Int = + writeVersionRequirement(if (extension.releaseCoroutines()) LanguageFeature.ReleaseCoroutines else LanguageFeature.Coroutines) private fun CallableMemberDescriptor.isSuspendOrHasSuspendTypesInSignature(): Boolean { if (this is FunctionDescriptor && isSuspend) return true @@ -436,7 +444,9 @@ class DescriptorSerializer private constructor( builder.setExpandedType(local.type(expandedType)) } - builder.addAllVersionRequirement(serializeVersionRequirements(descriptor)) + versionRequirementTable?.run { + builder.addAllVersionRequirement(serializeVersionRequirements(descriptor)) + } for (annotation in descriptor.nonSourceAnnotations) { builder.addAnnotation(extension.annotationSerializer.serializeAnnotation(annotation)) @@ -642,7 +652,7 @@ class DescriptorSerializer private constructor( builder.typeTable = typeTableProto } - val versionRequirementTableProto = versionRequirementTable.serialize() + val versionRequirementTableProto = versionRequirementTable?.serialize() if (versionRequirementTableProto != null) { builder.versionRequirementTable = versionRequirementTableProto } @@ -652,17 +662,18 @@ class DescriptorSerializer private constructor( return builder } - private fun writeVersionRequirement(languageFeature: LanguageFeature): Int { - return writeLanguageVersionRequirement(languageFeature, versionRequirementTable) + private fun MutableVersionRequirementTable.writeVersionRequirement(languageFeature: LanguageFeature): Int { + return writeLanguageVersionRequirement(languageFeature, this) } // Returns a list of indices into versionRequirementTable, or empty list if there's no @RequireKotlin on the descriptor - private fun serializeVersionRequirements(descriptor: DeclarationDescriptor): List = + private fun MutableVersionRequirementTable.serializeVersionRequirements(descriptor: DeclarationDescriptor): List = descriptor.annotations .filter { it.fqName == RequireKotlinNames.FQ_NAME } .mapNotNull(::serializeVersionRequirementFromRequireKotlin) + .map(::get) - private fun serializeVersionRequirementFromRequireKotlin(annotation: AnnotationDescriptor): Int? { + private fun serializeVersionRequirementFromRequireKotlin(annotation: AnnotationDescriptor): ProtoBuf.VersionRequirement.Builder? { val args = annotation.allValueArguments val versionString = (args[RequireKotlinNames.VERSION] as? StringValue)?.value ?: return null @@ -706,7 +717,7 @@ class DescriptorSerializer private constructor( proto.errorCode = errorCode } - return versionRequirementTable[proto] + return proto } private fun getClassifierId(descriptor: ClassifierDescriptorWithTypeParameters): Int = @@ -729,20 +740,16 @@ class DescriptorSerializer private constructor( companion object { @JvmStatic - fun createTopLevel(extension: SerializerExtension): DescriptorSerializer { - return DescriptorSerializer( - null, Interner(), extension, MutableTypeTable(), MutableVersionRequirementTable(), - serializeTypeTableToFunction = false + fun createTopLevel(extension: SerializerExtension): DescriptorSerializer = + DescriptorSerializer( + null, Interner(), extension, MutableTypeTable(), MutableVersionRequirementTable(), serializeTypeTableToFunction = false ) - } @JvmStatic - fun createForLambda(extension: SerializerExtension): DescriptorSerializer { - return DescriptorSerializer( - null, Interner(), extension, MutableTypeTable(), MutableVersionRequirementTable(), - serializeTypeTableToFunction = true + fun createForLambda(extension: SerializerExtension): DescriptorSerializer = + DescriptorSerializer( + null, Interner(), extension, MutableTypeTable(), versionRequirementTable = null, serializeTypeTableToFunction = true ) - } @JvmStatic fun create( diff --git a/compiler/serialization/src/org/jetbrains/kotlin/serialization/SerializerExtension.kt b/compiler/serialization/src/org/jetbrains/kotlin/serialization/SerializerExtension.kt index 08e215e9927..010bb4104eb 100644 --- a/compiler/serialization/src/org/jetbrains/kotlin/serialization/SerializerExtension.kt +++ b/compiler/serialization/src/org/jetbrains/kotlin/serialization/SerializerExtension.kt @@ -63,7 +63,7 @@ abstract class SerializerExtension { open fun serializeProperty( descriptor: PropertyDescriptor, proto: ProtoBuf.Property.Builder, - versionRequirementTable: MutableVersionRequirementTable, + versionRequirementTable: MutableVersionRequirementTable?, childSerializer: DescriptorSerializer ) { } diff --git a/compiler/serialization/src/org/jetbrains/kotlin/serialization/SerializerExtensionBase.kt b/compiler/serialization/src/org/jetbrains/kotlin/serialization/SerializerExtensionBase.kt index 45080882a9d..a68d70e57f6 100644 --- a/compiler/serialization/src/org/jetbrains/kotlin/serialization/SerializerExtensionBase.kt +++ b/compiler/serialization/src/org/jetbrains/kotlin/serialization/SerializerExtensionBase.kt @@ -65,7 +65,7 @@ abstract class KotlinSerializerExtensionBase(private val protocol: SerializerExt override fun serializeProperty( descriptor: PropertyDescriptor, proto: ProtoBuf.Property.Builder, - versionRequirementTable: MutableVersionRequirementTable, + versionRequirementTable: MutableVersionRequirementTable?, childSerializer: DescriptorSerializer ) { for (annotation in descriptor.nonSourceAnnotations) { diff --git a/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/KotlinJavascriptSerializerExtension.kt b/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/KotlinJavascriptSerializerExtension.kt index a7a2fddb494..6bf41ab136f 100644 --- a/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/KotlinJavascriptSerializerExtension.kt +++ b/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/KotlinJavascriptSerializerExtension.kt @@ -57,7 +57,7 @@ class KotlinJavascriptSerializerExtension( override fun serializeProperty( descriptor: PropertyDescriptor, proto: ProtoBuf.Property.Builder, - versionRequirementTable: MutableVersionRequirementTable, + versionRequirementTable: MutableVersionRequirementTable?, childSerializer: DescriptorSerializer ) { val id = getFileId(descriptor) diff --git a/libraries/kotlinx-metadata/jvm/test/kotlinx/metadata/test/MetadataSmokeTest.kt b/libraries/kotlinx-metadata/jvm/test/kotlinx/metadata/test/MetadataSmokeTest.kt index e0cdf47a904..52c8f48419d 100644 --- a/libraries/kotlinx-metadata/jvm/test/kotlinx/metadata/test/MetadataSmokeTest.kt +++ b/libraries/kotlinx-metadata/jvm/test/kotlinx/metadata/test/MetadataSmokeTest.kt @@ -172,4 +172,32 @@ class MetadataSmokeTest { assertEquals("kotlin/coroutines/CoroutineContext.Key", coroutineContextKey) assertEquals("kotlin/coroutines/CoroutineContext\$Key", coroutineContextKey.jvmInternalName) } + + /* + // TODO: uncomment after bootstrap compiler has a fix for KT-29790 + @Test + fun lambdaVersionRequirement() { + val x: suspend Int.(String, String) -> Unit = { _, _ -> } + val annotation = x::class.java.getAnnotation(Metadata::class.java)!! + val metadata = KotlinClassMetadata.read( + KotlinClassHeader( + kind = annotation.kind, + metadataVersion = annotation.metadataVersion, + bytecodeVersion = annotation.bytecodeVersion, + data1 = annotation.data1, + data2 = annotation.data2, + extraInt = annotation.extraInt, + extraString = annotation.extraString, + packageName = annotation.packageName + ) + ) as KotlinClassMetadata.SyntheticClass + metadata.accept(object : KmLambdaVisitor() { + override fun visitFunction(flags: Flags, name: String) = + object : KmFunctionVisitor() { + override fun visitVersionRequirement() = + object : KmVersionRequirementVisitor() {} + } + }) + } + */ }