Skip to content

Commit cb57417

Browse files
committed
Delegate to JVM implementations in parseOrNull where possible
1 parent 89d2352 commit cb57417

File tree

13 files changed

+86
-12
lines changed

13 files changed

+86
-12
lines changed

core/api/kotlinx-datetime.api

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -358,6 +358,8 @@ public final class kotlinx/datetime/LocalDateJvmKt {
358358
public static final fun daysUntil (Lkotlinx/datetime/LocalDate;Lkotlinx/datetime/LocalDate;)I
359359
public static final fun minus (Lkotlinx/datetime/LocalDate;ILkotlinx/datetime/DateTimeUnit$DateBased;)Lkotlinx/datetime/LocalDate;
360360
public static final fun monthsUntil (Lkotlinx/datetime/LocalDate;Lkotlinx/datetime/LocalDate;)I
361+
public static final fun parseOrNull (Lkotlinx/datetime/LocalDate$Companion;Ljava/lang/CharSequence;Lkotlinx/datetime/format/DateTimeFormat;)Lkotlinx/datetime/LocalDate;
362+
public static synthetic fun parseOrNull$default (Lkotlinx/datetime/LocalDate$Companion;Ljava/lang/CharSequence;Lkotlinx/datetime/format/DateTimeFormat;ILjava/lang/Object;)Lkotlinx/datetime/LocalDate;
361363
public static final fun periodUntil (Lkotlinx/datetime/LocalDate;Lkotlinx/datetime/LocalDate;)Lkotlinx/datetime/DatePeriod;
362364
public static final fun plus (Lkotlinx/datetime/LocalDate;ILkotlinx/datetime/DateTimeUnit$DateBased;)Lkotlinx/datetime/LocalDate;
363365
public static final fun plus (Lkotlinx/datetime/LocalDate;JLkotlinx/datetime/DateTimeUnit$DateBased;)Lkotlinx/datetime/LocalDate;
@@ -380,8 +382,6 @@ public final class kotlinx/datetime/LocalDateKt {
380382
public static final fun minus (Lkotlinx/datetime/LocalDate;Lkotlinx/datetime/DatePeriod;)Lkotlinx/datetime/LocalDate;
381383
public static final fun minus (Lkotlinx/datetime/LocalDate;Lkotlinx/datetime/DateTimeUnit$DateBased;)Lkotlinx/datetime/LocalDate;
382384
public static final fun minus (Lkotlinx/datetime/LocalDate;Lkotlinx/datetime/LocalDate;)Lkotlinx/datetime/DatePeriod;
383-
public static final fun parseOrNull (Lkotlinx/datetime/LocalDate$Companion;Ljava/lang/CharSequence;Lkotlinx/datetime/format/DateTimeFormat;)Lkotlinx/datetime/LocalDate;
384-
public static synthetic fun parseOrNull$default (Lkotlinx/datetime/LocalDate$Companion;Ljava/lang/CharSequence;Lkotlinx/datetime/format/DateTimeFormat;ILjava/lang/Object;)Lkotlinx/datetime/LocalDate;
385385
public static final fun plus (Lkotlinx/datetime/LocalDate;ILkotlinx/datetime/DateTimeUnit$DateBased;)Lkotlinx/datetime/LocalDate;
386386
public static final fun toLocalDate (Ljava/lang/String;)Lkotlinx/datetime/LocalDate;
387387
}
@@ -670,14 +670,14 @@ public final class kotlinx/datetime/UtcOffset$Formats {
670670
public final class kotlinx/datetime/UtcOffsetJvmKt {
671671
public static final fun UtcOffset (Ljava/lang/Integer;Ljava/lang/Integer;Ljava/lang/Integer;)Lkotlinx/datetime/UtcOffset;
672672
public static synthetic fun UtcOffset$default (Ljava/lang/Integer;Ljava/lang/Integer;Ljava/lang/Integer;ILjava/lang/Object;)Lkotlinx/datetime/UtcOffset;
673+
public static final fun parseOrNull (Lkotlinx/datetime/UtcOffset$Companion;Ljava/lang/CharSequence;Lkotlinx/datetime/format/DateTimeFormat;)Lkotlinx/datetime/UtcOffset;
674+
public static synthetic fun parseOrNull$default (Lkotlinx/datetime/UtcOffset$Companion;Ljava/lang/CharSequence;Lkotlinx/datetime/format/DateTimeFormat;ILjava/lang/Object;)Lkotlinx/datetime/UtcOffset;
673675
}
674676

675677
public final class kotlinx/datetime/UtcOffsetKt {
676678
public static final fun UtcOffset ()Lkotlinx/datetime/UtcOffset;
677679
public static final fun asTimeZone (Lkotlinx/datetime/UtcOffset;)Lkotlinx/datetime/FixedOffsetTimeZone;
678680
public static final fun format (Lkotlinx/datetime/UtcOffset;Lkotlinx/datetime/format/DateTimeFormat;)Ljava/lang/String;
679-
public static final fun parseOrNull (Lkotlinx/datetime/UtcOffset$Companion;Ljava/lang/CharSequence;Lkotlinx/datetime/format/DateTimeFormat;)Lkotlinx/datetime/UtcOffset;
680-
public static synthetic fun parseOrNull$default (Lkotlinx/datetime/UtcOffset$Companion;Ljava/lang/CharSequence;Lkotlinx/datetime/format/DateTimeFormat;ILjava/lang/Object;)Lkotlinx/datetime/UtcOffset;
681681
}
682682

683683
public final class kotlinx/datetime/YearMonth : java/io/Serializable, java/lang/Comparable {

core/common/src/LocalDate.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -308,9 +308,9 @@ public expect class LocalDate : Comparable<LocalDate> {
308308
* @see LocalDate.parse for a version of this function that throws an exception on faulty input.
309309
* @sample kotlinx.datetime.test.samples.LocalDateSamples.parseOrNull
310310
*/
311-
public fun LocalDate.Companion.parseOrNull(
311+
public expect fun LocalDate.Companion.parseOrNull(
312312
input: CharSequence, format: DateTimeFormat<LocalDate> = getIsoDateFormat()
313-
): LocalDate? = format.parseOrNull(input)
313+
): LocalDate?
314314

315315
/**
316316
* @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
@@ -208,9 +208,9 @@ public expect class UtcOffset {
208208
* @see UtcOffset.parse for a version of this function that throws an exception on faulty input.
209209
* @sample kotlinx.datetime.test.samples.UtcOffsetSamples.parseOrNull
210210
*/
211-
public fun UtcOffset.Companion.parseOrNull(
211+
public expect fun UtcOffset.Companion.parseOrNull(
212212
input: CharSequence, format: DateTimeFormat<UtcOffset> = getIsoUtcOffsetFormat()
213-
): UtcOffset? = format.parseOrNull(input)
213+
): UtcOffset?
214214

215215
/**
216216
* 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
@@ -214,6 +214,10 @@ public actual class LocalDate actual constructor(public actual val year: Int, mo
214214
actual override fun toString(): String = format(Formats.ISO)
215215
}
216216

217+
public actual fun LocalDate.Companion.parseOrNull(
218+
input: CharSequence, format: DateTimeFormat<LocalDate>
219+
): LocalDate? = format.parseOrNull(input)
220+
217221
@Deprecated("Use the plus overload with an explicit number of units", ReplaceWith("this.plus(1, unit)"))
218222
public actual fun LocalDate.plus(unit: DateTimeUnit.DateBased): LocalDate = plus(1, unit)
219223

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
@@ -94,6 +94,10 @@ public actual class UtcOffset private constructor(public actual val totalSeconds
9494
}
9595
}
9696

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

core/jvm/src/LocalDate.kt

Lines changed: 15 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
@@ -117,6 +118,20 @@ public actual class LocalDate internal constructor(
117118
private fun writeReplace(): Any = Ser(Ser.DATE_TAG, this)
118119
}
119120

121+
public actual fun LocalDate.Companion.parseOrNull(
122+
input: CharSequence, format: DateTimeFormat<LocalDate>
123+
): LocalDate? =
124+
if (format === Formats.ISO) {
125+
try {
126+
val sanitizedInput = removeLeadingZerosFromLongYearFormLocalDate(input.toString())
127+
jtLocalDate.parse(sanitizedInput).let(::LocalDate)
128+
} catch (_: DateTimeParseException) {
129+
null
130+
}
131+
} else {
132+
format.parseOrNull(input)
133+
}
134+
120135
/**
121136
* @suppress
122137
*/

0 commit comments

Comments
 (0)