From d7bfa02bb3e4225baeb0dd6181cb458b6f057bf0 Mon Sep 17 00:00:00 2001 From: "sebastian.sellmair" Date: Wed, 18 May 2022 14:37:53 +0200 Subject: [PATCH] [tooling-core] Add KotlinToolingVersionOrNull factory function --- .../kotlin-tooling-core.txt | 1 + .../tooling/core/KotlinToolingVersion.kt | 35 ++++++++++--------- .../tooling/core/KotlinToolingVersionTest.kt | 13 ++++--- 3 files changed, 29 insertions(+), 20 deletions(-) diff --git a/libraries/tools/binary-compatibility-validator/reference-public-api/kotlin-tooling-core.txt b/libraries/tools/binary-compatibility-validator/reference-public-api/kotlin-tooling-core.txt index 8704b422bae..8582e796e37 100644 --- a/libraries/tools/binary-compatibility-validator/reference-public-api/kotlin-tooling-core.txt +++ b/libraries/tools/binary-compatibility-validator/reference-public-api/kotlin-tooling-core.txt @@ -35,6 +35,7 @@ public final class org/jetbrains/kotlin/tooling/core/KotlinToolingVersionKt { public static final fun KotlinToolingVersion (Ljava/lang/String;)Lorg/jetbrains/kotlin/tooling/core/KotlinToolingVersion; public static final fun KotlinToolingVersion (Lkotlin/KotlinVersion;Ljava/lang/String;)Lorg/jetbrains/kotlin/tooling/core/KotlinToolingVersion; public static synthetic fun KotlinToolingVersion$default (Lkotlin/KotlinVersion;Ljava/lang/String;ILjava/lang/Object;)Lorg/jetbrains/kotlin/tooling/core/KotlinToolingVersion; + public static final fun KotlinToolingVersionOrNull (Ljava/lang/String;)Lorg/jetbrains/kotlin/tooling/core/KotlinToolingVersion; public static final fun compareTo (Ljava/lang/String;Lorg/jetbrains/kotlin/tooling/core/KotlinToolingVersion;)I public static final fun compareTo (Lorg/jetbrains/kotlin/tooling/core/KotlinToolingVersion;Ljava/lang/String;)I public static final fun getBuildNumber (Lorg/jetbrains/kotlin/tooling/core/KotlinToolingVersion;)Ljava/lang/Integer; diff --git a/libraries/tools/kotlin-tooling-core/src/main/kotlin/org/jetbrains/kotlin/tooling/core/KotlinToolingVersion.kt b/libraries/tools/kotlin-tooling-core/src/main/kotlin/org/jetbrains/kotlin/tooling/core/KotlinToolingVersion.kt index ede46af879d..5ea2e78a1c0 100644 --- a/libraries/tools/kotlin-tooling-core/src/main/kotlin/org/jetbrains/kotlin/tooling/core/KotlinToolingVersion.kt +++ b/libraries/tools/kotlin-tooling-core/src/main/kotlin/org/jetbrains/kotlin/tooling/core/KotlinToolingVersion.kt @@ -3,34 +3,37 @@ * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. */ +@file:Suppress("FunctionName") + package org.jetbrains.kotlin.tooling.core import java.io.Serializable import java.util.* fun KotlinToolingVersion(kotlinVersionString: String): KotlinToolingVersion { - fun throwInvalid(): Nothing { - throw IllegalArgumentException("Invalid Kotlin version: $kotlinVersionString") - } - - val baseVersion = kotlinVersionString.split("-", limit = 2)[0] - val classifier = kotlinVersionString.split("-", limit = 2).getOrNull(1) - - val baseVersionSplit = baseVersion.split(".") - if (!(baseVersionSplit.size == 2 || baseVersionSplit.size == 3)) throwInvalid() - - return KotlinToolingVersion( - major = baseVersionSplit[0].toIntOrNull() ?: throwInvalid(), - minor = baseVersionSplit[1].toIntOrNull() ?: throwInvalid(), - patch = baseVersionSplit.getOrNull(2)?.let { it.toIntOrNull() ?: throwInvalid() } ?: 0, - classifier = classifier - ) + return KotlinToolingVersionOrNull(kotlinVersionString) + ?: throw IllegalArgumentException("Invalid Kotlin version: $kotlinVersionString") } fun KotlinToolingVersion(kotlinVersion: KotlinVersion, classifier: String? = null): KotlinToolingVersion { return KotlinToolingVersion(kotlinVersion.major, kotlinVersion.minor, kotlinVersion.patch, classifier) } +fun KotlinToolingVersionOrNull(kotlinVersionString: String): KotlinToolingVersion? { + val baseVersion = kotlinVersionString.split("-", limit = 2)[0] + val classifier = kotlinVersionString.split("-", limit = 2).getOrNull(1) + + val baseVersionSplit = baseVersion.split(".") + if (!(baseVersionSplit.size == 2 || baseVersionSplit.size == 3)) return null + + return KotlinToolingVersion( + major = baseVersionSplit[0].toIntOrNull() ?: return null, + minor = baseVersionSplit[1].toIntOrNull() ?: return null, + patch = baseVersionSplit.getOrNull(2)?.let { it.toIntOrNull() ?: return null } ?: 0, + classifier = classifier + ) +} + class KotlinToolingVersion( val major: Int, val minor: Int, diff --git a/libraries/tools/kotlin-tooling-core/src/test/kotlin/org/jetbrains/kotlin/tooling/core/KotlinToolingVersionTest.kt b/libraries/tools/kotlin-tooling-core/src/test/kotlin/org/jetbrains/kotlin/tooling/core/KotlinToolingVersionTest.kt index fc3cacf1800..0a43b4dcd4b 100644 --- a/libraries/tools/kotlin-tooling-core/src/test/kotlin/org/jetbrains/kotlin/tooling/core/KotlinToolingVersionTest.kt +++ b/libraries/tools/kotlin-tooling-core/src/test/kotlin/org/jetbrains/kotlin/tooling/core/KotlinToolingVersionTest.kt @@ -6,10 +6,7 @@ package org.jetbrains.kotlin.tooling.core import org.junit.Test -import kotlin.test.assertEquals -import kotlin.test.assertFailsWith -import kotlin.test.assertFalse -import kotlin.test.assertTrue +import kotlin.test.* class KotlinToolingVersionTest { @@ -311,4 +308,12 @@ class KotlinToolingVersionTest { KotlinToolingVersion("1.7.0-snapshot").isSnapshot ) } + + @Test + fun illegalVersionString() { + assertFailsWith { KotlinToolingVersion("x") } + assertFailsWith { KotlinToolingVersion("1.6.20.1") } + assertNull(KotlinToolingVersionOrNull("x")) + assertNull(KotlinToolingVersionOrNull("1.6.20.1")) + } }