New mangling rules require language version 1.4 (not compiler version)

Follow-up to a270ee094c
This commit is contained in:
Dmitry Petrov
2020-05-29 11:38:42 +03:00
parent 40a4cea530
commit 5db6a0b563
5 changed files with 59 additions and 18 deletions
@@ -216,7 +216,7 @@ class JvmSerializerExtension @JvmOverloads constructor(
private fun MutableVersionRequirementTable.writeFunctionNameManglingForReturnTypeRequirement(add: (Int) -> Unit) { private fun MutableVersionRequirementTable.writeFunctionNameManglingForReturnTypeRequirement(add: (Int) -> Unit) {
if (functionsWithInlineClassReturnTypesMangled) { if (functionsWithInlineClassReturnTypesMangled) {
add(writeVersionRequirement(1, 4, 0, ProtoBuf.VersionRequirement.VersionKind.COMPILER_VERSION, this)) add(writeVersionRequirement(1, 4, 0, ProtoBuf.VersionRequirement.VersionKind.LANGUAGE_VERSION, this))
} }
} }
@@ -6,3 +6,6 @@ class C {
fun returnsInlineClassType(): IC = IC(42) fun returnsInlineClassType(): IC = IC(42)
val propertyOfInlineClassType: IC get() = IC(42) val propertyOfInlineClassType: IC get() = IC(42)
} }
fun returnsInlineClassType(): IC = IC(42)
val propertyOfInlineClassType: IC get() = IC(42)
@@ -31,7 +31,8 @@ abstract class AbstractVersionRequirementTest : TestCaseWithTmpdir() {
customLanguageVersion: LanguageVersion = LanguageVersionSettingsImpl.DEFAULT.languageVersion, customLanguageVersion: LanguageVersion = LanguageVersionSettingsImpl.DEFAULT.languageVersion,
analysisFlags: Map<AnalysisFlag<*>, Any?> = emptyMap(), analysisFlags: Map<AnalysisFlag<*>, Any?> = emptyMap(),
fqNamesWithRequirements: List<String>, fqNamesWithRequirements: List<String>,
fqNamesWithoutRequirement: List<String> = emptyList() fqNamesWithoutRequirement: List<String> = emptyList(),
shouldBeSingleRequirement: Boolean = true
) { ) {
compileFiles( compileFiles(
listOf(File("compiler/testData/versionRequirement/${getTestName(true)}.kt")), listOf(File("compiler/testData/versionRequirement/${getTestName(true)}.kt")),
@@ -45,6 +46,13 @@ abstract class AbstractVersionRequirementTest : TestCaseWithTmpdir() {
val requirements = extractRequirement(descriptor) val requirements = extractRequirement(descriptor)
if (requirements.isEmpty()) throw AssertionError("No VersionRequirement for $descriptor") if (requirements.isEmpty()) throw AssertionError("No VersionRequirement for $descriptor")
if (shouldBeSingleRequirement && requirements.size > 1) {
throw AssertionError(
"Single VersionRequirement expected, got ${requirements.size}:\n" +
requirements.joinToString(separator = "\n") { it.toDebugString() }
)
}
requirements.firstOrNull { requirements.firstOrNull {
expectedVersionRequirement == it.version && expectedVersionRequirement == it.version &&
expectedLevel == it.level && expectedLevel == it.level &&
@@ -53,14 +61,14 @@ abstract class AbstractVersionRequirementTest : TestCaseWithTmpdir() {
expectedErrorCode == it.errorCode expectedErrorCode == it.errorCode
} }
?: throw AssertionError( ?: throw AssertionError(
"Version requirement not found:\n" + "Version requirement not found, expected:\n" +
"expectedVersionRequirement=" + expectedVersionRequirement + "versionRequirement=" + expectedVersionRequirement +
"; expectedLevel=" + expectedLevel + "; level=" + expectedLevel +
"; expectedMessage=" + expectedMessage + "; message=" + expectedMessage +
"; expectedVersionKind=" + expectedVersionKind + "; versionKind=" + expectedVersionKind +
"; expectedErrorCode=" + expectedErrorCode + "; errorCode=" + expectedErrorCode +
"\nActual requirements:\n" + "\nActual requirements:\n" +
requirements.joinToString(separator = "\n") { it.toString() } requirements.joinToString(separator = "\n") { it.toDebugString() }
) )
} }
@@ -72,6 +80,9 @@ abstract class AbstractVersionRequirementTest : TestCaseWithTmpdir() {
} }
} }
private fun VersionRequirement.toDebugString(): String =
"versionRequirement=$version; level=$level; message=$message; versionKind=$kind; errorCode=$errorCode"
private fun extractRequirement(descriptor: DeclarationDescriptor): List<VersionRequirement> { private fun extractRequirement(descriptor: DeclarationDescriptor): List<VersionRequirement> {
return when (descriptor) { return when (descriptor) {
is DeserializedMemberDescriptor -> descriptor.versionRequirements is DeserializedMemberDescriptor -> descriptor.versionRequirements
@@ -129,14 +129,41 @@ class JvmVersionRequirementTest : AbstractVersionRequirementTest() {
} }
fun testInlineClassReturnTypeMangled() { fun testInlineClassReturnTypeMangled() {
// Class members returning inline class values are mangled,
// and have "since 1.4" version requirement along with "since 1.3" version requirement for inline class in signature
doTest( doTest(
VersionRequirement.Version(1, 4, 0), DeprecationLevel.ERROR, null, COMPILER_VERSION, null, VersionRequirement.Version(1, 4, 0), DeprecationLevel.ERROR, null, LANGUAGE_VERSION, null,
fqNamesWithRequirements = listOf( fqNamesWithRequirements = listOf(
"test.C.returnsInlineClassType", "test.C.returnsInlineClassType",
"test.C.propertyOfInlineClassType" "test.C.propertyOfInlineClassType"
), ),
customLanguageVersion = LanguageVersion.KOTLIN_1_4,
shouldBeSingleRequirement = false
)
// 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.returnsInlineClassType",
"test.propertyOfInlineClassType"
),
shouldBeSingleRequirement = true,
customLanguageVersion = LanguageVersion.KOTLIN_1_4 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.returnsInlineClassType",
"test.propertyOfInlineClassType",
"test.C.returnsInlineClassType",
"test.C.propertyOfInlineClassType"
),
shouldBeSingleRequirement = true,
customLanguageVersion = LanguageVersion.KOTLIN_1_3
)
} }
fun testSuspendFun_1_2() { fun testSuspendFun_1_2() {
+8 -8
View File
@@ -79,49 +79,49 @@ public final annotation class A : kotlin/Annotation {
public final get public final get
// requires language version 1.3.0 (level=ERROR) // requires language version 1.3.0 (level=ERROR)
// requires compiler version 1.4.0 (level=ERROR) // requires language version 1.4.0 (level=ERROR)
// getter: ub()B // getter: ub()B
public final val ub: kotlin/UByte public final val ub: kotlin/UByte
public final get public final get
// requires language version 1.3.0 (level=ERROR) // requires language version 1.3.0 (level=ERROR)
// requires compiler version 1.4.0 (level=ERROR) // requires language version 1.4.0 (level=ERROR)
// getter: ub_max()B // getter: ub_max()B
public final val ub_max: kotlin/UByte public final val ub_max: kotlin/UByte
public final get public final get
// requires language version 1.3.0 (level=ERROR) // requires language version 1.3.0 (level=ERROR)
// requires compiler version 1.4.0 (level=ERROR) // requires language version 1.4.0 (level=ERROR)
// getter: ui()I // getter: ui()I
public final val ui: kotlin/UInt public final val ui: kotlin/UInt
public final get public final get
// requires language version 1.3.0 (level=ERROR) // requires language version 1.3.0 (level=ERROR)
// requires compiler version 1.4.0 (level=ERROR) // requires language version 1.4.0 (level=ERROR)
// getter: ui_max()I // getter: ui_max()I
public final val ui_max: kotlin/UInt public final val ui_max: kotlin/UInt
public final get public final get
// requires language version 1.3.0 (level=ERROR) // requires language version 1.3.0 (level=ERROR)
// requires compiler version 1.4.0 (level=ERROR) // requires language version 1.4.0 (level=ERROR)
// getter: ul()J // getter: ul()J
public final val ul: kotlin/ULong public final val ul: kotlin/ULong
public final get public final get
// requires language version 1.3.0 (level=ERROR) // requires language version 1.3.0 (level=ERROR)
// requires compiler version 1.4.0 (level=ERROR) // requires language version 1.4.0 (level=ERROR)
// getter: ul_max()J // getter: ul_max()J
public final val ul_max: kotlin/ULong public final val ul_max: kotlin/ULong
public final get public final get
// requires language version 1.3.0 (level=ERROR) // requires language version 1.3.0 (level=ERROR)
// requires compiler version 1.4.0 (level=ERROR) // requires language version 1.4.0 (level=ERROR)
// getter: us()S // getter: us()S
public final val us: kotlin/UShort public final val us: kotlin/UShort
public final get public final get
// requires language version 1.3.0 (level=ERROR) // requires language version 1.3.0 (level=ERROR)
// requires compiler version 1.4.0 (level=ERROR) // requires language version 1.4.0 (level=ERROR)
// getter: us_max()S // getter: us_max()S
public final val us_max: kotlin/UShort public final val us_max: kotlin/UShort
public final get public final get