[kotlin-tooling-core] KotlinToolingVersionOrNull: return null on bad classifier argument

^KT-54301 Verification Pending
This commit is contained in:
Sebastian Sellmair
2022-10-04 19:48:31 +02:00
committed by Space Team
parent 760f89efd3
commit cda28da09d
2 changed files with 26 additions and 16 deletions
@@ -11,8 +11,20 @@ import java.io.Serializable
import java.util.* import java.util.*
fun KotlinToolingVersion(kotlinVersionString: String): KotlinToolingVersion { fun KotlinToolingVersion(kotlinVersionString: String): KotlinToolingVersion {
return KotlinToolingVersionOrNull(kotlinVersionString) fun throwInvalid(reason: String): Nothing = throw IllegalArgumentException("Invalid Kotlin version: $kotlinVersionString ($reason)")
?: 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("Expected 2 or 3 '.' separated parts")
return KotlinToolingVersion(
major = baseVersionSplit[0].toIntOrNull() ?: throwInvalid("Failed parsing major version"),
minor = baseVersionSplit[1].toIntOrNull() ?: throwInvalid("Failed parsing minor version"),
patch = baseVersionSplit.getOrNull(2)?.let { it.toIntOrNull() ?: throwInvalid("Failed parsing patch version") } ?: 0,
classifier = classifier
)
} }
fun KotlinToolingVersion(kotlinVersion: KotlinVersion, classifier: String? = null): KotlinToolingVersion { fun KotlinToolingVersion(kotlinVersion: KotlinVersion, classifier: String? = null): KotlinToolingVersion {
@@ -20,18 +32,11 @@ fun KotlinToolingVersion(kotlinVersion: KotlinVersion, classifier: String? = nul
} }
fun KotlinToolingVersionOrNull(kotlinVersionString: String): KotlinToolingVersion? { fun KotlinToolingVersionOrNull(kotlinVersionString: String): KotlinToolingVersion? {
val baseVersion = kotlinVersionString.split("-", limit = 2)[0] return try {
val classifier = kotlinVersionString.split("-", limit = 2).getOrNull(1) KotlinToolingVersion(kotlinVersionString)
} catch (t: IllegalArgumentException) {
val baseVersionSplit = baseVersion.split(".") null
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( class KotlinToolingVersion(
@@ -222,7 +222,7 @@ class KotlinToolingVersionTest {
assertBuildNumber(510, "1.6.20-pub-myWildcard1-510") assertBuildNumber(510, "1.6.20-pub-myWildcard1-510")
assertBuildNumber(510, "1.6.20-some-510") assertBuildNumber(510, "1.6.20-some-510")
assertBuildNumber(510, "1.6.20-aaa-a2-a3-510") assertBuildNumber(510, "1.6.20-aaa-a2-a3-510")
assertBuildNumber(null,"1.6.20-dev-myWildcard510") assertBuildNumber(null, "1.6.20-dev-myWildcard510")
/* dev with - in wildcards */ /* dev with - in wildcards */
assertBuildNumber(510, "1.6.20-dev-google-pr-510") assertBuildNumber(510, "1.6.20-dev-google-pr-510")
@@ -314,8 +314,10 @@ class KotlinToolingVersionTest {
fun illegalVersionString() { fun illegalVersionString() {
assertFailsWith<IllegalArgumentException> { KotlinToolingVersion("x") } assertFailsWith<IllegalArgumentException> { KotlinToolingVersion("x") }
assertFailsWith<IllegalArgumentException> { KotlinToolingVersion("1.6.20.1") } assertFailsWith<IllegalArgumentException> { KotlinToolingVersion("1.6.20.1") }
assertNull(KotlinToolingVersionOrNull(""))
assertNull(KotlinToolingVersionOrNull("x")) assertNull(KotlinToolingVersionOrNull("x"))
assertNull(KotlinToolingVersionOrNull("1.6.20.1")) assertNull(KotlinToolingVersionOrNull("1.6.20.1"))
assertNull(KotlinToolingVersionOrNull("1.6.20-x"))
} }
private fun assertBuildNumber(buildNumber: Int?, version: String, message: String? = null) { private fun assertBuildNumber(buildNumber: Int?, version: String, message: String? = null) {
@@ -332,7 +334,10 @@ class KotlinToolingVersionTest {
"Parsing maturity is expected to be failed for `$version`${message?.let { ". $it" } ?: ""}") { "Parsing maturity is expected to be failed for `$version`${message?.let { ". $it" } ?: ""}") {
KotlinToolingVersion(version) KotlinToolingVersion(version)
} }
assertTrue("maturity" in exception.message.orEmpty().toLowerCase(), "Expected 'maturity' issue mentioned in error message") assertTrue(
"maturity" in exception.message.orEmpty().toLowerCase(),
"Expected 'maturity' issue mentioned in error message. Found: ${exception.message}"
)
} else { } else {
assertEquals(maturity, KotlinToolingVersion(version).maturity, message) assertEquals(maturity, KotlinToolingVersion(version).maturity, message)
} }