New mangling rules require language version 1.4 (not compiler version)
Follow-up to a270ee094c
This commit is contained in:
+1
-1
@@ -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)
|
||||||
|
|||||||
+19
-8
@@ -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
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user