K1: Change how Kotlin sees some of the new JDK 21 collections members

- Make addFirst/Last and removeFirst/removeLast as members
- Leave getFirst/getLast unprocessed, thus visible for K1, but marked
as deprecated

Though the implementations of getFirst/getLast and synthetic property
access to them are expected to be deprecated as well, it's expected
to be fixed in later commits.

^KT-60659 In Progress
^KT-60769 In Progress
This commit is contained in:
Denis.Zharkov
2023-07-28 13:58:52 +02:00
committed by Space Team
parent d99f8ac9b4
commit 1e86a82ee1
8 changed files with 216 additions and 28 deletions
@@ -24,6 +24,12 @@ public class FirLightTreeJdk21DiagnosticTestGenerated extends AbstractFirLightTr
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/diagnostics/testsWithJdk21"), Pattern.compile("^(.+)\\.kt$"), Pattern.compile("^(.+)\\.(reversed|fir|ll)\\.kts?$"), true);
}
@Test
@TestMetadata("implementationsForSequencedCollection.kt")
public void testImplementationsForSequencedCollection() throws Exception {
runTest("compiler/testData/diagnostics/testsWithJdk21/implementationsForSequencedCollection.kt");
}
@Test
@TestMetadata("newListMethods.kt")
public void testNewListMethods() throws Exception {
@@ -24,6 +24,12 @@ public class FirPsiJdk21DiagnosticTestGenerated extends AbstractFirPsiJdk21Diagn
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/diagnostics/testsWithJdk21"), Pattern.compile("^(.+)\\.kt$"), Pattern.compile("^(.+)\\.(reversed|fir|ll)\\.kts?$"), true);
}
@Test
@TestMetadata("implementationsForSequencedCollection.kt")
public void testImplementationsForSequencedCollection() throws Exception {
runTest("compiler/testData/diagnostics/testsWithJdk21/implementationsForSequencedCollection.kt");
}
@Test
@TestMetadata("newListMethods.kt")
public void testNewListMethods() throws Exception {
@@ -0,0 +1,51 @@
// WITH_STDLIB
fun foo(ll: java.util.LinkedList<String>, al: ArrayList<String>, ad: ArrayDeque<String>, jad: java.util.ArrayDeque<String>) {
ll.addFirst("")
ll.addLast("")
ll.<!UNRESOLVED_REFERENCE!>getFirst<!>()
ll.<!INVISIBLE_REFERENCE!>first<!> // synthetic property for getFirst()
ll.first() // stdlib extension on List
ll.<!UNRESOLVED_REFERENCE!>getLast<!>()
ll.<!INVISIBLE_REFERENCE!>last<!>
ll.last()
ll.removeFirst()
ll.removeLast()
ll.reversed()
al.addFirst("")
al.addLast("")
al.<!UNRESOLVED_REFERENCE!>getFirst<!>()
al.<!FUNCTION_CALL_EXPECTED!>first<!>
al.first()
al.<!UNRESOLVED_REFERENCE!>getLast<!>()
al.<!FUNCTION_CALL_EXPECTED!>last<!>
al.last()
al.removeFirst()
al.removeLast()
al.reversed()
ad.addFirst("")
ad.addLast("")
ad.<!UNRESOLVED_REFERENCE!>getFirst<!>()
ad.<!FUNCTION_CALL_EXPECTED!>first<!>
ad.first()
ad.<!UNRESOLVED_REFERENCE!>getLast<!>()
ad.<!FUNCTION_CALL_EXPECTED!>last<!>
ad.last()
ad.removeFirst()
ad.removeLast()
ad.reversed()
jad.addFirst("")
jad.addLast("")
jad.getFirst()
jad.first
jad.first()
jad.getLast()
jad.last
jad.last()
jad.removeFirst()
jad.removeLast()
jad.reversed()
}
@@ -0,0 +1,51 @@
// WITH_STDLIB
fun foo(ll: java.util.LinkedList<String>, al: ArrayList<String>, ad: ArrayDeque<String>, jad: java.util.ArrayDeque<String>) {
ll.addFirst("")
ll.addLast("")
ll.getFirst()
ll.first // synthetic property for getFirst()
ll.first() // stdlib extension on List
ll.getLast()
ll.last
ll.last()
ll.<!DEBUG_INFO_CALL("fqName: java.util.LinkedList.removeFirst; typeCall: function")!>removeFirst()<!>
ll.<!DEBUG_INFO_CALL("fqName: java.util.LinkedList.removeLast; typeCall: function")!>removeLast()<!>
ll.<!DEBUG_INFO_CALL("fqName: kotlin.collections.reversed; typeCall: extension function")!>reversed()<!>
al.addFirst("")
al.addLast("")
al.getFirst()
al.first
al.first()
al.getLast()
al.last
al.last()
al.<!DEBUG_INFO_CALL("fqName: java.util.ArrayList.removeFirst; typeCall: function")!>removeFirst()<!>
al.<!DEBUG_INFO_CALL("fqName: java.util.ArrayList.removeLast; typeCall: function")!>removeLast()<!>
al.<!DEBUG_INFO_CALL("fqName: kotlin.collections.reversed; typeCall: extension function")!>reversed()<!>
ad.addFirst("")
ad.addLast("")
ad.<!DEPRECATION!>getFirst<!>()
ad.<!DEPRECATION!>first<!>
ad.first()
ad.<!DEPRECATION!>getLast<!>()
ad.<!DEPRECATION!>last<!>
ad.last()
ad.<!DEBUG_INFO_CALL("fqName: kotlin.collections.ArrayDeque.removeFirst; typeCall: function")!>removeFirst()<!>
ad.<!DEBUG_INFO_CALL("fqName: kotlin.collections.ArrayDeque.removeLast; typeCall: function")!>removeLast()<!>
ad.<!DEBUG_INFO_CALL("fqName: kotlin.collections.reversed; typeCall: extension function")!>reversed()<!>
jad.addFirst("")
jad.addLast("")
jad.getFirst()
jad.first
jad.first()
jad.getLast()
jad.last
jad.last()
jad.<!DEBUG_INFO_CALL("fqName: java.util.ArrayDeque.removeFirst; typeCall: function")!>removeFirst()<!>
jad.<!DEBUG_INFO_CALL("fqName: java.util.ArrayDeque.removeLast; typeCall: function")!>removeLast()<!>
jad.<!DEBUG_INFO_CALL("fqName: java.util.ArrayDeque.reversed; typeCall: function")!>reversed()<!>
}
@@ -0,0 +1,58 @@
// ISSUE: KT-58371
// WITH_STDLIB
class A<T> : ArrayList<T>() {
override fun addFirst(t: T) {
super.addFirst(t)
}
override fun addLast(t: T) {
super.addLast(t)
}
override fun getFirst(): T = super.getFirst()
override fun getLast(): T = super.getLast()
override fun removeFirst(): T = super.removeFirst()
override fun removeLast(): T = super.removeLast()
override fun reversed(): List<T> = super.reversed()
}
fun foo(x: MutableList<String>, y: ArrayList<String>, z: A<String>) {
x.addFirst("")
x.addLast("")
x.<!UNRESOLVED_REFERENCE!>getFirst<!>()
x.<!FUNCTION_CALL_EXPECTED!>first<!> // synthetic property for getFirst()
x.first() // stdlib extension on List
x.<!UNRESOLVED_REFERENCE!>getLast<!>()
x.<!FUNCTION_CALL_EXPECTED!>last<!>
x.last()
x.<!DEBUG_INFO_CALL("fqName: kotlin.collections.MutableList.removeFirst; typeCall: function")!>removeFirst()<!>
x.<!DEBUG_INFO_CALL("fqName: kotlin.collections.MutableList.removeLast; typeCall: function")!>removeLast()<!>
x.<!DEBUG_INFO_CALL("fqName: kotlin.collections.reversed; typeCall: extension function")!>reversed()<!>
y.addFirst("")
y.addLast("")
y.<!UNRESOLVED_REFERENCE!>getFirst<!>()
y.<!FUNCTION_CALL_EXPECTED!>first<!>
y.first()
y.<!UNRESOLVED_REFERENCE!>getLast<!>()
y.<!FUNCTION_CALL_EXPECTED!>last<!>
y.last()
y.<!DEBUG_INFO_CALL("fqName: java.util.ArrayList.removeFirst; typeCall: function")!>removeFirst()<!>
y.<!DEBUG_INFO_CALL("fqName: java.util.ArrayList.removeLast; typeCall: function")!>removeLast()<!>
y.<!DEBUG_INFO_CALL("fqName: kotlin.collections.reversed; typeCall: extension function")!>reversed()<!>
z.addFirst("")
z.addLast("")
z.<!UNRESOLVED_REFERENCE!>getFirst<!>()
z.<!FUNCTION_CALL_EXPECTED!>first<!>
z.first()
z.<!UNRESOLVED_REFERENCE!>getLast<!>()
z.<!FUNCTION_CALL_EXPECTED!>last<!>
z.last()
z.<!DEBUG_INFO_CALL("fqName: A.removeFirst; typeCall: function")!>removeFirst()<!>
z.<!DEBUG_INFO_CALL("fqName: A.removeLast; typeCall: function")!>removeLast()<!>
z.<!DEBUG_INFO_CALL("fqName: kotlin.collections.reversed; typeCall: extension function")!>reversed()<!>
}
@@ -1,4 +1,3 @@
// FIR_IDENTICAL
// ISSUE: KT-58371
// WITH_STDLIB
@@ -11,8 +10,8 @@ class A<T> : ArrayList<T>() {
super.addLast(t)
}
override fun getFirst(): T = super.getFirst()
override fun getLast(): T = super.getLast()
override fun <!OVERRIDE_DEPRECATION!>getFirst<!>(): T = super.getFirst()
override fun <!OVERRIDE_DEPRECATION!>getLast<!>(): T = super.getLast()
override fun removeFirst(): T = super.removeFirst()
override fun removeLast(): T = super.removeLast()
@@ -21,27 +20,39 @@ class A<T> : ArrayList<T>() {
}
fun foo(x: MutableList<String>, y: ArrayList<String>, z: A<String>) {
x.<!UNRESOLVED_REFERENCE!>addFirst<!>("")
x.<!UNRESOLVED_REFERENCE!>addLast<!>("")
x.<!UNRESOLVED_REFERENCE!>getFirst<!>()
x.<!UNRESOLVED_REFERENCE!>getLast<!>()
x.<!DEBUG_INFO_CALL("fqName: kotlin.collections.removeFirst; typeCall: extension function")!>removeFirst()<!>
x.<!DEBUG_INFO_CALL("fqName: kotlin.collections.removeLast; typeCall: extension function")!>removeLast()<!>
x.addFirst("")
x.addLast("")
x.<!DEPRECATION!>getFirst<!>()
x.<!DEPRECATION!>first<!> // synthetic property for getFirst()
x.first() // stdlib extension on List
x.<!DEPRECATION!>getLast<!>()
x.<!DEPRECATION!>last<!>
x.last()
x.<!DEBUG_INFO_CALL("fqName: kotlin.collections.MutableList.removeFirst; typeCall: function")!>removeFirst()<!>
x.<!DEBUG_INFO_CALL("fqName: kotlin.collections.MutableList.removeLast; typeCall: function")!>removeLast()<!>
x.<!DEBUG_INFO_CALL("fqName: kotlin.collections.reversed; typeCall: extension function")!>reversed()<!>
y.<!UNRESOLVED_REFERENCE!>addFirst<!>("")
y.<!UNRESOLVED_REFERENCE!>addLast<!>("")
y.<!UNRESOLVED_REFERENCE!>getFirst<!>()
y.<!UNRESOLVED_REFERENCE!>getLast<!>()
y.<!DEBUG_INFO_CALL("fqName: kotlin.collections.removeFirst; typeCall: extension function")!>removeFirst()<!>
y.<!DEBUG_INFO_CALL("fqName: kotlin.collections.removeLast; typeCall: extension function")!>removeLast()<!>
y.addFirst("")
y.addLast("")
y.getFirst()
y.first
y.first()
y.getLast()
y.last
y.last()
y.<!DEBUG_INFO_CALL("fqName: java.util.ArrayList.removeFirst; typeCall: function")!>removeFirst()<!>
y.<!DEBUG_INFO_CALL("fqName: java.util.ArrayList.removeLast; typeCall: function")!>removeLast()<!>
y.<!DEBUG_INFO_CALL("fqName: kotlin.collections.reversed; typeCall: extension function")!>reversed()<!>
z.<!UNRESOLVED_REFERENCE!>addFirst<!>("")
z.<!UNRESOLVED_REFERENCE!>addLast<!>("")
z.<!UNRESOLVED_REFERENCE!>getFirst<!>()
z.<!UNRESOLVED_REFERENCE!>getLast<!>()
z.<!DEBUG_INFO_CALL("fqName: kotlin.collections.removeFirst; typeCall: extension function")!>removeFirst()<!>
z.<!DEBUG_INFO_CALL("fqName: kotlin.collections.removeLast; typeCall: extension function")!>removeLast()<!>
z.addFirst("")
z.addLast("")
z.getFirst()
z.first
z.first()
z.getLast()
z.last
z.last()
z.<!DEBUG_INFO_CALL("fqName: A.removeFirst; typeCall: function")!>removeFirst()<!>
z.<!DEBUG_INFO_CALL("fqName: A.removeLast; typeCall: function")!>removeLast()<!>
z.<!DEBUG_INFO_CALL("fqName: kotlin.collections.reversed; typeCall: extension function")!>reversed()<!>
}
@@ -24,6 +24,12 @@ public class Jdk21DiagnosticTestGenerated extends AbstractJdk21DiagnosticTest {
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/diagnostics/testsWithJdk21"), Pattern.compile("^(.+)\\.kt$"), Pattern.compile("^(.+)\\.(reversed|fir|ll)\\.kts?$"), true);
}
@Test
@TestMetadata("implementationsForSequencedCollection.kt")
public void testImplementationsForSequencedCollection() throws Exception {
runTest("compiler/testData/diagnostics/testsWithJdk21/implementationsForSequencedCollection.kt");
}
@Test
@TestMetadata("newListMethods.kt")
public void testNewListMethods() throws Exception {
@@ -27,12 +27,6 @@ object JvmBuiltInsSignatures {
"List",
"sort(Ljava/util/Comparator;)V",
// From JDK 21
"addFirst(Ljava/lang/Object;)V",
"addLast(Ljava/lang/Object;)V",
"getFirst()Ljava/lang/Object;",
"getLast()Ljava/lang/Object;",
"removeFirst()Ljava/lang/Object;",
"removeLast()Ljava/lang/Object;",
"reversed()Ljava/util/List;",
) +
@@ -108,7 +102,12 @@ object JvmBuiltInsSignatures {
inJavaUtil(
"List",
"replaceAll(Ljava/util/function/UnaryOperator;)V"
"replaceAll(Ljava/util/function/UnaryOperator;)V",
// From JDK 21
"addFirst(Ljava/lang/Object;)V",
"addLast(Ljava/lang/Object;)V",
"removeFirst()Ljava/lang/Object;",
"removeLast()Ljava/lang/Object;",
) +
inJavaUtil(