From 6807ed66420d9456484bf04a7e161b093ce0c1a3 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Tue, 14 Dec 2021 21:56:08 +0100 Subject: [PATCH] Do not write version requirements for suspend functions Coroutines are a stable feature since 1.3. Version requirement on suspend functions, or functions mentioning suspend function types in the signature, was needed to prevent older compilers from reading metadata that they can't properly use. It's not needed anymore because a newer metadata version prevents older compilers from reading any metadata altogether. Also, computing isSuspendOrHasSuspendTypesInSignature took ~0.5% of backend time on compilation of intellij (related to KT-48233). --- .../serialization/DescriptorSerializer.kt | 22 ------------------- .../versionRequirement/nestedClassMembers.kt | 2 -- .../testData/versionRequirement/suspendFun.kt | 16 -------------- .../AbstractVersionRequirementTest.kt | 18 --------------- .../tools/kotlinp/testData/SimpleClass.txt | 1 - .../tools/kotlinp/testData/ValueClass.txt | 2 -- 6 files changed, 61 deletions(-) delete mode 100644 compiler/testData/versionRequirement/suspendFun.kt diff --git a/compiler/serialization/src/org/jetbrains/kotlin/serialization/DescriptorSerializer.kt b/compiler/serialization/src/org/jetbrains/kotlin/serialization/DescriptorSerializer.kt index 6bb22bfd09d..7fabc07f5c5 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.descriptors.* @@ -331,10 +330,6 @@ class DescriptorSerializer private constructor( versionRequirementTable?.run { builder.addAllVersionRequirement(serializeVersionRequirements(descriptor)) - if (descriptor.isSuspendOrHasSuspendTypesInSignature()) { - builder.addVersionRequirement(writeVersionRequirementDependingOnCoroutinesVersion()) - } - if (descriptor.hasInlineClassTypesInSignature()) { builder.addVersionRequirement(writeVersionRequirement(LanguageFeature.InlineClasses)) } @@ -429,10 +424,6 @@ class DescriptorSerializer private constructor( versionRequirementTable?.run { builder.addAllVersionRequirement(serializeVersionRequirements(descriptor)) - if (descriptor.isSuspendOrHasSuspendTypesInSignature()) { - builder.addVersionRequirement(writeVersionRequirementDependingOnCoroutinesVersion()) - } - if (descriptor.hasInlineClassTypesInSignature()) { builder.addVersionRequirement(writeVersionRequirement(LanguageFeature.InlineClasses)) } @@ -473,10 +464,6 @@ class DescriptorSerializer private constructor( versionRequirementTable?.run { builder.addAllVersionRequirement(serializeVersionRequirements(descriptor)) - if (descriptor.isSuspendOrHasSuspendTypesInSignature()) { - builder.addVersionRequirement(writeVersionRequirementDependingOnCoroutinesVersion()) - } - if (descriptor.hasInlineClassTypesInSignature()) { builder.addVersionRequirement(writeVersionRequirement(LanguageFeature.InlineClasses)) } @@ -491,15 +478,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.hasInlineClassTypesInSignature(): Boolean { return allTypesFromSignature().any { type -> type.contains(UnwrappedType::isInlineClassType) } } 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 be276585535..ee6b9d26228 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 fb4d10a3e71..b63fda4f5a8 100644 --- a/libraries/tools/kotlinp/testData/SimpleClass.txt +++ b/libraries/tools/kotlinp/testData/SimpleClass.txt @@ -8,7 +8,6 @@ public final class SimpleClass : kotlin/Any { // signature: (I)V public constructor(p: kotlin/Int /* = ... */) - // 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.txt b/libraries/tools/kotlinp/testData/ValueClass.txt index 6392bcbf063..34a76f8efe8 100644 --- a/libraries/tools/kotlinp/testData/ValueClass.txt +++ b/libraries/tools/kotlinp/testData/ValueClass.txt @@ -31,7 +31,6 @@ public final value class A : kotlin/Any { // requires language version 1.3.0 (level=ERROR) public final value class B : kotlin/Any { - // requires language version 1.3.0 (level=ERROR) // 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?>) @@ -45,7 +44,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