From 1e86a82ee138cdc48035df61a9504e1352617ffd Mon Sep 17 00:00:00 2001 From: "Denis.Zharkov" Date: Fri, 28 Jul 2023 13:58:52 +0200 Subject: [PATCH] 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 --- ...LightTreeJdk21DiagnosticTestGenerated.java | 6 ++ .../FirPsiJdk21DiagnosticTestGenerated.java | 6 ++ ...plementationsForSequencedCollection.fir.kt | 51 ++++++++++++++++ .../implementationsForSequencedCollection.kt | 51 ++++++++++++++++ .../testsWithJdk21/newListMethods.fir.kt | 58 +++++++++++++++++++ .../testsWithJdk21/newListMethods.kt | 53 ++++++++++------- .../runners/Jdk21DiagnosticTestGenerated.java | 6 ++ .../builtins/jvm/JvmBuiltInsSignatures.kt | 13 ++--- 8 files changed, 216 insertions(+), 28 deletions(-) create mode 100644 compiler/testData/diagnostics/testsWithJdk21/implementationsForSequencedCollection.fir.kt create mode 100644 compiler/testData/diagnostics/testsWithJdk21/implementationsForSequencedCollection.kt create mode 100644 compiler/testData/diagnostics/testsWithJdk21/newListMethods.fir.kt diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeJdk21DiagnosticTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeJdk21DiagnosticTestGenerated.java index 6457b4e949e..5ae5e609122 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeJdk21DiagnosticTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeJdk21DiagnosticTestGenerated.java @@ -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 { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiJdk21DiagnosticTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiJdk21DiagnosticTestGenerated.java index 107a5decd11..1d64bdbb09f 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiJdk21DiagnosticTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiJdk21DiagnosticTestGenerated.java @@ -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 { diff --git a/compiler/testData/diagnostics/testsWithJdk21/implementationsForSequencedCollection.fir.kt b/compiler/testData/diagnostics/testsWithJdk21/implementationsForSequencedCollection.fir.kt new file mode 100644 index 00000000000..77448fc7d1f --- /dev/null +++ b/compiler/testData/diagnostics/testsWithJdk21/implementationsForSequencedCollection.fir.kt @@ -0,0 +1,51 @@ +// WITH_STDLIB + +fun foo(ll: java.util.LinkedList, al: ArrayList, ad: ArrayDeque, jad: java.util.ArrayDeque) { + 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.removeFirst() + ll.removeLast() + ll.reversed() + + al.addFirst("") + al.addLast("") + al.getFirst() + al.first + al.first() + al.getLast() + al.last + al.last() + al.removeFirst() + al.removeLast() + al.reversed() + + ad.addFirst("") + ad.addLast("") + ad.getFirst() + ad.first + ad.first() + ad.getLast() + ad.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() +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/testsWithJdk21/implementationsForSequencedCollection.kt b/compiler/testData/diagnostics/testsWithJdk21/implementationsForSequencedCollection.kt new file mode 100644 index 00000000000..dbfcea98e9c --- /dev/null +++ b/compiler/testData/diagnostics/testsWithJdk21/implementationsForSequencedCollection.kt @@ -0,0 +1,51 @@ +// WITH_STDLIB + +fun foo(ll: java.util.LinkedList, al: ArrayList, ad: ArrayDeque, jad: java.util.ArrayDeque) { + 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.removeFirst() + ll.removeLast() + ll.reversed() + + al.addFirst("") + al.addLast("") + al.getFirst() + al.first + al.first() + al.getLast() + al.last + al.last() + al.removeFirst() + al.removeLast() + al.reversed() + + ad.addFirst("") + ad.addLast("") + ad.getFirst() + ad.first + ad.first() + ad.getLast() + ad.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() +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/testsWithJdk21/newListMethods.fir.kt b/compiler/testData/diagnostics/testsWithJdk21/newListMethods.fir.kt new file mode 100644 index 00000000000..c72c65b7a67 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithJdk21/newListMethods.fir.kt @@ -0,0 +1,58 @@ +// ISSUE: KT-58371 +// WITH_STDLIB + +class A : ArrayList() { + 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 = super.reversed() +} + +fun foo(x: MutableList, y: ArrayList, z: A) { + x.addFirst("") + x.addLast("") + x.getFirst() + x.first // synthetic property for getFirst() + x.first() // stdlib extension on List + x.getLast() + x.last + x.last() + x.removeFirst() + x.removeLast() + x.reversed() + + y.addFirst("") + y.addLast("") + y.getFirst() + y.first + y.first() + y.getLast() + y.last + y.last() + y.removeFirst() + y.removeLast() + y.reversed() + + z.addFirst("") + z.addLast("") + z.getFirst() + z.first + z.first() + z.getLast() + z.last + z.last() + z.removeFirst() + z.removeLast() + z.reversed() +} diff --git a/compiler/testData/diagnostics/testsWithJdk21/newListMethods.kt b/compiler/testData/diagnostics/testsWithJdk21/newListMethods.kt index 8e1f5a302d8..79420fd70ab 100644 --- a/compiler/testData/diagnostics/testsWithJdk21/newListMethods.kt +++ b/compiler/testData/diagnostics/testsWithJdk21/newListMethods.kt @@ -1,4 +1,3 @@ -// FIR_IDENTICAL // ISSUE: KT-58371 // WITH_STDLIB @@ -11,8 +10,8 @@ class A : ArrayList() { super.addLast(t) } - override fun getFirst(): T = super.getFirst() - override fun getLast(): T = super.getLast() + override fun getFirst(): T = super.getFirst() + override fun getLast(): T = super.getLast() override fun removeFirst(): T = super.removeFirst() override fun removeLast(): T = super.removeLast() @@ -21,27 +20,39 @@ class A : ArrayList() { } fun foo(x: MutableList, y: ArrayList, z: A) { - x.addFirst("") - x.addLast("") - x.getFirst() - x.getLast() - x.removeFirst() - x.removeLast() + x.addFirst("") + x.addLast("") + x.getFirst() + x.first // synthetic property for getFirst() + x.first() // stdlib extension on List + x.getLast() + x.last + x.last() + x.removeFirst() + x.removeLast() x.reversed() - y.addFirst("") - y.addLast("") - y.getFirst() - y.getLast() - y.removeFirst() - y.removeLast() + y.addFirst("") + y.addLast("") + y.getFirst() + y.first + y.first() + y.getLast() + y.last + y.last() + y.removeFirst() + y.removeLast() y.reversed() - z.addFirst("") - z.addLast("") - z.getFirst() - z.getLast() - z.removeFirst() - z.removeLast() + z.addFirst("") + z.addLast("") + z.getFirst() + z.first + z.first() + z.getLast() + z.last + z.last() + z.removeFirst() + z.removeLast() z.reversed() } diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/Jdk21DiagnosticTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/Jdk21DiagnosticTestGenerated.java index f4527aca9e1..cde4a4fb0e8 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/Jdk21DiagnosticTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/Jdk21DiagnosticTestGenerated.java @@ -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 { 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 fb4cce70563..8553b033bd2 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 @@ -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(