From cf79752c14536128a6b298c72feb13507d5f1d31 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Tue, 5 Apr 2022 12:34:35 +0300 Subject: [PATCH] Stabilize deepRecursiveFunction and DeepRecursiveScope #KT-51848 --- libraries/stdlib/api/js-v1/kotlin.kt | 12 ++++++------ libraries/stdlib/api/js/kotlin.kt | 12 ++++++------ .../stdlib/src/kotlin/util/DeepRecursive.kt | 16 +++++++--------- 3 files changed, 19 insertions(+), 21 deletions(-) diff --git a/libraries/stdlib/api/js-v1/kotlin.kt b/libraries/stdlib/api/js-v1/kotlin.kt index b047facf102..915c48b05a4 100644 --- a/libraries/stdlib/api/js-v1/kotlin.kt +++ b/libraries/stdlib/api/js-v1/kotlin.kt @@ -415,8 +415,8 @@ public inline operator fun kotlin.reflect.KProperty1.getValue(thisR @kotlin.internal.InlineOnly public inline fun kotlin.Any?.hashCode(): kotlin.Int -@kotlin.SinceKotlin(version = "1.4") -@kotlin.ExperimentalStdlibApi +@kotlin.SinceKotlin(version = "1.7") +@kotlin.WasExperimental(markerClass = {kotlin.ExperimentalStdlibApi::class}) public operator fun kotlin.DeepRecursiveFunction.invoke(value: T): R public fun kotlin.Double.isFinite(): kotlin.Boolean @@ -1195,15 +1195,15 @@ public final annotation class ContextFunctionTypeParams : kotlin.Annotation { public final val count: kotlin.Int { get; } } -@kotlin.SinceKotlin(version = "1.4") -@kotlin.ExperimentalStdlibApi +@kotlin.SinceKotlin(version = "1.7") +@kotlin.WasExperimental(markerClass = {kotlin.ExperimentalStdlibApi::class}) public final class DeepRecursiveFunction { public constructor DeepRecursiveFunction(block: suspend kotlin.DeepRecursiveScope.(T) -> R) } @kotlin.coroutines.RestrictsSuspension -@kotlin.SinceKotlin(version = "1.4") -@kotlin.ExperimentalStdlibApi +@kotlin.SinceKotlin(version = "1.7") +@kotlin.WasExperimental(markerClass = {kotlin.ExperimentalStdlibApi::class}) public sealed class DeepRecursiveScope { protected constructor DeepRecursiveScope() diff --git a/libraries/stdlib/api/js/kotlin.kt b/libraries/stdlib/api/js/kotlin.kt index 752d66f1d04..01c202fc676 100644 --- a/libraries/stdlib/api/js/kotlin.kt +++ b/libraries/stdlib/api/js/kotlin.kt @@ -378,8 +378,8 @@ public inline operator fun kotlin.reflect.KProperty1.getValue(thisR @kotlin.internal.InlineOnly public inline fun kotlin.Any?.hashCode(): kotlin.Int -@kotlin.SinceKotlin(version = "1.4") -@kotlin.ExperimentalStdlibApi +@kotlin.SinceKotlin(version = "1.7") +@kotlin.WasExperimental(markerClass = {kotlin.ExperimentalStdlibApi::class}) public operator fun kotlin.DeepRecursiveFunction.invoke(value: T): R public fun kotlin.Double.isFinite(): kotlin.Boolean @@ -1166,15 +1166,15 @@ public final annotation class ContextFunctionTypeParams : kotlin.Annotation { public final val count: kotlin.Int { get; } } -@kotlin.SinceKotlin(version = "1.4") -@kotlin.ExperimentalStdlibApi +@kotlin.SinceKotlin(version = "1.7") +@kotlin.WasExperimental(markerClass = {kotlin.ExperimentalStdlibApi::class}) public final class DeepRecursiveFunction { public constructor DeepRecursiveFunction(block: suspend kotlin.DeepRecursiveScope.(T) -> R) } @kotlin.coroutines.RestrictsSuspension -@kotlin.SinceKotlin(version = "1.4") -@kotlin.ExperimentalStdlibApi +@kotlin.SinceKotlin(version = "1.7") +@kotlin.WasExperimental(markerClass = {kotlin.ExperimentalStdlibApi::class}) public sealed class DeepRecursiveScope { protected constructor DeepRecursiveScope() diff --git a/libraries/stdlib/src/kotlin/util/DeepRecursive.kt b/libraries/stdlib/src/kotlin/util/DeepRecursive.kt index 0417b7bbc9c..20e113a4321 100644 --- a/libraries/stdlib/src/kotlin/util/DeepRecursive.kt +++ b/libraries/stdlib/src/kotlin/util/DeepRecursive.kt @@ -37,7 +37,7 @@ import kotlin.native.concurrent.SharedImmutable * println(depth(deepTree)) // StackOverflowError * ``` * - * If this `depth` function is called for a `deepTree` it produces [StackOverflowError] because of deep recursion. + * If this `depth` function is called for a `deepTree` it produces `StackOverflowError` because of deep recursion. * However, the `depth` function can be rewritten using `DeepRecursiveFunction` in the following way, and then * it successfully computes [`depth(deepTree)`][DeepRecursiveFunction.invoke] expression: * @@ -67,8 +67,8 @@ import kotlin.native.concurrent.SharedImmutable * @param [R] the function result type. * @param block the function body. */ -@SinceKotlin("1.4") -@ExperimentalStdlibApi +@SinceKotlin("1.7") +@WasExperimental(ExperimentalStdlibApi::class) public class DeepRecursiveFunction( internal val block: suspend DeepRecursiveScope.(T) -> R ) @@ -80,8 +80,8 @@ public class DeepRecursiveFunction( * initial recursive invocation. From inside of [DeepRecursiveScope] use * [callRecursive][DeepRecursiveScope.callRecursive]. */ -@SinceKotlin("1.4") -@ExperimentalStdlibApi +@SinceKotlin("1.7") +@WasExperimental(ExperimentalStdlibApi::class) public operator fun DeepRecursiveFunction.invoke(value: T): R = DeepRecursiveScopeImpl(block, value).runCallLoop() @@ -93,8 +93,8 @@ public operator fun DeepRecursiveFunction.invoke(value: T): R = * @param [R] function result type. */ @RestrictsSuspension -@SinceKotlin("1.4") -@ExperimentalStdlibApi +@SinceKotlin("1.7") +@WasExperimental(ExperimentalStdlibApi::class) public sealed class DeepRecursiveScope { /** * Makes recursive call to this [DeepRecursiveFunction] function putting the call activation frame on the heap, @@ -122,14 +122,12 @@ public sealed class DeepRecursiveScope { // ================== Implementation ================== -@ExperimentalStdlibApi private typealias DeepRecursiveFunctionBlock = suspend DeepRecursiveScope<*, *>.(Any?) -> Any? @SharedImmutable private val UNDEFINED_RESULT = Result.success(COROUTINE_SUSPENDED) @Suppress("UNCHECKED_CAST") -@ExperimentalStdlibApi private class DeepRecursiveScopeImpl( block: suspend DeepRecursiveScope.(T) -> R, value: T