From afd35accd878d523e858a02e29fbcabf157cb2d3 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Thu, 27 Jul 2023 12:17:23 +0200 Subject: [PATCH] Do not write version requirements for InlineClasses Language feature InlineClasses is enabled since 1.3. The current lowest supported language version is 1.4, so any compiler that can read binaries produced by the current compiler also supports inline classes, which means that the version requirement is not needed anymore. 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, because K2 never supported writing this version requirement properly due to the TODO in `hasInlineClassTypesInSignature`. --- .../fir/serialization/FirElementSerializer.kt | 31 ---------- .../serialization/DescriptorSerializer.kt | 60 ++----------------- .../inlineClassReturnTypeMangled.kt | 7 --- .../inlineClassesAndRelevantDeclarations13.kt | 17 ------ .../AbstractVersionRequirementTest.kt | 17 ------ .../JvmVersionRequirementTest.kt | 32 +--------- .../tools/kotlinp/testData/Annotations.txt | 9 --- .../tools/kotlinp/testData/ValueClass.txt | 6 -- 8 files changed, 7 insertions(+), 172 deletions(-) delete mode 100644 compiler/testData/versionRequirement/inlineClassesAndRelevantDeclarations13.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 8df947fca40..c988c334c89 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 @@ -277,8 +277,6 @@ class FirElementSerializer private constructor( extension.serializeClass(klass, builder, versionRequirementTable, this) - writeVersionRequirementForInlineClasses(klass, builder, versionRequirementTable) - if (metDefinitelyNotNullType) { builder.addVersionRequirement( writeLanguageVersionRequirement(LanguageFeature.DefinitelyNonNullableTypes, versionRequirementTable) @@ -484,10 +482,6 @@ class FirElementSerializer private constructor( builder.addVersionRequirement(writeVersionRequirementDependingOnCoroutinesVersion()) } - if (property.hasInlineClassTypesInSignature()) { - builder.addVersionRequirement(writeVersionRequirement(LanguageFeature.InlineClasses)) - } - if (local.metDefinitelyNotNullType) { builder.addVersionRequirement(writeVersionRequirement(LanguageFeature.DefinitelyNonNullableTypes)) } @@ -583,10 +577,6 @@ class FirElementSerializer private constructor( builder.addVersionRequirement(writeVersionRequirementDependingOnCoroutinesVersion()) } - if (function.hasInlineClassTypesInSignature()) { - builder.addVersionRequirement(writeVersionRequirement(LanguageFeature.InlineClasses)) - } - if (local.metDefinitelyNotNullType) { builder.addVersionRequirement(writeVersionRequirement(LanguageFeature.DefinitelyNonNullableTypes)) } @@ -693,10 +683,6 @@ class FirElementSerializer private constructor( builder.addVersionRequirement(writeVersionRequirementDependingOnCoroutinesVersion()) } - if (constructor.hasInlineClassTypesInSignature()) { - builder.addVersionRequirement(writeVersionRequirement(LanguageFeature.InlineClasses)) - } - if (local.metDefinitelyNotNullType) { builder.addVersionRequirement(writeVersionRequirement(LanguageFeature.DefinitelyNonNullableTypes)) } @@ -1076,28 +1062,11 @@ class FirElementSerializer private constructor( private fun useTypeTable(): Boolean = extension.shouldUseTypeTable() - private fun FirDeclaration.hasInlineClassTypesInSignature(): Boolean { - // TODO - return false - } - private fun FirCallableDeclaration.isSuspendOrHasSuspendTypesInSignature(): Boolean { // TODO (types in signature) return this.isSuspend } - private fun writeVersionRequirementForInlineClasses( - klass: FirClass, - builder: ProtoBuf.Class.Builder, - versionRequirementTable: MutableVersionRequirementTable - ) { - if (klass !is FirRegularClass || !klass.isInline && !klass.hasInlineClassTypesInSignature()) return - - builder.addVersionRequirement( - writeLanguageVersionRequirement(LanguageFeature.InlineClasses, versionRequirementTable) - ) - } - private fun MutableVersionRequirementTable.serializeVersionRequirements(container: FirAnnotationContainer): List = serializeVersionRequirements(container.annotations) diff --git a/compiler/serialization/src/org/jetbrains/kotlin/serialization/DescriptorSerializer.kt b/compiler/serialization/src/org/jetbrains/kotlin/serialization/DescriptorSerializer.kt index 0833ec96752..fb4a5fdee3f 100644 --- a/compiler/serialization/src/org/jetbrains/kotlin/serialization/DescriptorSerializer.kt +++ b/compiler/serialization/src/org/jetbrains/kotlin/serialization/DescriptorSerializer.kt @@ -25,8 +25,10 @@ import org.jetbrains.kotlin.metadata.serialization.MutableTypeTable import org.jetbrains.kotlin.metadata.serialization.MutableVersionRequirementTable import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name -import org.jetbrains.kotlin.resolve.* +import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.DescriptorUtils.isEnumEntry +import org.jetbrains.kotlin.resolve.MemberComparator +import org.jetbrains.kotlin.resolve.RequireKotlinConstants import org.jetbrains.kotlin.resolve.calls.components.isActualParameterWithAnyExpectedDefault import org.jetbrains.kotlin.resolve.constants.EnumValue import org.jetbrains.kotlin.resolve.constants.IntValue @@ -35,13 +37,13 @@ import org.jetbrains.kotlin.resolve.constants.StringValue import org.jetbrains.kotlin.resolve.descriptorUtil.inlineClassRepresentation import org.jetbrains.kotlin.resolve.descriptorUtil.multiFieldValueClassRepresentation import org.jetbrains.kotlin.resolve.descriptorUtil.nonSourceAnnotations +import org.jetbrains.kotlin.resolve.isValueClass import org.jetbrains.kotlin.serialization.deserialization.ProtoEnumFlags 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.immediateSupertypes import org.jetbrains.kotlin.types.typeUtil.replaceAnnotations import java.util.* @@ -193,8 +195,6 @@ class DescriptorSerializer private constructor( plugins.forEach { it.afterClass(classDescriptor, builder, versionRequirementTable, this, extension) } - writeVersionRequirementForInlineClasses(classDescriptor, builder, versionRequirementTable) - if (metDefinitelyNotNullType) { builder.addVersionRequirement( writeLanguageVersionRequirement(LanguageFeature.DefinitelyNonNullableTypes, versionRequirementTable) @@ -207,28 +207,6 @@ class DescriptorSerializer private constructor( return builder } - private fun writeVersionRequirementForInlineClasses( - classDescriptor: ClassDescriptor, - builder: ProtoBuf.Class.Builder, - versionRequirementTable: MutableVersionRequirementTable - ) { - if (!classDescriptor.isInlineClass() && !classDescriptor.hasInlineClassTypesInSignature()) return - - builder.addVersionRequirement( - writeLanguageVersionRequirement(LanguageFeature.InlineClasses, versionRequirementTable) - ) - } - - private fun ClassDescriptor.hasInlineClassTypesInSignature(): Boolean { - for (typeParameter in declaredTypeParameters) { - if (typeParameter.upperBounds.any { it.contains(UnwrappedType::isInlineClassType) }) return true - } - - if (defaultType.immediateSupertypes().any { supertype -> supertype.contains(UnwrappedType::isInlineClassType) }) return true - - return false - } - fun propertyProto(descriptor: PropertyDescriptor): ProtoBuf.Property.Builder? { val builder = ProtoBuf.Property.newBuilder() @@ -322,10 +300,6 @@ class DescriptorSerializer private constructor( builder.addVersionRequirement(writeVersionRequirementDependingOnCoroutinesVersion()) } - if (descriptor.hasInlineClassTypesInSignature()) { - builder.addVersionRequirement(writeVersionRequirement(LanguageFeature.InlineClasses)) - } - if (local.metDefinitelyNotNullType) { builder.addVersionRequirement(writeVersionRequirement(LanguageFeature.DefinitelyNonNullableTypes)) } @@ -419,10 +393,6 @@ class DescriptorSerializer private constructor( builder.addVersionRequirement(writeVersionRequirementDependingOnCoroutinesVersion()) } - if (descriptor.hasInlineClassTypesInSignature()) { - builder.addVersionRequirement(writeVersionRequirement(LanguageFeature.InlineClasses)) - } - if (local.metDefinitelyNotNullType) { builder.addVersionRequirement(writeVersionRequirement(LanguageFeature.DefinitelyNonNullableTypes)) } @@ -455,10 +425,6 @@ class DescriptorSerializer private constructor( builder.addVersionRequirement(writeVersionRequirementDependingOnCoroutinesVersion()) } - if (descriptor.hasInlineClassTypesInSignature()) { - builder.addVersionRequirement(writeVersionRequirement(LanguageFeature.InlineClasses)) - } - if (local.metDefinitelyNotNullType) { builder.addVersionRequirement(writeVersionRequirement(LanguageFeature.DefinitelyNonNullableTypes)) } @@ -480,10 +446,6 @@ class DescriptorSerializer private constructor( return allTypesFromSignature().any { type -> type.contains(UnwrappedType::isSuspendFunctionTypeOrSubtype) } } - private fun CallableMemberDescriptor.hasInlineClassTypesInSignature(): Boolean { - return allTypesFromSignature().any { type -> type.contains(UnwrappedType::isInlineClassType) } - } - private fun CallableMemberDescriptor.allTypesFromSignature(): List { return listOfNotNull( extensionReceiverParameter?.type, @@ -760,9 +722,6 @@ class DescriptorSerializer private constructor( return writeLanguageVersionRequirement(languageFeature, this) } - private fun MutableVersionRequirementTable.writeCompilerVersionRequirement(major: Int, minor: Int, patch: Int): Int = - writeCompilerVersionRequirement(major, minor, patch, this) - // Returns a list of indices into versionRequirementTable, or empty list if there's no @RequireKotlin on the descriptor private fun MutableVersionRequirementTable.serializeVersionRequirements(descriptor: DeclarationDescriptor): List = descriptor.annotations @@ -925,17 +884,6 @@ class DescriptorSerializer private constructor( ) } - fun writeCompilerVersionRequirement( - major: Int, - minor: Int, - patch: Int, - versionRequirementTable: MutableVersionRequirementTable - ): Int = writeVersionRequirement( - major, minor, patch, - ProtoBuf.VersionRequirement.VersionKind.COMPILER_VERSION, - versionRequirementTable - ) - fun writeVersionRequirement( major: Int, minor: Int, diff --git a/compiler/testData/versionRequirement/inlineClassReturnTypeMangled.kt b/compiler/testData/versionRequirement/inlineClassReturnTypeMangled.kt index 1d52e0c3bde..4a61bffc516 100644 --- a/compiler/testData/versionRequirement/inlineClassReturnTypeMangled.kt +++ b/compiler/testData/versionRequirement/inlineClassReturnTypeMangled.kt @@ -5,11 +5,4 @@ inline class IC(val x: Int) class C { fun returnsInlineClassType(): IC = IC(42) val propertyOfInlineClassType: IC get() = IC(42) - - @Suppress("INAPPLICABLE_JVM_NAME") - @JvmName("returnsInlineClassTypeJvmName") - fun returnsInlineClassTypeJvmName(): IC = IC(42) } - -fun returnsInlineClassType(): IC = IC(42) -val propertyOfInlineClassType: IC get() = IC(42) diff --git a/compiler/testData/versionRequirement/inlineClassesAndRelevantDeclarations13.kt b/compiler/testData/versionRequirement/inlineClassesAndRelevantDeclarations13.kt deleted file mode 100644 index fe276694fa0..00000000000 --- a/compiler/testData/versionRequirement/inlineClassesAndRelevantDeclarations13.kt +++ /dev/null @@ -1,17 +0,0 @@ -package test - -inline class IC(val x: String) - -typealias ICAlias = IC - -class Ctor(ic: IC) - -fun simpleFun(f: IC) {} -fun aliasedFun(f: ICAlias) {} - -val simpleProp: IC = IC("") - -fun result(r: List?>) {} - -abstract class Foo : List -interface Bar diff --git a/compiler/tests/org/jetbrains/kotlin/serialization/AbstractVersionRequirementTest.kt b/compiler/tests/org/jetbrains/kotlin/serialization/AbstractVersionRequirementTest.kt index be276585535..69ea63f1797 100644 --- a/compiler/tests/org/jetbrains/kotlin/serialization/AbstractVersionRequirementTest.kt +++ b/compiler/tests/org/jetbrains/kotlin/serialization/AbstractVersionRequirementTest.kt @@ -227,21 +227,4 @@ abstract class AbstractVersionRequirementTest : TestCaseWithTmpdir() { ) ) } - - fun testInlineClassesAndRelevantDeclarations13() { - doTest( - VersionRequirement.Version(1, 3), DeprecationLevel.ERROR, null, ProtoBuf.VersionRequirement.VersionKind.LANGUAGE_VERSION, null, - fqNamesWithRequirements = listOf( - "test.IC", - "test.Ctor.", - "test.simpleFun", - "test.aliasedFun", - "test.simpleProp", - "test.result", - "test.Foo", - "test.Bar" - ), - shouldBeSingleRequirement = false - ) - } } diff --git a/compiler/tests/org/jetbrains/kotlin/serialization/JvmVersionRequirementTest.kt b/compiler/tests/org/jetbrains/kotlin/serialization/JvmVersionRequirementTest.kt index 9b59db8970d..791bf456d89 100644 --- a/compiler/tests/org/jetbrains/kotlin/serialization/JvmVersionRequirementTest.kt +++ b/compiler/tests/org/jetbrains/kotlin/serialization/JvmVersionRequirementTest.kt @@ -112,8 +112,7 @@ class JvmVersionRequirementTest : AbstractVersionRequirementTest() { fun testInlineClassReturnTypeMangled() { // Class members returning inline class values are mangled, - // and have "since 1.4", "require 1.4.30" version requirement along with - // "since 1.3" version requirement for inline class in signature + // and have "language >= 1.4" and "compiler >= 1.4.30" version requirements. doTest( VersionRequirement.Version(1, 4, 0), DeprecationLevel.ERROR, null, LANGUAGE_VERSION, null, fqNamesWithRequirements = listOf( @@ -126,36 +125,11 @@ class JvmVersionRequirementTest : AbstractVersionRequirementTest() { doTest( VersionRequirement.Version(1, 4, 30), DeprecationLevel.ERROR, null, COMPILER_VERSION, null, fqNamesWithRequirements = listOf( - "test.C.propertyOfInlineClassType", "test.C.returnsInlineClassType", - ), - shouldBeSingleRequirement = false, - customLanguageVersion = LanguageVersion.KOTLIN_1_4 - ) - // Top-level functions and properties returning inline class values are NOT mangled, - // and have "since 1.3" version requirement for inline class in signature only. - doTest( - VersionRequirement.Version(1, 3, 0), DeprecationLevel.ERROR, null, LANGUAGE_VERSION, null, - fqNamesWithRequirements = listOf( - "test.propertyOfInlineClassType", - "test.returnsInlineClassType", - ), - shouldBeSingleRequirement = false, - customLanguageVersion = LanguageVersion.KOTLIN_1_4 - ) - // In Kotlin 1.3, all functions and properties returning inline class values are NOT mangled, - // and have "since 1.3" version requirement for inline class in signature only. - doTest( - VersionRequirement.Version(1, 3, 0), DeprecationLevel.ERROR, null, LANGUAGE_VERSION, null, - fqNamesWithRequirements = listOf( - "test.propertyOfInlineClassType", "test.C.propertyOfInlineClassType", - "test.C.returnsInlineClassTypeJvmName", - "test.returnsInlineClassType", - "test.C.returnsInlineClassType" ), - shouldBeSingleRequirement = true, - customLanguageVersion = LanguageVersion.KOTLIN_1_3 + customLanguageVersion = LanguageVersion.KOTLIN_1_4, + shouldBeSingleRequirement = false, ) } diff --git a/libraries/tools/kotlinp/testData/Annotations.txt b/libraries/tools/kotlinp/testData/Annotations.txt index 433b46073ac..55f9de54320 100644 --- a/libraries/tools/kotlinp/testData/Annotations.txt +++ b/libraries/tools/kotlinp/testData/Annotations.txt @@ -2,7 +2,6 @@ // ------------------------------------------ public final annotation class A : kotlin/Annotation { - // requires language version 1.3.0 (level=ERROR) // signature: (ZCBSIFJDLkotlin/UInt;Lkotlin/UByte;Lkotlin/UShort;Lkotlin/ULong;Lkotlin/UInt;Lkotlin/UByte;Lkotlin/UShort;Lkotlin/ULong;[Z[C[B[S[I[F[J[DLjava/lang/String;Lkotlin/annotation/AnnotationTarget;Lkotlin/reflect/KClass;Lkotlin/reflect/KClass;LB;Lkotlin/Array;Lkotlin/Array;Lkotlin/Array;Lkotlin/Array;)V public constructor(z: kotlin/Boolean, c: kotlin/Char, b: kotlin/Byte, s: kotlin/Short, i: kotlin/Int, f: kotlin/Float, j: kotlin/Long, d: kotlin/Double, ui: kotlin/UInt, ub: kotlin/UByte, us: kotlin/UShort, ul: kotlin/ULong, ui_max: kotlin/UInt, ub_max: kotlin/UByte, us_max: kotlin/UShort, ul_max: kotlin/ULong, za: kotlin/BooleanArray, ca: kotlin/CharArray, ba: kotlin/ByteArray, sa: kotlin/ShortArray, ia: kotlin/IntArray, fa: kotlin/FloatArray, ja: kotlin/LongArray, da: kotlin/DoubleArray, str: kotlin/String, enum: kotlin/annotation/AnnotationTarget, klass: kotlin/reflect/KClass<*>, klass2: kotlin/reflect/KClass<*>, anno: B, stra: kotlin/Array, ka: kotlin/Array>, ea: kotlin/Array, aa: kotlin/Array) @@ -98,56 +97,48 @@ public final annotation class A : kotlin/Annotation { public final val stra: kotlin/Array public final get - // requires language version 1.3.0 (level=ERROR) // requires compiler version 1.4.30 (level=ERROR) // requires language version 1.4.0 (level=ERROR) // getter: ub()B public final val ub: kotlin/UByte public final get - // requires language version 1.3.0 (level=ERROR) // requires compiler version 1.4.30 (level=ERROR) // requires language version 1.4.0 (level=ERROR) // getter: ub_max()B public final val ub_max: kotlin/UByte public final get - // requires language version 1.3.0 (level=ERROR) // requires compiler version 1.4.30 (level=ERROR) // requires language version 1.4.0 (level=ERROR) // getter: ui()I public final val ui: kotlin/UInt public final get - // requires language version 1.3.0 (level=ERROR) // requires compiler version 1.4.30 (level=ERROR) // requires language version 1.4.0 (level=ERROR) // getter: ui_max()I public final val ui_max: kotlin/UInt public final get - // requires language version 1.3.0 (level=ERROR) // requires compiler version 1.4.30 (level=ERROR) // requires language version 1.4.0 (level=ERROR) // getter: ul()J public final val ul: kotlin/ULong public final get - // requires language version 1.3.0 (level=ERROR) // requires compiler version 1.4.30 (level=ERROR) // requires language version 1.4.0 (level=ERROR) // getter: ul_max()J public final val ul_max: kotlin/ULong public final get - // requires language version 1.3.0 (level=ERROR) // requires compiler version 1.4.30 (level=ERROR) // requires language version 1.4.0 (level=ERROR) // getter: us()S public final val us: kotlin/UShort public final get - // requires language version 1.3.0 (level=ERROR) // requires compiler version 1.4.30 (level=ERROR) // requires language version 1.4.0 (level=ERROR) // getter: us_max()S diff --git a/libraries/tools/kotlinp/testData/ValueClass.txt b/libraries/tools/kotlinp/testData/ValueClass.txt index 6392bcbf063..36754899dd6 100644 --- a/libraries/tools/kotlinp/testData/ValueClass.txt +++ b/libraries/tools/kotlinp/testData/ValueClass.txt @@ -1,9 +1,7 @@ // A.class // ------------------------------------------ -// requires language version 1.3.0 (level=ERROR) public final value class A : kotlin/Any { - // requires language version 1.3.0 (level=ERROR) // signature: constructor-impl(Ljava/lang/Integer;)Ljava/lang/Integer; public constructor(i: kotlin/Int?) @@ -28,10 +26,8 @@ public final value class A : kotlin/Any { } // B.class // ------------------------------------------ -// 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?>) @@ -58,10 +54,8 @@ public final value class B : kotlin/Any { } // Z.class // ------------------------------------------ -// requires language version 1.3.0 (level=ERROR) public final value class Z : kotlin/Any { - // requires language version 1.3.0 (level=ERROR) // signature: constructor-impl(Ljava/lang/String;)Ljava/lang/String; public constructor(s: kotlin/String)