From 9c03dcd230e596f58ab5de5f787ff33be2c8a8e8 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Thu, 27 Jul 2023 15:54:54 +0200 Subject: [PATCH] Do not write version requirements for suspend functions Previous attempt was at 6807ed6642, but it was reverted in 7771e5914d (see that commit for the explanation). Now it should be fine to remove these version requirements. No issue reported because it's mostly not a user-visible change. The main effect is that it reduces differences in metadata between K1 and K2, namely it fixes the ValueClass.kt kotlinp test. --- .../fir/serialization/FirElementSerializer.kt | 24 ++------------ .../serialization/DescriptorSerializer.kt | 32 ------------------- .../versionRequirement/nestedClassMembers.kt | 2 -- .../testData/versionRequirement/suspendFun.kt | 16 ---------- .../AbstractVersionRequirementTest.kt | 18 ----------- .../tools/kotlinp/testData/SimpleClass.txt | 1 - .../tools/kotlinp/testData/ValueClass.kt | 2 -- .../tools/kotlinp/testData/ValueClass.txt | 2 -- 8 files changed, 2 insertions(+), 95 deletions(-) delete mode 100644 compiler/testData/versionRequirement/suspendFun.kt diff --git a/compiler/fir/fir-serialization/src/org/jetbrains/kotlin/fir/serialization/FirElementSerializer.kt b/compiler/fir/fir-serialization/src/org/jetbrains/kotlin/fir/serialization/FirElementSerializer.kt index c988c334c89..76353fa3371 100644 --- a/compiler/fir/fir-serialization/src/org/jetbrains/kotlin/fir/serialization/FirElementSerializer.kt +++ b/compiler/fir/fir-serialization/src/org/jetbrains/kotlin/fir/serialization/FirElementSerializer.kt @@ -478,10 +478,6 @@ class FirElementSerializer private constructor( versionRequirementTable?.run { builder.addAllVersionRequirement(serializeVersionRequirements(property)) - if (property.isSuspendOrHasSuspendTypesInSignature()) { - builder.addVersionRequirement(writeVersionRequirementDependingOnCoroutinesVersion()) - } - if (local.metDefinitelyNotNullType) { builder.addVersionRequirement(writeVersionRequirement(LanguageFeature.DefinitelyNonNullableTypes)) } @@ -573,10 +569,6 @@ class FirElementSerializer private constructor( versionRequirementTable?.run { builder.addAllVersionRequirement(serializeVersionRequirements(function)) - if (function.isSuspendOrHasSuspendTypesInSignature()) { - builder.addVersionRequirement(writeVersionRequirementDependingOnCoroutinesVersion()) - } - if (local.metDefinitelyNotNullType) { builder.addVersionRequirement(writeVersionRequirement(LanguageFeature.DefinitelyNonNullableTypes)) } @@ -679,10 +671,6 @@ class FirElementSerializer private constructor( versionRequirementTable?.run { builder.addAllVersionRequirement(serializeVersionRequirements(constructor)) - if (constructor.isSuspendOrHasSuspendTypesInSignature()) { - builder.addVersionRequirement(writeVersionRequirementDependingOnCoroutinesVersion()) - } - if (local.metDefinitelyNotNullType) { builder.addVersionRequirement(writeVersionRequirement(LanguageFeature.DefinitelyNonNullableTypes)) } @@ -1062,11 +1050,6 @@ class FirElementSerializer private constructor( private fun useTypeTable(): Boolean = extension.shouldUseTypeTable() - private fun FirCallableDeclaration.isSuspendOrHasSuspendTypesInSignature(): Boolean { - // TODO (types in signature) - return this.isSuspend - } - private fun MutableVersionRequirementTable.serializeVersionRequirements(container: FirAnnotationContainer): List = serializeVersionRequirements(container.annotations) @@ -1082,9 +1065,6 @@ class FirElementSerializer private constructor( return writeLanguageVersionRequirement(languageFeature, this) } - private fun MutableVersionRequirementTable.writeVersionRequirementDependingOnCoroutinesVersion(): Int = - writeVersionRequirement(LanguageFeature.ReleaseCoroutines) - private fun serializeVersionRequirementFromRequireKotlin(annotation: FirAnnotation): ProtoBuf.VersionRequirement.Builder? { val argumentMapping = annotation.argumentMapping.mapping @@ -1240,7 +1220,7 @@ class FirElementSerializer private constructor( return serializer } - fun writeLanguageVersionRequirement( + private fun writeLanguageVersionRequirement( languageFeature: LanguageFeature, versionRequirementTable: MutableVersionRequirementTable ): Int { @@ -1252,7 +1232,7 @@ class FirElementSerializer private constructor( ) } - fun writeVersionRequirement( + private fun writeVersionRequirement( major: Int, minor: Int, patch: Int, diff --git a/compiler/serialization/src/org/jetbrains/kotlin/serialization/DescriptorSerializer.kt b/compiler/serialization/src/org/jetbrains/kotlin/serialization/DescriptorSerializer.kt index fb4a5fdee3f..f218c38bbae 100644 --- a/compiler/serialization/src/org/jetbrains/kotlin/serialization/DescriptorSerializer.kt +++ b/compiler/serialization/src/org/jetbrains/kotlin/serialization/DescriptorSerializer.kt @@ -8,7 +8,6 @@ package org.jetbrains.kotlin.serialization import com.intellij.openapi.project.Project import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.builtins.isSuspendFunctionType -import org.jetbrains.kotlin.builtins.isSuspendFunctionTypeOrSubtype import org.jetbrains.kotlin.builtins.transformSuspendFunctionToRuntimeFunctionType import org.jetbrains.kotlin.config.LanguageFeature import org.jetbrains.kotlin.config.LanguageVersionSettings @@ -43,7 +42,6 @@ import org.jetbrains.kotlin.serialization.deserialization.descriptorVisibility import org.jetbrains.kotlin.serialization.deserialization.memberKind import org.jetbrains.kotlin.types.* import org.jetbrains.kotlin.types.extensions.TypeAttributeTranslators -import org.jetbrains.kotlin.types.typeUtil.contains import org.jetbrains.kotlin.types.typeUtil.replaceAnnotations import java.util.* @@ -296,10 +294,6 @@ class DescriptorSerializer private constructor( versionRequirementTable?.run { builder.addAllVersionRequirement(serializeVersionRequirements(descriptor)) - if (descriptor.isSuspendOrHasSuspendTypesInSignature()) { - builder.addVersionRequirement(writeVersionRequirementDependingOnCoroutinesVersion()) - } - if (local.metDefinitelyNotNullType) { builder.addVersionRequirement(writeVersionRequirement(LanguageFeature.DefinitelyNonNullableTypes)) } @@ -389,10 +383,6 @@ class DescriptorSerializer private constructor( versionRequirementTable?.run { builder.addAllVersionRequirement(serializeVersionRequirements(descriptor)) - if (descriptor.isSuspendOrHasSuspendTypesInSignature()) { - builder.addVersionRequirement(writeVersionRequirementDependingOnCoroutinesVersion()) - } - if (local.metDefinitelyNotNullType) { builder.addVersionRequirement(writeVersionRequirement(LanguageFeature.DefinitelyNonNullableTypes)) } @@ -421,10 +411,6 @@ class DescriptorSerializer private constructor( versionRequirementTable?.run { builder.addAllVersionRequirement(serializeVersionRequirements(descriptor)) - if (descriptor.isSuspendOrHasSuspendTypesInSignature()) { - builder.addVersionRequirement(writeVersionRequirementDependingOnCoroutinesVersion()) - } - if (local.metDefinitelyNotNullType) { builder.addVersionRequirement(writeVersionRequirement(LanguageFeature.DefinitelyNonNullableTypes)) } @@ -437,24 +423,6 @@ class DescriptorSerializer private constructor( return builder } - private fun MutableVersionRequirementTable.writeVersionRequirementDependingOnCoroutinesVersion(): Int = - writeVersionRequirement(LanguageFeature.ReleaseCoroutines) - - private fun CallableMemberDescriptor.isSuspendOrHasSuspendTypesInSignature(): Boolean { - if (this is FunctionDescriptor && isSuspend) return true - - return allTypesFromSignature().any { type -> type.contains(UnwrappedType::isSuspendFunctionTypeOrSubtype) } - } - - private fun CallableMemberDescriptor.allTypesFromSignature(): List { - return listOfNotNull( - extensionReceiverParameter?.type, - returnType, - *typeParameters.flatMap { it.upperBounds }.toTypedArray(), - *valueParameters.map(ValueParameterDescriptor::getType).toTypedArray() - ) - } - private fun typeAliasProto(descriptor: TypeAliasDescriptor): ProtoBuf.TypeAlias.Builder? { val builder = ProtoBuf.TypeAlias.newBuilder() val local = createChildSerializer(descriptor) diff --git a/compiler/testData/versionRequirement/nestedClassMembers.kt b/compiler/testData/versionRequirement/nestedClassMembers.kt index ad651b2c192..56a703a9169 100644 --- a/compiler/testData/versionRequirement/nestedClassMembers.kt +++ b/compiler/testData/versionRequirement/nestedClassMembers.kt @@ -12,8 +12,6 @@ class Outer { @RequireKotlin("1.3") val x = "" - - suspend fun s() {} } } diff --git a/compiler/testData/versionRequirement/suspendFun.kt b/compiler/testData/versionRequirement/suspendFun.kt deleted file mode 100644 index 6e3777d81b7..00000000000 --- a/compiler/testData/versionRequirement/suspendFun.kt +++ /dev/null @@ -1,16 +0,0 @@ -package test - -suspend fun topLevel() {} - -class Foo { - constructor(block: suspend () -> Unit) - - suspend fun member() {} -} - -fun async1(block: suspend () -> Unit) {} -fun (suspend () -> Unit).async2() {} -fun async3(): suspend () -> Unit = null!! -fun async4(): Map Unit>? = null - -val (suspend () -> Unit).asyncVal: () -> Unit get() = {} diff --git a/compiler/tests/org/jetbrains/kotlin/serialization/AbstractVersionRequirementTest.kt b/compiler/tests/org/jetbrains/kotlin/serialization/AbstractVersionRequirementTest.kt index 69ea63f1797..30472bcbc72 100644 --- a/compiler/tests/org/jetbrains/kotlin/serialization/AbstractVersionRequirementTest.kt +++ b/compiler/tests/org/jetbrains/kotlin/serialization/AbstractVersionRequirementTest.kt @@ -124,23 +124,6 @@ abstract class AbstractVersionRequirementTest : TestCaseWithTmpdir() { protected abstract fun loadModule(directory: File): ModuleDescriptor - fun testSuspendFun() { - doTest( - VersionRequirement.Version(1, 3), DeprecationLevel.ERROR, null, ProtoBuf.VersionRequirement.VersionKind.LANGUAGE_VERSION, null, - customLanguageVersion = LanguageVersion.KOTLIN_1_3, - fqNamesWithRequirements = listOf( - "test.topLevel", - "test.Foo.member", - "test.Foo.", - "test.async1", - "test.async2", - "test.async3", - "test.async4", - "test.asyncVal" - ) - ) - } - fun testDefinitelyNotNull() { doTest( VersionRequirement.Version(1, 7), DeprecationLevel.ERROR, null, ProtoBuf.VersionRequirement.VersionKind.LANGUAGE_VERSION, null, @@ -221,7 +204,6 @@ abstract class AbstractVersionRequirementTest : TestCaseWithTmpdir() { "test.Outer.Inner.Deep.", "test.Outer.Inner.Deep.f", "test.Outer.Inner.Deep.x", - "test.Outer.Inner.Deep.s", "test.Outer.Nested.g", "test.Outer.Companion" ) diff --git a/libraries/tools/kotlinp/testData/SimpleClass.txt b/libraries/tools/kotlinp/testData/SimpleClass.txt index e8464cdeec6..36ea50ff3da 100644 --- a/libraries/tools/kotlinp/testData/SimpleClass.txt +++ b/libraries/tools/kotlinp/testData/SimpleClass.txt @@ -11,7 +11,6 @@ public final class SimpleClass : kotlin/Any { // signature: f$test_module(Ljava/lang/Object;[Ljava/util/Map;)Ljava/util/Set; internal final fun T#3.f(vararg z: kotlin/collections/Map /* kotlin/Array> */): kotlin/collections/Set<*> - // requires language version 1.3.0 (level=ERROR) // signature: g(Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; protected final inline suspend fun g(crossinline a: kotlin/Function0, noinline b: suspend kotlin/Function1, kotlin/Any?>): kotlin/Unit diff --git a/libraries/tools/kotlinp/testData/ValueClass.kt b/libraries/tools/kotlinp/testData/ValueClass.kt index 3fbfad6fea7..086f58458fc 100644 --- a/libraries/tools/kotlinp/testData/ValueClass.kt +++ b/libraries/tools/kotlinp/testData/ValueClass.kt @@ -1,5 +1,3 @@ -// IGNORE K2 - @JvmInline value class A(private val i: Int?) diff --git a/libraries/tools/kotlinp/testData/ValueClass.txt b/libraries/tools/kotlinp/testData/ValueClass.txt index 36754899dd6..1370f9ab0a5 100644 --- a/libraries/tools/kotlinp/testData/ValueClass.txt +++ b/libraries/tools/kotlinp/testData/ValueClass.txt @@ -28,7 +28,6 @@ public final value class A : kotlin/Any { // ------------------------------------------ public final value class B : kotlin/Any { - // requires language version 1.3.0 (level=ERROR) // signature: constructor-impl(Lkotlin/jvm/functions/Function1;)Lkotlin/jvm/functions/Function1; public constructor(f: suspend kotlin/Function1, kotlin/Any?>) @@ -41,7 +40,6 @@ public final value class B : kotlin/Any { // signature: toString-impl(Lkotlin/jvm/functions/Function1;)Ljava/lang/String; public open /* synthesized */ fun toString(): kotlin/String - // requires language version 1.3.0 (level=ERROR) // field: f:Lkotlin/jvm/functions/Function1; private final val f: suspend kotlin/Function1, kotlin/Any?> private final get