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
@@ -0,0 +1,48 @@
/newListMethods.kt:14:18: warning: this declaration overrides deprecated member but not marked as deprecated itself. Please add @Deprecated annotation or suppress. See https://youtrack.jetbrains.com/issue/KT-47902 for details
override fun getFirst(): T = super.getFirst()
^
/newListMethods.kt:14:40: warning: 'getFirst(): E!' is deprecated. Overrides deprecated member in 'java.util.AbstractList'. 'getFirst()' member of List is redundant in Kotlin and might be removed soon. Please use 'first()' stdlib extension instead
override fun getFirst(): T = super.getFirst()
^
/newListMethods.kt:15:18: warning: this declaration overrides deprecated member but not marked as deprecated itself. Please add @Deprecated annotation or suppress. See https://youtrack.jetbrains.com/issue/KT-47902 for details
override fun getLast(): T = super.getLast()
^
/newListMethods.kt:15:39: warning: 'getLast(): E!' is deprecated. Overrides deprecated member in 'java.util.AbstractList'. 'getLast()' member of List is redundant in Kotlin and might be removed soon. Please use 'last()' stdlib extension instead
override fun getLast(): T = super.getLast()
^
/newListMethods.kt:26:7: warning: 'getFirst(): E!' is deprecated. 'getFirst()' member of List is redundant in Kotlin and might be removed soon. Please use 'first()' stdlib extension instead
x.getFirst()
^
/newListMethods.kt:27:7: warning: 'getter for first: E!' is deprecated. 'getFirst()' member of List is redundant in Kotlin and might be removed soon. Please use 'first()' stdlib extension instead
x.first // synthetic property for getFirst()
^
/newListMethods.kt:29:7: warning: 'getLast(): E!' is deprecated. 'getLast()' member of List is redundant in Kotlin and might be removed soon. Please use 'last()' stdlib extension instead
x.getLast()
^
/newListMethods.kt:30:7: warning: 'getter for last: E!' is deprecated. 'getLast()' member of List is redundant in Kotlin and might be removed soon. Please use 'last()' stdlib extension instead
x.last
^
/newListMethods.kt:38:7: warning: 'getFirst(): E!' is deprecated. Overrides deprecated member in 'java.util.AbstractList'. 'getFirst()' member of List is redundant in Kotlin and might be removed soon. Please use 'first()' stdlib extension instead
y.getFirst()
^
/newListMethods.kt:39:7: warning: 'getFirst(): E!' is deprecated. Overrides deprecated member in 'java.util.AbstractList'. 'getFirst()' member of List is redundant in Kotlin and might be removed soon. Please use 'first()' stdlib extension instead
y.first
^
/newListMethods.kt:41:7: warning: 'getLast(): E!' is deprecated. Overrides deprecated member in 'java.util.AbstractList'. 'getLast()' member of List is redundant in Kotlin and might be removed soon. Please use 'last()' stdlib extension instead
y.getLast()
^
/newListMethods.kt:42:7: warning: 'getLast(): E!' is deprecated. Overrides deprecated member in 'java.util.AbstractList'. 'getLast()' member of List is redundant in Kotlin and might be removed soon. Please use 'last()' stdlib extension instead
y.last
^
/newListMethods.kt:50:7: warning: 'getFirst(): E!' is deprecated. Overrides deprecated member in 'java.util.AbstractList'. 'getFirst()' member of List is redundant in Kotlin and might be removed soon. Please use 'first()' stdlib extension instead
z.getFirst()
^
/newListMethods.kt:51:7: warning: 'getFirst(): E!' is deprecated. Overrides deprecated member in 'java.util.AbstractList'. 'getFirst()' member of List is redundant in Kotlin and might be removed soon. Please use 'first()' stdlib extension instead
z.first
^
/newListMethods.kt:53:7: warning: 'getLast(): E!' is deprecated. Overrides deprecated member in 'java.util.AbstractList'. 'getLast()' member of List is redundant in Kotlin and might be removed soon. Please use 'last()' stdlib extension instead
z.getLast()
^
/newListMethods.kt:54:7: warning: 'getLast(): E!' is deprecated. Overrides deprecated member in 'java.util.AbstractList'. 'getLast()' member of List is redundant in Kotlin and might be removed soon. Please use 'last()' stdlib extension instead
z.last
^
@@ -0,0 +1,23 @@
/newListMethods.fir.kt:(611,619): error: Unresolved reference: getFirst
/newListMethods.fir.kt:(628,633): error: Function invocation 'first()' expected
/newListMethods.fir.kt:(719,726): error: Unresolved reference: getLast
/newListMethods.fir.kt:(735,739): error: Function invocation 'last()' expected
/newListMethods.fir.kt:(853,861): error: Unresolved reference: getFirst
/newListMethods.fir.kt:(870,875): error: Function invocation 'first()' expected
/newListMethods.fir.kt:(896,903): error: Unresolved reference: getLast
/newListMethods.fir.kt:(912,916): error: Function invocation 'last()' expected
/newListMethods.fir.kt:(1030,1038): error: Unresolved reference: getFirst
/newListMethods.fir.kt:(1047,1052): error: Function invocation 'first()' expected
/newListMethods.fir.kt:(1073,1080): error: Unresolved reference: getLast
/newListMethods.fir.kt:(1089,1093): error: Function invocation 'last()' expected
@@ -1,5 +1,6 @@
// ISSUE: KT-58371
// WITH_STDLIB
// RENDER_DIAGNOSTICS_FULL_TEXT
class A<T> : ArrayList<T>() {
override fun addFirst(t: T) {
@@ -1,5 +1,6 @@
// ISSUE: KT-58371
// WITH_STDLIB
// RENDER_DIAGNOSTICS_FULL_TEXT
class A<T> : ArrayList<T>() {
override fun addFirst(t: T) {
@@ -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")