K1: Enhance deprecation messages for getFirst/getLast JDK 21 members

^KT-60659 Fixed
^KT-60769 Fixed
This commit is contained in:
Denis.Zharkov
2023-08-02 14:39:45 +02:00
committed by Space Team
parent 0694ee50a3
commit bd46bb02c1
6 changed files with 107 additions and 1 deletions
@@ -67,6 +67,14 @@ object JvmBuiltInsSignatures {
}
}
val DEPRECATED_LIST_METHODS: Set<String> =
signatures {
inJavaUtil(
"List",
"getFirst()Ljava/lang/Object;",
"getLast()Ljava/lang/Object;",
)
}
val VISIBLE_METHOD_SIGNATURES: Set<String> =
signatures {
@@ -6,6 +6,7 @@
package org.jetbrains.kotlin.builtins.jvm
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.builtins.jvm.JvmBuiltInsSignatures.DEPRECATED_LIST_METHODS
import org.jetbrains.kotlin.builtins.jvm.JvmBuiltInsSignatures.DROP_LIST_METHOD_SIGNATURES
import org.jetbrains.kotlin.builtins.jvm.JvmBuiltInsSignatures.HIDDEN_CONSTRUCTOR_SIGNATURES
import org.jetbrains.kotlin.builtins.jvm.JvmBuiltInsSignatures.HIDDEN_METHOD_SIGNATURES
@@ -74,6 +75,16 @@ class JvmBuiltInsCustomizer(
Annotations.create(listOf(annotation))
}
private val deprecationForSomeOfTheListMethods =
storageManager.createMemoizedFunction<Pair<String, String>, Annotations> { (methodName, extensionName) ->
val annotation = moduleDescriptor.builtIns.createDeprecatedAnnotation(
"'$methodName()' member of List is redundant in Kotlin and might be removed soon. Please use '$extensionName()' stdlib extension instead",
forcePropagationDeprecationToOverrides = true,
replaceWith = "$extensionName()"
)
Annotations.create(listOf(annotation))
}
private fun StorageManager.createMockJavaIoSerializableType(): KotlinType {
val mockJavaIoPackageFragment = object : PackageFragmentDescriptorImpl(moduleDescriptor, FqName("java.io")) {
override fun getMemberScope() = MemberScope.Empty
@@ -142,6 +153,16 @@ class JvmBuiltInsCustomizer(
setHiddenForResolutionEverywhereBesideSupercalls()
}
JDKMemberStatus.DEPRECATED_LIST_METHODS -> {
setAdditionalAnnotations(
when (additionalMember.name) {
GET_FIRST_LIST_NAME -> deprecationForSomeOfTheListMethods(additionalMember.name.asString() to "first")
GET_LAST_LIST_NAME -> deprecationForSomeOfTheListMethods(additionalMember.name.asString() to "last")
else -> error("Unexpected name: ${additionalMember.name}")
}
)
}
JDKMemberStatus.NOT_CONSIDERED -> {
setAdditionalAnnotations(notConsideredDeprecation)
}
@@ -248,6 +269,7 @@ class JvmBuiltInsCustomizer(
when (signature) {
in HIDDEN_METHOD_SIGNATURES -> result = JDKMemberStatus.HIDDEN
in VISIBLE_METHOD_SIGNATURES -> result = JDKMemberStatus.VISIBLE
in DEPRECATED_LIST_METHODS -> result = JDKMemberStatus.DEPRECATED_LIST_METHODS
in DROP_LIST_METHOD_SIGNATURES -> result = JDKMemberStatus.DROP
}
@@ -259,7 +281,7 @@ class JvmBuiltInsCustomizer(
}
private enum class JDKMemberStatus {
HIDDEN, VISIBLE, NOT_CONSIDERED, DROP
HIDDEN, VISIBLE, DEPRECATED_LIST_METHODS, NOT_CONSIDERED, DROP
}
private fun ClassDescriptor.getJavaAnalogue(): LazyJavaClassDescriptor? {
@@ -348,3 +370,6 @@ private class FallbackBuiltIns private constructor() : KotlinBuiltIns(LockBasedS
override fun getPlatformDependentDeclarationFilter() = PlatformDependentDeclarationFilter.All
}
private val GET_FIRST_LIST_NAME = Name.identifier("getFirst")
private val GET_LAST_LIST_NAME = Name.identifier("getLast")