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
*/

core/jvm/src/LocalDateTimeJvm.kt

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
@file:JvmMultifileClass
77
package kotlinx.datetime
88

9+
import kotlinx.datetime.LocalDateTime.Formats
910
import kotlinx.datetime.format.*
1011
import kotlinx.datetime.internal.removeLeadingZerosFromLongYearFormLocalDateTime
1112
import kotlinx.datetime.serializers.LocalDateTimeIso8601Serializer
@@ -115,6 +116,20 @@ public actual class LocalDateTime internal constructor(
115116
private fun writeReplace(): Any = Ser(Ser.DATE_TIME_TAG, this)
116117
}
117118

119+
public actual fun LocalDateTime.Companion.parseOrNull(
120+
input: CharSequence, format: DateTimeFormat<LocalDateTime>
121+
): LocalDateTime? =
122+
if (format === Formats.ISO) {
123+
try {
124+
val sanitizedInput = removeLeadingZerosFromLongYearFormLocalDateTime(input.toString())
125+
jtLocalDateTime.parse(sanitizedInput).let(::LocalDateTime)
126+
} catch (_: DateTimeParseException) {
127+
null
128+
}
129+
} else {
130+
format.parseOrNull(input)
131+
}
132+
118133
/**
119134
* @suppress
120135
*/

core/jvm/src/LocalTimeJvm.kt

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
package kotlinx.datetime
99

10+
import kotlinx.datetime.LocalTime.Formats
1011
import kotlinx.datetime.format.*
1112
import kotlinx.datetime.internal.*
1213
import kotlinx.datetime.serializers.LocalTimeIso8601Serializer
@@ -95,6 +96,18 @@ public actual class LocalTime internal constructor(
9596
private fun writeReplace(): Any = Ser(Ser.TIME_TAG, this)
9697
}
9798

99+
public actual fun LocalTime.Companion.parseOrNull(input: CharSequence, format: DateTimeFormat<LocalTime>): LocalTime? =
100+
if (format === Formats.ISO) {
101+
try {
102+
jtLocalTime.parse(input).let(::LocalTime)
103+
} catch (_: DateTimeParseException) {
104+
null
105+
}
106+
} else {
107+
format.parseOrNull(input)
108+
}
109+
110+
98111
@Deprecated(
99112
"Use kotlinx.datetime.Month",
100113
ReplaceWith("atDate(year, month.toKotlinMonth(), dayOfMonth)")

core/jvm/src/UtcOffsetJvm.kt

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
package kotlinx.datetime
77

8+
import kotlinx.datetime.UtcOffset.Formats
89
import kotlinx.datetime.format.*
910
import kotlinx.datetime.serializers.UtcOffsetSerializer
1011
import kotlinx.serialization.Serializable
@@ -66,6 +67,15 @@ public actual fun UtcOffset(hours: Int? = null, minutes: Int? = null, seconds: I
6667
throw IllegalArgumentException(e)
6768
}
6869

70+
public actual fun UtcOffset.Companion.parseOrNull(
71+
input: CharSequence, format: DateTimeFormat<UtcOffset>
72+
): UtcOffset? = when {
73+
format === Formats.ISO -> parseWithFormatOrNull(input, isoFormat)
74+
format === Formats.ISO_BASIC -> parseWithFormatOrNull(input, isoBasicFormat)
75+
format === Formats.FOUR_DIGITS -> parseWithFormatOrNull(input, fourDigitsFormat)
76+
else -> format.parseOrNull(input)
77+
}
78+
6979
private val isoFormat by lazy {
7080
DateTimeFormatterBuilder().parseCaseInsensitive().appendOffsetId().toFormatter()
7181
}
@@ -81,3 +91,9 @@ private fun parseWithFormat(input: CharSequence, format: DateTimeFormatter) = tr
8191
} catch (e: DateTimeException) {
8292
throw DateTimeFormatException(e)
8393
}
94+
95+
private fun parseWithFormatOrNull(input: CharSequence, format: DateTimeFormatter) = try {
96+
format.parse(input, ZoneOffset::from).let(::UtcOffset)
97+
} catch (_: DateTimeException) {
98+
null
99+
}

0 commit comments

Comments
 (0)