diff --git a/compiler/testData/diagnostics/testsWithJdk21/newListMethods.diag.txt b/compiler/testData/diagnostics/testsWithJdk21/newListMethods.diag.txt new file mode 100644 index 00000000000..979104a128c --- /dev/null +++ b/compiler/testData/diagnostics/testsWithJdk21/newListMethods.diag.txt @@ -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 + ^ diff --git a/compiler/testData/diagnostics/testsWithJdk21/newListMethods.fir.diag.txt b/compiler/testData/diagnostics/testsWithJdk21/newListMethods.fir.diag.txt new file mode 100644 index 00000000000..7d9ca67d85c --- /dev/null +++ b/compiler/testData/diagnostics/testsWithJdk21/newListMethods.fir.diag.txt @@ -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 diff --git a/compiler/testData/diagnostics/testsWithJdk21/newListMethods.fir.kt b/compiler/testData/diagnostics/testsWithJdk21/newListMethods.fir.kt index c72c65b7a67..b083f00c234 100644 --- a/compiler/testData/diagnostics/testsWithJdk21/newListMethods.fir.kt +++ b/compiler/testData/diagnostics/testsWithJdk21/newListMethods.fir.kt @@ -1,5 +1,6 @@ // ISSUE: KT-58371 // WITH_STDLIB +// RENDER_DIAGNOSTICS_FULL_TEXT class A : ArrayList() { override fun addFirst(t: T) { diff --git a/compiler/testData/diagnostics/testsWithJdk21/newListMethods.kt b/compiler/testData/diagnostics/testsWithJdk21/newListMethods.kt index a5f58bb0087..cb8756d046c 100644 --- a/compiler/testData/diagnostics/testsWithJdk21/newListMethods.kt +++ b/compiler/testData/diagnostics/testsWithJdk21/newListMethods.kt @@ -1,5 +1,6 @@ // ISSUE: KT-58371 // WITH_STDLIB +// RENDER_DIAGNOSTICS_FULL_TEXT class A : ArrayList() { override fun addFirst(t: T) { diff --git a/core/compiler.common.jvm/src/org/jetbrains/kotlin/builtins/jvm/JvmBuiltInsSignatures.kt b/core/compiler.common.jvm/src/org/jetbrains/kotlin/builtins/jvm/JvmBuiltInsSignatures.kt index 8553b033bd2..51923154de7 100644 --- a/core/compiler.common.jvm/src/org/jetbrains/kotlin/builtins/jvm/JvmBuiltInsSignatures.kt +++ b/core/compiler.common.jvm/src/org/jetbrains/kotlin/builtins/jvm/JvmBuiltInsSignatures.kt @@ -67,6 +67,14 @@ object JvmBuiltInsSignatures { } } + val DEPRECATED_LIST_METHODS: Set = + signatures { + inJavaUtil( + "List", + "getFirst()Ljava/lang/Object;", + "getLast()Ljava/lang/Object;", + ) + } val VISIBLE_METHOD_SIGNATURES: Set = signatures { diff --git a/core/descriptors.jvm/src/org/jetbrains/kotlin/builtins/jvm/JvmBuiltInsCustomizer.kt b/core/descriptors.jvm/src/org/jetbrains/kotlin/builtins/jvm/JvmBuiltInsCustomizer.kt index 62ac0b0ca85..b09f7ee80df 100644 --- a/core/descriptors.jvm/src/org/jetbrains/kotlin/builtins/jvm/JvmBuiltInsCustomizer.kt +++ b/core/descriptors.jvm/src/org/jetbrains/kotlin/builtins/jvm/JvmBuiltInsCustomizer.kt @@ -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, 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") \ No newline at end of file