From 96611de34421d3d05309ac1a0956d5bd8cb0bea7 Mon Sep 17 00:00:00 2001 From: Ilya Gorbunov Date: Sun, 19 Sep 2021 04:36:44 +0300 Subject: [PATCH] Stabilize Duration, DurationUnit and related top-level functions KT-46784 Co-authored-by: Abduqodiri Qurbonzoda --- .../main/kotlin/kotlin/time/DurationUnit.kt | 7 +-- libraries/stdlib/api/js-v1/kotlin.time.kt | 39 ++++++---------- libraries/stdlib/api/js/kotlin.time.kt | 39 ++++++---------- .../src/kotlin/time/DurationConversions.kt | 12 ++--- .../jdk8/test/time/DurationConversionTest.kt | 1 - .../stdlib/js/src/kotlin/time/DurationUnit.kt | 7 +-- .../jvm/src/kotlin/time/DurationUnitJvm.kt | 7 +-- libraries/stdlib/src/kotlin/time/Duration.kt | 46 +++++++------------ .../stdlib/src/kotlin/time/DurationUnit.kt | 10 +--- libraries/stdlib/test/time/DurationTest.kt | 1 - .../stdlib/test/time/DurationUnitTest.kt | 1 - .../wasm/src/kotlin/time/DurationUnit.kt | 7 +-- 12 files changed, 60 insertions(+), 117 deletions(-) diff --git a/kotlin-native/runtime/src/main/kotlin/kotlin/time/DurationUnit.kt b/kotlin-native/runtime/src/main/kotlin/kotlin/time/DurationUnit.kt index 85997abcab6..ca67cca28f5 100644 --- a/kotlin-native/runtime/src/main/kotlin/kotlin/time/DurationUnit.kt +++ b/kotlin-native/runtime/src/main/kotlin/kotlin/time/DurationUnit.kt @@ -6,8 +6,8 @@ package kotlin.time -@SinceKotlin("1.3") -@ExperimentalTime +@SinceKotlin("1.6") +@WasExperimental(ExperimentalTime::class) public actual enum class DurationUnit(internal val scale: Double) { /** * Time unit representing one nanosecond, which is 1/1000 of a microsecond. @@ -40,7 +40,6 @@ public actual enum class DurationUnit(internal val scale: Double) { } @SinceKotlin("1.3") -@ExperimentalTime internal actual fun convertDurationUnit(value: Double, sourceUnit: DurationUnit, targetUnit: DurationUnit): Double { val sourceCompareTarget = sourceUnit.scale.compareTo(targetUnit.scale) return when { @@ -51,7 +50,6 @@ internal actual fun convertDurationUnit(value: Double, sourceUnit: DurationUnit, } @SinceKotlin("1.5") -@ExperimentalTime internal actual fun convertDurationUnitOverflow(value: Long, sourceUnit: DurationUnit, targetUnit: DurationUnit): Long { val sourceCompareTarget = sourceUnit.scale.compareTo(targetUnit.scale) return when { @@ -62,7 +60,6 @@ internal actual fun convertDurationUnitOverflow(value: Long, sourceUnit: Duratio } @SinceKotlin("1.5") -@ExperimentalTime internal actual fun convertDurationUnit(value: Long, sourceUnit: DurationUnit, targetUnit: DurationUnit): Long { val sourceCompareTarget = sourceUnit.scale.compareTo(targetUnit.scale) return when { diff --git a/libraries/stdlib/api/js-v1/kotlin.time.kt b/libraries/stdlib/api/js-v1/kotlin.time.kt index b059d8e4cf9..01b5a3a8ca0 100644 --- a/libraries/stdlib/api/js-v1/kotlin.time.kt +++ b/libraries/stdlib/api/js-v1/kotlin.time.kt @@ -131,26 +131,26 @@ public inline fun kotlin.time.TimeSource.measureTimedValue(block: () -> T): @kotlin.Deprecated(level = DeprecationLevel.ERROR, message = "Subtracting one TimeMark from another is not a well defined operation because these time marks could have been obtained from the different time sources.") public inline operator fun kotlin.time.TimeMark.minus(other: kotlin.time.TimeMark): kotlin.time.Duration -@kotlin.SinceKotlin(version = "1.3") -@kotlin.time.ExperimentalTime +@kotlin.SinceKotlin(version = "1.6") +@kotlin.WasExperimental(markerClass = {kotlin.time.ExperimentalTime::class}) @kotlin.internal.InlineOnly public inline operator fun kotlin.Double.times(duration: kotlin.time.Duration): kotlin.time.Duration -@kotlin.SinceKotlin(version = "1.3") -@kotlin.time.ExperimentalTime +@kotlin.SinceKotlin(version = "1.6") +@kotlin.WasExperimental(markerClass = {kotlin.time.ExperimentalTime::class}) @kotlin.internal.InlineOnly public inline operator fun kotlin.Int.times(duration: kotlin.time.Duration): kotlin.time.Duration -@kotlin.SinceKotlin(version = "1.3") -@kotlin.time.ExperimentalTime +@kotlin.SinceKotlin(version = "1.6") +@kotlin.WasExperimental(markerClass = {kotlin.time.ExperimentalTime::class}) public fun kotlin.Double.toDuration(unit: kotlin.time.DurationUnit): kotlin.time.Duration -@kotlin.SinceKotlin(version = "1.3") -@kotlin.time.ExperimentalTime +@kotlin.SinceKotlin(version = "1.6") +@kotlin.WasExperimental(markerClass = {kotlin.time.ExperimentalTime::class}) public fun kotlin.Int.toDuration(unit: kotlin.time.DurationUnit): kotlin.time.Duration -@kotlin.SinceKotlin(version = "1.3") -@kotlin.time.ExperimentalTime +@kotlin.SinceKotlin(version = "1.6") +@kotlin.WasExperimental(markerClass = {kotlin.time.ExperimentalTime::class}) public fun kotlin.Long.toDuration(unit: kotlin.time.DurationUnit): kotlin.time.Duration @kotlin.SinceKotlin(version = "1.3") @@ -177,8 +177,8 @@ public abstract class AbstractLongTimeSource : kotlin.time.TimeSource { protected abstract fun read(): kotlin.Long } -@kotlin.SinceKotlin(version = "1.3") -@kotlin.time.ExperimentalTime +@kotlin.SinceKotlin(version = "1.6") +@kotlin.WasExperimental(markerClass = {kotlin.time.ExperimentalTime::class}) @kotlin.jvm.JvmInline public final inline class Duration : kotlin.Comparable { public final val absoluteValue: kotlin.time.Duration { get; } @@ -204,25 +204,18 @@ public final inline class Duration : kotlin.Comparable { @kotlin.Deprecated(message = "Use inWholeSeconds property instead or convert toDouble(SECONDS) if a double value is required.", replaceWith = kotlin.ReplaceWith(expression = "toDouble(DurationUnit.SECONDS)", imports = {})) public final val inSeconds: kotlin.Double { get; } - @kotlin.SinceKotlin(version = "1.5") public final val inWholeDays: kotlin.Long { get; } - @kotlin.SinceKotlin(version = "1.5") public final val inWholeHours: kotlin.Long { get; } - @kotlin.SinceKotlin(version = "1.5") public final val inWholeMicroseconds: kotlin.Long { get; } - @kotlin.SinceKotlin(version = "1.5") public final val inWholeMilliseconds: kotlin.Long { get; } - @kotlin.SinceKotlin(version = "1.5") public final val inWholeMinutes: kotlin.Long { get; } - @kotlin.SinceKotlin(version = "1.5") public final val inWholeNanoseconds: kotlin.Long { get; } - @kotlin.SinceKotlin(version = "1.5") public final val inWholeSeconds: kotlin.Long { get; } public open override operator fun compareTo(other: kotlin.time.Duration): kotlin.Int @@ -342,16 +335,12 @@ public final inline class Duration : kotlin.Comparable { @kotlin.SinceKotlin(version = "1.5") public final fun nanoseconds(value: kotlin.Long): kotlin.time.Duration - @kotlin.SinceKotlin(version = "1.5") public final fun parse(value: kotlin.String): kotlin.time.Duration - @kotlin.SinceKotlin(version = "1.5") public final fun parseIsoString(value: kotlin.String): kotlin.time.Duration - @kotlin.SinceKotlin(version = "1.5") public final fun parseIsoStringOrNull(value: kotlin.String): kotlin.time.Duration? - @kotlin.SinceKotlin(version = "1.5") public final fun parseOrNull(value: kotlin.String): kotlin.time.Duration? @kotlin.SinceKotlin(version = "1.5") @@ -365,8 +354,8 @@ public final inline class Duration : kotlin.Comparable { } } -@kotlin.SinceKotlin(version = "1.3") -@kotlin.time.ExperimentalTime +@kotlin.SinceKotlin(version = "1.6") +@kotlin.WasExperimental(markerClass = {kotlin.time.ExperimentalTime::class}) public final enum class DurationUnit : kotlin.Enum { enum entry NANOSECONDS diff --git a/libraries/stdlib/api/js/kotlin.time.kt b/libraries/stdlib/api/js/kotlin.time.kt index b059d8e4cf9..01b5a3a8ca0 100644 --- a/libraries/stdlib/api/js/kotlin.time.kt +++ b/libraries/stdlib/api/js/kotlin.time.kt @@ -131,26 +131,26 @@ public inline fun kotlin.time.TimeSource.measureTimedValue(block: () -> T): @kotlin.Deprecated(level = DeprecationLevel.ERROR, message = "Subtracting one TimeMark from another is not a well defined operation because these time marks could have been obtained from the different time sources.") public inline operator fun kotlin.time.TimeMark.minus(other: kotlin.time.TimeMark): kotlin.time.Duration -@kotlin.SinceKotlin(version = "1.3") -@kotlin.time.ExperimentalTime +@kotlin.SinceKotlin(version = "1.6") +@kotlin.WasExperimental(markerClass = {kotlin.time.ExperimentalTime::class}) @kotlin.internal.InlineOnly public inline operator fun kotlin.Double.times(duration: kotlin.time.Duration): kotlin.time.Duration -@kotlin.SinceKotlin(version = "1.3") -@kotlin.time.ExperimentalTime +@kotlin.SinceKotlin(version = "1.6") +@kotlin.WasExperimental(markerClass = {kotlin.time.ExperimentalTime::class}) @kotlin.internal.InlineOnly public inline operator fun kotlin.Int.times(duration: kotlin.time.Duration): kotlin.time.Duration -@kotlin.SinceKotlin(version = "1.3") -@kotlin.time.ExperimentalTime +@kotlin.SinceKotlin(version = "1.6") +@kotlin.WasExperimental(markerClass = {kotlin.time.ExperimentalTime::class}) public fun kotlin.Double.toDuration(unit: kotlin.time.DurationUnit): kotlin.time.Duration -@kotlin.SinceKotlin(version = "1.3") -@kotlin.time.ExperimentalTime +@kotlin.SinceKotlin(version = "1.6") +@kotlin.WasExperimental(markerClass = {kotlin.time.ExperimentalTime::class}) public fun kotlin.Int.toDuration(unit: kotlin.time.DurationUnit): kotlin.time.Duration -@kotlin.SinceKotlin(version = "1.3") -@kotlin.time.ExperimentalTime +@kotlin.SinceKotlin(version = "1.6") +@kotlin.WasExperimental(markerClass = {kotlin.time.ExperimentalTime::class}) public fun kotlin.Long.toDuration(unit: kotlin.time.DurationUnit): kotlin.time.Duration @kotlin.SinceKotlin(version = "1.3") @@ -177,8 +177,8 @@ public abstract class AbstractLongTimeSource : kotlin.time.TimeSource { protected abstract fun read(): kotlin.Long } -@kotlin.SinceKotlin(version = "1.3") -@kotlin.time.ExperimentalTime +@kotlin.SinceKotlin(version = "1.6") +@kotlin.WasExperimental(markerClass = {kotlin.time.ExperimentalTime::class}) @kotlin.jvm.JvmInline public final inline class Duration : kotlin.Comparable { public final val absoluteValue: kotlin.time.Duration { get; } @@ -204,25 +204,18 @@ public final inline class Duration : kotlin.Comparable { @kotlin.Deprecated(message = "Use inWholeSeconds property instead or convert toDouble(SECONDS) if a double value is required.", replaceWith = kotlin.ReplaceWith(expression = "toDouble(DurationUnit.SECONDS)", imports = {})) public final val inSeconds: kotlin.Double { get; } - @kotlin.SinceKotlin(version = "1.5") public final val inWholeDays: kotlin.Long { get; } - @kotlin.SinceKotlin(version = "1.5") public final val inWholeHours: kotlin.Long { get; } - @kotlin.SinceKotlin(version = "1.5") public final val inWholeMicroseconds: kotlin.Long { get; } - @kotlin.SinceKotlin(version = "1.5") public final val inWholeMilliseconds: kotlin.Long { get; } - @kotlin.SinceKotlin(version = "1.5") public final val inWholeMinutes: kotlin.Long { get; } - @kotlin.SinceKotlin(version = "1.5") public final val inWholeNanoseconds: kotlin.Long { get; } - @kotlin.SinceKotlin(version = "1.5") public final val inWholeSeconds: kotlin.Long { get; } public open override operator fun compareTo(other: kotlin.time.Duration): kotlin.Int @@ -342,16 +335,12 @@ public final inline class Duration : kotlin.Comparable { @kotlin.SinceKotlin(version = "1.5") public final fun nanoseconds(value: kotlin.Long): kotlin.time.Duration - @kotlin.SinceKotlin(version = "1.5") public final fun parse(value: kotlin.String): kotlin.time.Duration - @kotlin.SinceKotlin(version = "1.5") public final fun parseIsoString(value: kotlin.String): kotlin.time.Duration - @kotlin.SinceKotlin(version = "1.5") public final fun parseIsoStringOrNull(value: kotlin.String): kotlin.time.Duration? - @kotlin.SinceKotlin(version = "1.5") public final fun parseOrNull(value: kotlin.String): kotlin.time.Duration? @kotlin.SinceKotlin(version = "1.5") @@ -365,8 +354,8 @@ public final inline class Duration : kotlin.Comparable { } } -@kotlin.SinceKotlin(version = "1.3") -@kotlin.time.ExperimentalTime +@kotlin.SinceKotlin(version = "1.6") +@kotlin.WasExperimental(markerClass = {kotlin.time.ExperimentalTime::class}) public final enum class DurationUnit : kotlin.Enum { enum entry NANOSECONDS diff --git a/libraries/stdlib/jdk8/src/kotlin/time/DurationConversions.kt b/libraries/stdlib/jdk8/src/kotlin/time/DurationConversions.kt index 74e203152c0..09db7341140 100644 --- a/libraries/stdlib/jdk8/src/kotlin/time/DurationConversions.kt +++ b/libraries/stdlib/jdk8/src/kotlin/time/DurationConversions.kt @@ -8,19 +8,17 @@ @file:kotlin.jvm.JvmPackageName("kotlin.time.jdk8") package kotlin.time -import java.time.* - /** * Converts [java.time.Duration][java.time.Duration] value to [kotlin.time.Duration][Duration] value. * * Durations less than 104 days are converted exactly, and durations greater than that can lose some precision * due to rounding. */ -@SinceKotlin("1.3") -@ExperimentalTime +@SinceKotlin("1.6") +@WasExperimental(ExperimentalTime::class) @kotlin.internal.InlineOnly public inline fun java.time.Duration.toKotlinDuration(): Duration = - Duration.seconds(this.seconds) + Duration.nanoseconds(this.nano) + this.seconds.toDuration(DurationUnit.SECONDS) + this.nano.toDuration(DurationUnit.NANOSECONDS) /** @@ -28,8 +26,8 @@ public inline fun java.time.Duration.toKotlinDuration(): Duration = * * Durations greater than [Long.MAX_VALUE] seconds are cut to that value. */ -@SinceKotlin("1.3") -@ExperimentalTime +@SinceKotlin("1.6") +@WasExperimental(ExperimentalTime::class) @kotlin.internal.InlineOnly public inline fun Duration.toJavaDuration(): java.time.Duration = toComponents { seconds, nanoseconds -> java.time.Duration.ofSeconds(seconds, nanoseconds.toLong()) } \ No newline at end of file diff --git a/libraries/stdlib/jdk8/test/time/DurationConversionTest.kt b/libraries/stdlib/jdk8/test/time/DurationConversionTest.kt index af0ea61f828..d5157afd443 100644 --- a/libraries/stdlib/jdk8/test/time/DurationConversionTest.kt +++ b/libraries/stdlib/jdk8/test/time/DurationConversionTest.kt @@ -3,7 +3,6 @@ * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. */ -@file:OptIn(ExperimentalTime::class) package kotlin.jdk8.time.test import kotlin.random.Random diff --git a/libraries/stdlib/js/src/kotlin/time/DurationUnit.kt b/libraries/stdlib/js/src/kotlin/time/DurationUnit.kt index 63a1338eb56..1f9d925a588 100644 --- a/libraries/stdlib/js/src/kotlin/time/DurationUnit.kt +++ b/libraries/stdlib/js/src/kotlin/time/DurationUnit.kt @@ -5,8 +5,8 @@ package kotlin.time -@SinceKotlin("1.3") -@ExperimentalTime +@SinceKotlin("1.6") +@WasExperimental(ExperimentalTime::class) public actual enum class DurationUnit(internal val scale: Double) { /** * Time unit representing one nanosecond, which is 1/1000 of a microsecond. @@ -39,7 +39,6 @@ public actual enum class DurationUnit(internal val scale: Double) { } @SinceKotlin("1.3") -@ExperimentalTime internal actual fun convertDurationUnit(value: Double, sourceUnit: DurationUnit, targetUnit: DurationUnit): Double { val sourceCompareTarget = sourceUnit.scale.compareTo(targetUnit.scale) return when { @@ -50,7 +49,6 @@ internal actual fun convertDurationUnit(value: Double, sourceUnit: DurationUnit, } @SinceKotlin("1.5") -@ExperimentalTime internal actual fun convertDurationUnitOverflow(value: Long, sourceUnit: DurationUnit, targetUnit: DurationUnit): Long { val sourceCompareTarget = sourceUnit.scale.compareTo(targetUnit.scale) return when { @@ -61,7 +59,6 @@ internal actual fun convertDurationUnitOverflow(value: Long, sourceUnit: Duratio } @SinceKotlin("1.5") -@ExperimentalTime internal actual fun convertDurationUnit(value: Long, sourceUnit: DurationUnit, targetUnit: DurationUnit): Long { val sourceCompareTarget = sourceUnit.scale.compareTo(targetUnit.scale) return when { diff --git a/libraries/stdlib/jvm/src/kotlin/time/DurationUnitJvm.kt b/libraries/stdlib/jvm/src/kotlin/time/DurationUnitJvm.kt index 8d9cfb4c5a2..58179420a1f 100644 --- a/libraries/stdlib/jvm/src/kotlin/time/DurationUnitJvm.kt +++ b/libraries/stdlib/jvm/src/kotlin/time/DurationUnitJvm.kt @@ -8,12 +8,11 @@ package kotlin.time -@SinceKotlin("1.3") -@ExperimentalTime +@SinceKotlin("1.6") +@WasExperimental(ExperimentalTime::class) public actual typealias DurationUnit = java.util.concurrent.TimeUnit @SinceKotlin("1.3") -@ExperimentalTime internal actual fun convertDurationUnit(value: Double, sourceUnit: DurationUnit, targetUnit: DurationUnit): Double { val sourceInTargets = targetUnit.convert(1, sourceUnit) if (sourceInTargets > 0) @@ -24,13 +23,11 @@ internal actual fun convertDurationUnit(value: Double, sourceUnit: DurationUnit, } @SinceKotlin("1.5") -@ExperimentalTime internal actual fun convertDurationUnitOverflow(value: Long, sourceUnit: DurationUnit, targetUnit: DurationUnit): Long { return targetUnit.convert(value, sourceUnit) } @SinceKotlin("1.5") -@ExperimentalTime internal actual fun convertDurationUnit(value: Long, sourceUnit: DurationUnit, targetUnit: DurationUnit): Long { return targetUnit.convert(value, sourceUnit) } diff --git a/libraries/stdlib/src/kotlin/time/Duration.kt b/libraries/stdlib/src/kotlin/time/Duration.kt index 3d3f97a9f03..cb60ba1e0c9 100644 --- a/libraries/stdlib/src/kotlin/time/Duration.kt +++ b/libraries/stdlib/src/kotlin/time/Duration.kt @@ -26,8 +26,8 @@ import kotlin.math.* * use the functions [toInt], [toLong], and [toDouble] * or the properties [inWholeHours], [inWholeMinutes], [inWholeSeconds], [inWholeNanoseconds], and so on. */ -@SinceKotlin("1.3") -@ExperimentalTime +@SinceKotlin("1.6") +@WasExperimental(ExperimentalTime::class) @JvmInline public value class Duration internal constructor(private val rawValue: Long) : Comparable { @@ -183,7 +183,6 @@ public value class Duration internal constructor(private val rawValue: Long) : C * @throws IllegalArgumentException if the string doesn't represent a duration in any of the supported formats. * @sample samples.time.Durations.parse */ - @SinceKotlin("1.5") public fun parse(value: String): Duration = try { parseDuration(value, strictIso = false) } catch (e: IllegalArgumentException) { @@ -196,7 +195,6 @@ public value class Duration internal constructor(private val rawValue: Long) : C * @throws IllegalArgumentException if the string doesn't represent a duration in ISO-8601 format. * @sample samples.time.Durations.parseIsoString */ - @SinceKotlin("1.5") public fun parseIsoString(value: String): Duration = try { parseDuration(value, strictIso = true) } catch (e: IllegalArgumentException) { @@ -214,7 +212,6 @@ public value class Duration internal constructor(private val rawValue: Long) : C * e.g. `10s`, `1h 30m` or `-(1h 30m)`. * @sample samples.time.Durations.parse */ - @SinceKotlin("1.5") public fun parseOrNull(value: String): Duration? = try { parseDuration(value, strictIso = false) } catch (e: IllegalArgumentException) { @@ -226,7 +223,6 @@ public value class Duration internal constructor(private val rawValue: Long) : C * or `null` if the string doesn't represent a duration in ISO-8601 format. * @sample samples.time.Durations.parseIsoString */ - @SinceKotlin("1.5") public fun parseIsoStringOrNull(value: String): Duration? = try { parseDuration(value, strictIso = true) } catch (e: IllegalArgumentException) { @@ -603,7 +599,6 @@ public value class Duration internal constructor(private val rawValue: Long) : C * * An infinite duration value is converted either to [Long.MAX_VALUE] or [Long.MIN_VALUE] depending on its sign. */ - @SinceKotlin("1.5") public val inWholeDays: Long get() = toLong(DurationUnit.DAYS) @@ -612,7 +607,6 @@ public value class Duration internal constructor(private val rawValue: Long) : C * * An infinite duration value is converted either to [Long.MAX_VALUE] or [Long.MIN_VALUE] depending on its sign. */ - @SinceKotlin("1.5") public val inWholeHours: Long get() = toLong(DurationUnit.HOURS) @@ -621,7 +615,6 @@ public value class Duration internal constructor(private val rawValue: Long) : C * * An infinite duration value is converted either to [Long.MAX_VALUE] or [Long.MIN_VALUE] depending on its sign. */ - @SinceKotlin("1.5") public val inWholeMinutes: Long get() = toLong(DurationUnit.MINUTES) @@ -630,7 +623,6 @@ public value class Duration internal constructor(private val rawValue: Long) : C * * An infinite duration value is converted either to [Long.MAX_VALUE] or [Long.MIN_VALUE] depending on its sign. */ - @SinceKotlin("1.5") public val inWholeSeconds: Long get() = toLong(DurationUnit.SECONDS) @@ -639,7 +631,6 @@ public value class Duration internal constructor(private val rawValue: Long) : C * * An infinite duration value is converted either to [Long.MAX_VALUE] or [Long.MIN_VALUE] depending on its sign. */ - @SinceKotlin("1.5") public val inWholeMilliseconds: Long get() { return if (isInMillis() && isFinite()) value else toLong(DurationUnit.MILLISECONDS) @@ -654,7 +645,6 @@ public value class Duration internal constructor(private val rawValue: Long) : C * * An infinite duration value is converted either to [Long.MAX_VALUE] or [Long.MIN_VALUE] depending on its sign. */ - @SinceKotlin("1.5") public val inWholeMicroseconds: Long get() = toLong(DurationUnit.MICROSECONDS) @@ -667,7 +657,6 @@ public value class Duration internal constructor(private val rawValue: Long) : C * * An infinite duration value is converted either to [Long.MAX_VALUE] or [Long.MIN_VALUE] depending on its sign. */ - @SinceKotlin("1.5") public val inWholeNanoseconds: Long get() { val value = value @@ -851,8 +840,8 @@ public value class Duration internal constructor(private val rawValue: Long) : C // extension functions /** Returns a [Duration] equal to this [Int] number of the specified [unit]. */ -@SinceKotlin("1.3") -@ExperimentalTime +@SinceKotlin("1.6") +@WasExperimental(ExperimentalTime::class) public fun Int.toDuration(unit: DurationUnit): Duration { return if (unit <= DurationUnit.SECONDS) { durationOfNanos(convertDurationUnitOverflow(this.toLong(), unit, DurationUnit.NANOSECONDS)) @@ -861,8 +850,8 @@ public fun Int.toDuration(unit: DurationUnit): Duration { } /** Returns a [Duration] equal to this [Long] number of the specified [unit]. */ -@SinceKotlin("1.3") -@ExperimentalTime +@SinceKotlin("1.6") +@WasExperimental(ExperimentalTime::class) public fun Long.toDuration(unit: DurationUnit): Duration { val maxNsInUnit = convertDurationUnitOverflow(MAX_NANOS, DurationUnit.NANOSECONDS, unit) if (this in -maxNsInUnit..maxNsInUnit) { @@ -878,8 +867,8 @@ public fun Long.toDuration(unit: DurationUnit): Duration { * * @throws IllegalArgumentException if this `Double` value is `NaN`. */ -@SinceKotlin("1.3") -@ExperimentalTime +@SinceKotlin("1.6") +@WasExperimental(ExperimentalTime::class) public fun Double.toDuration(unit: DurationUnit): Duration { val valueInNs = convertDurationUnit(this, unit, DurationUnit.NANOSECONDS) require(!valueInNs.isNaN()) { "Duration value cannot be NaN." } @@ -1051,8 +1040,8 @@ public val Double.days get() = toDuration(DurationUnit.DAYS) /** Returns a duration whose value is the specified [duration] value multiplied by this number. */ -@SinceKotlin("1.3") -@ExperimentalTime +@SinceKotlin("1.6") +@WasExperimental(ExperimentalTime::class) @kotlin.internal.InlineOnly public inline operator fun Int.times(duration: Duration): Duration = duration * this @@ -1061,14 +1050,13 @@ public inline operator fun Int.times(duration: Duration): Duration = duration * * * @throws IllegalArgumentException if the operation results in a `NaN` value. */ -@SinceKotlin("1.3") -@ExperimentalTime +@SinceKotlin("1.6") +@WasExperimental(ExperimentalTime::class) @kotlin.internal.InlineOnly public inline operator fun Double.times(duration: Duration): Duration = duration * this -@ExperimentalTime private fun parseDuration(value: String, strictIso: Boolean): Duration { var length = value.length if (length == 0) throw IllegalArgumentException("The string is empty") @@ -1197,17 +1185,17 @@ private const val MAX_NANOS_IN_MILLIS = MAX_NANOS / NANOS_IN_MILLIS private fun nanosToMillis(nanos: Long): Long = nanos / NANOS_IN_MILLIS private fun millisToNanos(millis: Long): Long = millis * NANOS_IN_MILLIS -@ExperimentalTime private fun durationOfNanos(normalNanos: Long) = Duration(normalNanos shl 1) -@ExperimentalTime private fun durationOfMillis(normalMillis: Long) = Duration((normalMillis shl 1) + 1) -@ExperimentalTime private fun durationOf(normalValue: Long, unitDiscriminator: Int) = Duration((normalValue shl 1) + unitDiscriminator) -@ExperimentalTime private fun durationOfNanosNormalized(nanos: Long) = +private fun durationOfNanos(normalNanos: Long) = Duration(normalNanos shl 1) +private fun durationOfMillis(normalMillis: Long) = Duration((normalMillis shl 1) + 1) +private fun durationOf(normalValue: Long, unitDiscriminator: Int) = Duration((normalValue shl 1) + unitDiscriminator) +private fun durationOfNanosNormalized(nanos: Long) = if (nanos in -MAX_NANOS..MAX_NANOS) { durationOfNanos(nanos) } else { durationOfMillis(nanosToMillis(nanos)) } -@ExperimentalTime private fun durationOfMillisNormalized(millis: Long) = +private fun durationOfMillisNormalized(millis: Long) = if (millis in -MAX_NANOS_IN_MILLIS..MAX_NANOS_IN_MILLIS) { durationOfNanos(millisToNanos(millis)) } else { diff --git a/libraries/stdlib/src/kotlin/time/DurationUnit.kt b/libraries/stdlib/src/kotlin/time/DurationUnit.kt index 8b6af010cc9..134bb6076bd 100644 --- a/libraries/stdlib/src/kotlin/time/DurationUnit.kt +++ b/libraries/stdlib/src/kotlin/time/DurationUnit.kt @@ -14,8 +14,8 @@ package kotlin.time * * The smallest time unit is [NANOSECONDS] and the largest is [DAYS], which corresponds to exactly 24 [HOURS]. */ -@SinceKotlin("1.3") -@ExperimentalTime +@SinceKotlin("1.6") +@WasExperimental(ExperimentalTime::class) public expect enum class DurationUnit { /** * Time unit representing one nanosecond, which is 1/1000 of a microsecond. @@ -49,22 +49,18 @@ public expect enum class DurationUnit { /** Converts the given time duration [value] expressed in the specified [sourceUnit] into the specified [targetUnit]. */ @SinceKotlin("1.3") -@ExperimentalTime internal expect fun convertDurationUnit(value: Double, sourceUnit: DurationUnit, targetUnit: DurationUnit): Double // overflown result is unspecified @SinceKotlin("1.5") -@ExperimentalTime internal expect fun convertDurationUnitOverflow(value: Long, sourceUnit: DurationUnit, targetUnit: DurationUnit): Long // overflown result is coerced in the Long range boundaries @SinceKotlin("1.5") -@ExperimentalTime internal expect fun convertDurationUnit(value: Long, sourceUnit: DurationUnit, targetUnit: DurationUnit): Long @SinceKotlin("1.3") -@ExperimentalTime @Suppress("REDUNDANT_ELSE_IN_WHEN") internal fun DurationUnit.shortName(): String = when (this) { DurationUnit.NANOSECONDS -> "ns" @@ -78,7 +74,6 @@ internal fun DurationUnit.shortName(): String = when (this) { } @SinceKotlin("1.5") -@ExperimentalTime internal fun durationUnitByShortName(shortName: String): DurationUnit = when (shortName) { "ns" -> DurationUnit.NANOSECONDS "us" -> DurationUnit.MICROSECONDS @@ -91,7 +86,6 @@ internal fun durationUnitByShortName(shortName: String): DurationUnit = when (sh } @SinceKotlin("1.5") -@ExperimentalTime internal fun durationUnitByIsoChar(isoChar: Char, isTimeComponent: Boolean): DurationUnit = when { !isTimeComponent -> { diff --git a/libraries/stdlib/test/time/DurationTest.kt b/libraries/stdlib/test/time/DurationTest.kt index 6c72aeddf8c..669fc16488a 100644 --- a/libraries/stdlib/test/time/DurationTest.kt +++ b/libraries/stdlib/test/time/DurationTest.kt @@ -3,7 +3,6 @@ * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. */ -@file:OptIn(ExperimentalTime::class) @file:Suppress("INVISIBLE_MEMBER") package test.time diff --git a/libraries/stdlib/test/time/DurationUnitTest.kt b/libraries/stdlib/test/time/DurationUnitTest.kt index 63373e05088..30b6f440b23 100644 --- a/libraries/stdlib/test/time/DurationUnitTest.kt +++ b/libraries/stdlib/test/time/DurationUnitTest.kt @@ -3,7 +3,6 @@ * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. */ -@file:OptIn(ExperimentalTime::class) package test.time import kotlin.test.* diff --git a/libraries/stdlib/wasm/src/kotlin/time/DurationUnit.kt b/libraries/stdlib/wasm/src/kotlin/time/DurationUnit.kt index 668cc48ad67..882ea2eb3be 100644 --- a/libraries/stdlib/wasm/src/kotlin/time/DurationUnit.kt +++ b/libraries/stdlib/wasm/src/kotlin/time/DurationUnit.kt @@ -11,8 +11,8 @@ package kotlin.time * * The smallest time unit is [NANOSECONDS] and the largest is [DAYS], which corresponds to exactly 24 [HOURS]. */ -@SinceKotlin("1.3") -@ExperimentalTime +@SinceKotlin("1.6") +@WasExperimental(ExperimentalTime::class) public actual enum class DurationUnit { /** * Time unit representing one nanosecond, which is 1/1000 of a microsecond. @@ -46,13 +46,10 @@ public actual enum class DurationUnit { /** Converts the given time duration [value] expressed in the specified [sourceUnit] into the specified [targetUnit]. */ @SinceKotlin("1.3") -@ExperimentalTime internal actual fun convertDurationUnit(value: Double, sourceUnit: DurationUnit, targetUnit: DurationUnit): Double = TODO("Wasm stdlib: convertDurationUnit Double") @SinceKotlin("1.5") -@ExperimentalTime internal actual fun convertDurationUnitOverflow(value: Long, sourceUnit: DurationUnit, targetUnit: DurationUnit): Long = TODO("Wasm stdlib: convertDurationUnitOverflow Long") @SinceKotlin("1.5") -@ExperimentalTime internal actual fun convertDurationUnit(value: Long, sourceUnit: DurationUnit, targetUnit: DurationUnit): Long = TODO("Wasm stdlib: convertDurationUnit Long") \ No newline at end of file