From 5b474bc5d3f5ca051ac2d60c5c92a20423735529 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Thu, 11 May 2023 09:18:44 +0000 Subject: [PATCH] Stabilize EnumEntries stdlib signature * Also, mention implementation details of EnumEntries to enable safe uses of a 'EnumEntries' as a set * Fix testdata for opt-in marker in enum entries ^KT-58548 fixed Merge-request: KT-MR-10037 Merged-by: Vsevolod Tolstopyatov --- .../conflictingPropertyEntriesAndReference.fir.kt | 6 +++--- .../entries/entriesPropertyAsExtensionClash.fir.kt | 4 ++-- .../entries/entriesPropertyAsExtensionClashOn.fir.kt | 2 +- .../enum/entries/entriesPropertyImportedClash.fir.kt | 2 +- .../entries/entriesPropertyImportedClashOn.fir.kt | 2 +- .../entries/entriesPropertyInCompanionClash.fir.kt | 2 +- .../entries/entriesPropertyInCompanionClashOn.fir.kt | 2 +- .../entries/entriesPropertyWithJvmStaticClash.fir.kt | 2 +- .../tests/enum/entries/entriesUnsupported.fir.kt | 2 +- .../tests/enum/entries/entriesUnsupported.kt | 2 +- .../enum/entries/genericEntriesPropertyClash.fir.kt | 2 +- .../enum/entries/javaEnumEntriesAmbiguity.fir.kt | 2 +- .../nameShadowingOfExternallyDefinedEntries.fir.kt | 4 ++-- .../nameShadowingOfExternallyDefinedEntriesOn.fir.kt | 4 ++-- libraries/stdlib/api/js-v1/kotlin.enums.kt | 6 +++--- libraries/stdlib/api/js/kotlin.enums.kt | 6 +++--- libraries/stdlib/src/kotlin/enums/EnumEntries.kt | 11 ++++++----- 17 files changed, 31 insertions(+), 30 deletions(-) diff --git a/compiler/testData/diagnostics/tests/enum/entries/conflictingPropertyEntriesAndReference.fir.kt b/compiler/testData/diagnostics/tests/enum/entries/conflictingPropertyEntriesAndReference.fir.kt index 662126e9366..36e6aec2fd7 100644 --- a/compiler/testData/diagnostics/tests/enum/entries/conflictingPropertyEntriesAndReference.fir.kt +++ b/compiler/testData/diagnostics/tests/enum/entries/conflictingPropertyEntriesAndReference.fir.kt @@ -8,8 +8,8 @@ enum class E { } fun test() { - E::entries - val ref = E::entries + E::entries + val ref = E::entries val refType: (E) -> Int = E::entries - val refTypeWithAnyExpectedType: Any = E::entries + val refTypeWithAnyExpectedType: Any = E::entries } diff --git a/compiler/testData/diagnostics/tests/enum/entries/entriesPropertyAsExtensionClash.fir.kt b/compiler/testData/diagnostics/tests/enum/entries/entriesPropertyAsExtensionClash.fir.kt index 6f649ae1acb..d589e4a60a6 100644 --- a/compiler/testData/diagnostics/tests/enum/entries/entriesPropertyAsExtensionClash.fir.kt +++ b/compiler/testData/diagnostics/tests/enum/entries/entriesPropertyAsExtensionClash.fir.kt @@ -12,7 +12,7 @@ enum class A { val A.Companion.entries: Int get() = 0 fun test() { - A.entries + A.entries A.Companion.entries with(A) { @@ -26,4 +26,4 @@ fun test() { val aCompanion = A.Companion aCompanion.entries -} \ No newline at end of file +} diff --git a/compiler/testData/diagnostics/tests/enum/entries/entriesPropertyAsExtensionClashOn.fir.kt b/compiler/testData/diagnostics/tests/enum/entries/entriesPropertyAsExtensionClashOn.fir.kt index 5be583fc22f..9fe5ae7a50a 100644 --- a/compiler/testData/diagnostics/tests/enum/entries/entriesPropertyAsExtensionClashOn.fir.kt +++ b/compiler/testData/diagnostics/tests/enum/entries/entriesPropertyAsExtensionClashOn.fir.kt @@ -12,7 +12,7 @@ enum class A { val A.Companion.entries: Int get() = 0 fun test() { - A.entries + A.entries A.Companion.entries with(A) { diff --git a/compiler/testData/diagnostics/tests/enum/entries/entriesPropertyImportedClash.fir.kt b/compiler/testData/diagnostics/tests/enum/entries/entriesPropertyImportedClash.fir.kt index 715635124fb..9aab13cf953 100644 --- a/compiler/testData/diagnostics/tests/enum/entries/entriesPropertyImportedClash.fir.kt +++ b/compiler/testData/diagnostics/tests/enum/entries/entriesPropertyImportedClash.fir.kt @@ -14,7 +14,7 @@ enum class A { } fun test() { - A.entries + A.entries with(A) { entries diff --git a/compiler/testData/diagnostics/tests/enum/entries/entriesPropertyImportedClashOn.fir.kt b/compiler/testData/diagnostics/tests/enum/entries/entriesPropertyImportedClashOn.fir.kt index b42536ec3fb..61b679a0854 100644 --- a/compiler/testData/diagnostics/tests/enum/entries/entriesPropertyImportedClashOn.fir.kt +++ b/compiler/testData/diagnostics/tests/enum/entries/entriesPropertyImportedClashOn.fir.kt @@ -14,7 +14,7 @@ enum class A { } fun test() { - A.entries + A.entries with(A) { entries diff --git a/compiler/testData/diagnostics/tests/enum/entries/entriesPropertyInCompanionClash.fir.kt b/compiler/testData/diagnostics/tests/enum/entries/entriesPropertyInCompanionClash.fir.kt index 51666567a98..5b978647c67 100644 --- a/compiler/testData/diagnostics/tests/enum/entries/entriesPropertyInCompanionClash.fir.kt +++ b/compiler/testData/diagnostics/tests/enum/entries/entriesPropertyInCompanionClash.fir.kt @@ -10,7 +10,7 @@ enum class A { } fun test() { - A.entries + A.entries A.Companion.entries with(A) { diff --git a/compiler/testData/diagnostics/tests/enum/entries/entriesPropertyInCompanionClashOn.fir.kt b/compiler/testData/diagnostics/tests/enum/entries/entriesPropertyInCompanionClashOn.fir.kt index d09ab299398..6bb04e0fdad 100644 --- a/compiler/testData/diagnostics/tests/enum/entries/entriesPropertyInCompanionClashOn.fir.kt +++ b/compiler/testData/diagnostics/tests/enum/entries/entriesPropertyInCompanionClashOn.fir.kt @@ -10,7 +10,7 @@ enum class A { } fun test() { - A.entries + A.entries A.Companion.entries with(A) { diff --git a/compiler/testData/diagnostics/tests/enum/entries/entriesPropertyWithJvmStaticClash.fir.kt b/compiler/testData/diagnostics/tests/enum/entries/entriesPropertyWithJvmStaticClash.fir.kt index 2bcb091cb75..fd31eeb19fe 100644 --- a/compiler/testData/diagnostics/tests/enum/entries/entriesPropertyWithJvmStaticClash.fir.kt +++ b/compiler/testData/diagnostics/tests/enum/entries/entriesPropertyWithJvmStaticClash.fir.kt @@ -11,7 +11,7 @@ enum class A { } fun test() { - A.entries + A.entries with(A) { entries diff --git a/compiler/testData/diagnostics/tests/enum/entries/entriesUnsupported.fir.kt b/compiler/testData/diagnostics/tests/enum/entries/entriesUnsupported.fir.kt index f653f235035..e36caaf77c3 100644 --- a/compiler/testData/diagnostics/tests/enum/entries/entriesUnsupported.fir.kt +++ b/compiler/testData/diagnostics/tests/enum/entries/entriesUnsupported.fir.kt @@ -7,5 +7,5 @@ enum class Foo { } fun main() { - Foo.entries + Foo.entries } diff --git a/compiler/testData/diagnostics/tests/enum/entries/entriesUnsupported.kt b/compiler/testData/diagnostics/tests/enum/entries/entriesUnsupported.kt index 8263ea4c1f0..39f73ac556f 100644 --- a/compiler/testData/diagnostics/tests/enum/entries/entriesUnsupported.kt +++ b/compiler/testData/diagnostics/tests/enum/entries/entriesUnsupported.kt @@ -7,5 +7,5 @@ enum class Foo { } fun main() { - Foo.entries + Foo.entries } diff --git a/compiler/testData/diagnostics/tests/enum/entries/genericEntriesPropertyClash.fir.kt b/compiler/testData/diagnostics/tests/enum/entries/genericEntriesPropertyClash.fir.kt index 805559d1fe4..993f0f8ad52 100644 --- a/compiler/testData/diagnostics/tests/enum/entries/genericEntriesPropertyClash.fir.kt +++ b/compiler/testData/diagnostics/tests/enum/entries/genericEntriesPropertyClash.fir.kt @@ -12,6 +12,6 @@ enum class A { val T.entries: Int get() = 0 fun test() { - A.entries + A.entries A.Companion.entries } diff --git a/compiler/testData/diagnostics/tests/enum/entries/javaEnumEntriesAmbiguity.fir.kt b/compiler/testData/diagnostics/tests/enum/entries/javaEnumEntriesAmbiguity.fir.kt index 321b41e71fc..ae68410d1a6 100644 --- a/compiler/testData/diagnostics/tests/enum/entries/javaEnumEntriesAmbiguity.fir.kt +++ b/compiler/testData/diagnostics/tests/enum/entries/javaEnumEntriesAmbiguity.fir.kt @@ -29,5 +29,5 @@ fun test() { JEnumEntry.entries JEnumStaticField.entries - JEnumField::entries + JEnumField::entries } diff --git a/compiler/testData/diagnostics/tests/enum/entries/nameShadowingOfExternallyDefinedEntries.fir.kt b/compiler/testData/diagnostics/tests/enum/entries/nameShadowingOfExternallyDefinedEntries.fir.kt index c57ea630636..ea26d6ba6d8 100644 --- a/compiler/testData/diagnostics/tests/enum/entries/nameShadowingOfExternallyDefinedEntries.fir.kt +++ b/compiler/testData/diagnostics/tests/enum/entries/nameShadowingOfExternallyDefinedEntries.fir.kt @@ -9,7 +9,7 @@ enum class E { ; fun foo() { - entries + entries pckg.entries } } @@ -20,7 +20,7 @@ class A { class B { fun foo() { - entries + entries pckg.entries } } diff --git a/compiler/testData/diagnostics/tests/enum/entries/nameShadowingOfExternallyDefinedEntriesOn.fir.kt b/compiler/testData/diagnostics/tests/enum/entries/nameShadowingOfExternallyDefinedEntriesOn.fir.kt index fc99b314de6..954a5cd99c3 100644 --- a/compiler/testData/diagnostics/tests/enum/entries/nameShadowingOfExternallyDefinedEntriesOn.fir.kt +++ b/compiler/testData/diagnostics/tests/enum/entries/nameShadowingOfExternallyDefinedEntriesOn.fir.kt @@ -9,7 +9,7 @@ enum class E { ; fun foo() { - entries.length + entries.length pckg.entries.length } } @@ -20,7 +20,7 @@ class A { class B { fun foo() { - entries.length + entries.length pckg.entries.length } } diff --git a/libraries/stdlib/api/js-v1/kotlin.enums.kt b/libraries/stdlib/api/js-v1/kotlin.enums.kt index df7bcdd7ed9..a37576ccdfd 100644 --- a/libraries/stdlib/api/js-v1/kotlin.enums.kt +++ b/libraries/stdlib/api/js-v1/kotlin.enums.kt @@ -1,4 +1,4 @@ -@kotlin.ExperimentalStdlibApi -@kotlin.SinceKotlin(version = "1.8") +@kotlin.SinceKotlin(version = "1.9") +@kotlin.WasExperimental(markerClass = {kotlin.ExperimentalStdlibApi::class}) public sealed interface EnumEntries> : kotlin.collections.List { -} \ No newline at end of file +} diff --git a/libraries/stdlib/api/js/kotlin.enums.kt b/libraries/stdlib/api/js/kotlin.enums.kt index df7bcdd7ed9..a37576ccdfd 100644 --- a/libraries/stdlib/api/js/kotlin.enums.kt +++ b/libraries/stdlib/api/js/kotlin.enums.kt @@ -1,4 +1,4 @@ -@kotlin.ExperimentalStdlibApi -@kotlin.SinceKotlin(version = "1.8") +@kotlin.SinceKotlin(version = "1.9") +@kotlin.WasExperimental(markerClass = {kotlin.ExperimentalStdlibApi::class}) public sealed interface EnumEntries> : kotlin.collections.List { -} \ No newline at end of file +} diff --git a/libraries/stdlib/src/kotlin/enums/EnumEntries.kt b/libraries/stdlib/src/kotlin/enums/EnumEntries.kt index 641624db66c..013b3e95921 100644 --- a/libraries/stdlib/src/kotlin/enums/EnumEntries.kt +++ b/libraries/stdlib/src/kotlin/enums/EnumEntries.kt @@ -14,23 +14,24 @@ package kotlin.enums * consistently with the corresponding [Enum.ordinal] values. * * An instance of this interface can only be obtained from `EnumClass.entries` property. + * + * #### Implementation note + * All basic operations, such as `contains` and `indexOf`, are executed in constant time and are likely to be + * faster than regular `ArrayList` counterparts. */ -@ExperimentalStdlibApi -@SinceKotlin("1.8") +@SinceKotlin("1.9") +@WasExperimental(ExperimentalStdlibApi::class) public sealed interface EnumEntries> : List @PublishedApi -@ExperimentalStdlibApi @SinceKotlin("1.8") // Used by pre-1.9.0 JVM compiler for the feature in preview mode. Can be safely removed around 2.1 internal fun > enumEntries(entriesProvider: () -> Array): EnumEntries = EnumEntriesList(entriesProvider()) @PublishedApi -@ExperimentalStdlibApi @SinceKotlin("1.8") internal fun > enumEntries(entries: Array): EnumEntries = EnumEntriesList(entries) @SinceKotlin("1.8") -@ExperimentalStdlibApi private class EnumEntriesList>(private val entries: Array) : EnumEntries, AbstractList(), Serializable { // WA for JS IR bug: // class type parameter name MUST be different from E (AbstractList type parameter),