Skip to content

Commit 795e0df

Browse files
committed
Delegate to JVM implementations in parseOrNull where possible
1 parent 6aa69f8 commit 795e0df

File tree

13 files changed

+88
-12
lines changed

13 files changed

+88
-12
lines changed

core/api/kotlinx-datetime.api

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -320,6 +320,8 @@ public final class kotlinx/datetime/LocalDateJvmKt {
320320
public static final fun daysUntil (Lkotlinx/datetime/LocalDate;Lkotlinx/datetime/LocalDate;)I
321321
public static final fun minus (Lkotlinx/datetime/LocalDate;ILkotlinx/datetime/DateTimeUnit$DateBased;)Lkotlinx/datetime/LocalDate;
322322
public static final fun monthsUntil (Lkotlinx/datetime/LocalDate;Lkotlinx/datetime/LocalDate;)I
323+
public static final fun parseOrNull (Lkotlinx/datetime/LocalDate$Companion;Ljava/lang/CharSequence;Lkotlinx/datetime/format/DateTimeFormat;)Lkotlinx/datetime/LocalDate;
324+
public static synthetic fun parseOrNull$default (Lkotlinx/datetime/LocalDate$Companion;Ljava/lang/CharSequence;Lkotlinx/datetime/format/DateTimeFormat;ILjava/lang/Object;)Lkotlinx/datetime/LocalDate;
323325
public static final fun periodUntil (Lkotlinx/datetime/LocalDate;Lkotlinx/datetime/LocalDate;)Lkotlinx/datetime/DatePeriod;
324326
public static final fun plus (Lkotlinx/datetime/LocalDate;ILkotlinx/datetime/DateTimeUnit$DateBased;)Lkotlinx/datetime/LocalDate;
325327
public static final fun plus (Lkotlinx/datetime/LocalDate;JLkotlinx/datetime/DateTimeUnit$DateBased;)Lkotlinx/datetime/LocalDate;
@@ -342,8 +344,6 @@ public final class kotlinx/datetime/LocalDateKt {
342344
public static final fun minus (Lkotlinx/datetime/LocalDate;Lkotlinx/datetime/DatePeriod;)Lkotlinx/datetime/LocalDate;
343345
public static final fun minus (Lkotlinx/datetime/LocalDate;Lkotlinx/datetime/DateTimeUnit$DateBased;)Lkotlinx/datetime/LocalDate;
344346
public static final fun minus (Lkotlinx/datetime/LocalDate;Lkotlinx/datetime/LocalDate;)Lkotlinx/datetime/DatePeriod;
345-
public static final fun parseOrNull (Lkotlinx/datetime/LocalDate$Companion;Ljava/lang/CharSequence;Lkotlinx/datetime/format/DateTimeFormat;)Lkotlinx/datetime/LocalDate;
346-
public static synthetic fun parseOrNull$default (Lkotlinx/datetime/LocalDate$Companion;Ljava/lang/CharSequence;Lkotlinx/datetime/format/DateTimeFormat;ILjava/lang/Object;)Lkotlinx/datetime/LocalDate;
347347
public static final fun plus (Lkotlinx/datetime/LocalDate;ILkotlinx/datetime/DateTimeUnit$DateBased;)Lkotlinx/datetime/LocalDate;
348348
public static final fun toLocalDate (Ljava/lang/String;)Lkotlinx/datetime/LocalDate;
349349
}
@@ -552,14 +552,14 @@ public final class kotlinx/datetime/UtcOffset$Formats {
552552
public final class kotlinx/datetime/UtcOffsetJvmKt {
553553
public static final fun UtcOffset (Ljava/lang/Integer;Ljava/lang/Integer;Ljava/lang/Integer;)Lkotlinx/datetime/UtcOffset;
554554
public static synthetic fun UtcOffset$default (Ljava/lang/Integer;Ljava/lang/Integer;Ljava/lang/Integer;ILjava/lang/Object;)Lkotlinx/datetime/UtcOffset;
555+
public static final fun parseOrNull (Lkotlinx/datetime/UtcOffset$Companion;Ljava/lang/CharSequence;Lkotlinx/datetime/format/DateTimeFormat;)Lkotlinx/datetime/UtcOffset;
556+
public static synthetic fun parseOrNull$default (Lkotlinx/datetime/UtcOffset$Companion;Ljava/lang/CharSequence;Lkotlinx/datetime/format/DateTimeFormat;ILjava/lang/Object;)Lkotlinx/datetime/UtcOffset;
555557
}
556558

557559
public final class kotlinx/datetime/UtcOffsetKt {
558560
public static final fun UtcOffset ()Lkotlinx/datetime/UtcOffset;
559561
public static final fun asTimeZone (Lkotlinx/datetime/UtcOffset;)Lkotlinx/datetime/FixedOffsetTimeZone;
560562
public static final fun format (Lkotlinx/datetime/UtcOffset;Lkotlinx/datetime/format/DateTimeFormat;)Ljava/lang/String;
561-
public static final fun parseOrNull (Lkotlinx/datetime/UtcOffset$Companion;Ljava/lang/CharSequence;Lkotlinx/datetime/format/DateTimeFormat;)Lkotlinx/datetime/UtcOffset;
562-
public static synthetic fun parseOrNull$default (Lkotlinx/datetime/UtcOffset$Companion;Ljava/lang/CharSequence;Lkotlinx/datetime/format/DateTimeFormat;ILjava/lang/Object;)Lkotlinx/datetime/UtcOffset;
563563
}
564564

565565
public final class kotlinx/datetime/format/AmPmMarker : java/lang/Enum {

core/common/src/LocalDate.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -290,9 +290,9 @@ public expect class LocalDate : Comparable<LocalDate> {
290290
* @see LocalDate.parse for a version of this function that throws an exception on faulty input.
291291
* @sample kotlinx.datetime.test.samples.LocalDateSamples.parseOrNull
292292
*/
293-
public fun LocalDate.Companion.parseOrNull(
293+
public expect fun LocalDate.Companion.parseOrNull(
294294
input: CharSequence, format: DateTimeFormat<LocalDate> = getIsoDateFormat()
295-
): LocalDate? = format.parseOrNull(input)
295+
): LocalDate?
296296

297297
/**
298298
* @suppress

core/common/src/LocalDateTime.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -410,9 +410,9 @@ public expect class LocalDateTime : Comparable<LocalDateTime> {
410410
* @see LocalDateTime.parse for a version of this function that throws an exception on faulty input.
411411
* @sample kotlinx.datetime.test.samples.LocalDateTimeSamples.parseOrNull
412412
*/
413-
public fun LocalDateTime.Companion.parseOrNull(
413+
public expect fun LocalDateTime.Companion.parseOrNull(
414414
input: CharSequence, format: DateTimeFormat<LocalDateTime> = getIsoDateTimeFormat()
415-
): LocalDateTime? = format.parseOrNull(input)
415+
): LocalDateTime?
416416

417417
/**
418418
* @suppress

core/common/src/LocalTime.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -367,9 +367,9 @@ public expect class LocalTime : Comparable<LocalTime> {
367367
* @see LocalTime.parse for a version of this function that throws an exception on faulty input.
368368
* @sample kotlinx.datetime.test.samples.LocalTimeSamples.parseOrNull
369369
*/
370-
public fun LocalTime.Companion.parseOrNull(
370+
public expect fun LocalTime.Companion.parseOrNull(
371371
input: CharSequence, format: DateTimeFormat<LocalTime> = getIsoTimeFormat()
372-
): LocalTime? = format.parseOrNull(input)
372+
): LocalTime?
373373

374374
/**
375375
* Formats this value using the given [format].

core/common/src/UtcOffset.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -206,9 +206,9 @@ public expect class UtcOffset {
206206
* @see UtcOffset.parse for a version of this function that throws an exception on faulty input.
207207
* @sample kotlinx.datetime.test.samples.UtcOffsetSamples.parseOrNull
208208
*/
209-
public fun UtcOffset.Companion.parseOrNull(
209+
public expect fun UtcOffset.Companion.parseOrNull(
210210
input: CharSequence, format: DateTimeFormat<UtcOffset> = getIsoUtcOffsetFormat()
211-
): UtcOffset? = format.parseOrNull(input)
211+
): UtcOffset?
212212

213213
/**
214214
* Formats this value using the given [format].

core/commonKotlin/src/LocalDate.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,10 @@ public actual class LocalDate actual constructor(public actual val year: Int, mo
210210
actual override fun toString(): String = format(Formats.ISO)
211211
}
212212

213+
public actual fun LocalDate.Companion.parseOrNull(
214+
input: CharSequence, format: DateTimeFormat<LocalDate>
215+
): LocalDate? = format.parseOrNull(input)
216+
213217
@Deprecated("Use the plus overload with an explicit number of units", ReplaceWith("this.plus(1, unit)"))
214218
public actual fun LocalDate.plus(unit: DateTimeUnit.DateBased): LocalDate = plus(1, unit)
215219

core/commonKotlin/src/LocalDateTime.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,10 @@ public actual constructor(public actual val date: LocalDate, public actual val t
8484
}
8585
}
8686

87+
public actual fun LocalDateTime.Companion.parseOrNull(
88+
input: CharSequence, format: DateTimeFormat<LocalDateTime>
89+
): LocalDateTime? = format.parseOrNull(input)
90+
8791
// org.threeten.bp.LocalDateTime#until
8892
internal fun LocalDateTime.until(other: LocalDateTime, unit: DateTimeUnit.DateBased): Long {
8993
var endDate: LocalDate = other.date

core/commonKotlin/src/LocalTime.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,10 @@ public actual class LocalTime actual constructor(
136136

137137
}
138138

139+
public actual fun LocalTime.Companion.parseOrNull(
140+
input: CharSequence, format: DateTimeFormat<LocalTime>
141+
): LocalTime? = format.parseOrNull(input)
142+
139143
internal val ISO_TIME_OPTIONAL_SECONDS_TRAILING_ZEROS by lazy {
140144
LocalTimeFormat.build {
141145
hour()

core/commonKotlin/src/UtcOffset.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,10 @@ public actual class UtcOffset private constructor(public actual val totalSeconds
9393
}
9494
}
9595

96+
public actual fun UtcOffset.Companion.parseOrNull(
97+
input: CharSequence, format: DateTimeFormat<UtcOffset>
98+
): UtcOffset? = format.parseOrNull(input)
99+
96100
@ThreadLocal
97101
private var utcOffsetCache: MutableMap<Int, UtcOffset> = mutableMapOf()
98102

core/jvm/src/LocalDate.kt

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
@file:JvmName("LocalDateJvmKt")
66
package kotlinx.datetime
77

8+
import kotlinx.datetime.LocalDate.Formats
89
import kotlinx.datetime.format.*
910
import kotlinx.datetime.internal.safeAdd
1011
import kotlinx.datetime.internal.safeMultiply
@@ -106,6 +107,21 @@ public actual class LocalDate internal constructor(
106107
private fun writeReplace(): Any = Ser(Ser.DATE_TAG, this)
107108
}
108109

110+
public actual fun LocalDate.Companion.parseOrNull(
111+
input: CharSequence, format: DateTimeFormat<LocalDate>
112+
): LocalDate? =
113+
if (format === Formats.ISO) {
114+
try {
115+
val sanitizedInput = removeLeadingZerosFromLongYearFormLocalDate(input.toString())
116+
jtLocalDate.parse(sanitizedInput).let(::LocalDate)
117+
} catch (_: DateTimeParseException) {
118+
null
119+
}
120+
} else {
121+
format.parseOrNull(input)
122+
}
123+
124+
109125
/**
110126
* @suppress
111127
*/

0 commit comments

Comments
 (0)