From 0059fcceb91979399152a661febaff5be519855f Mon Sep 17 00:00:00 2001 From: Dmitriy Dolovov Date: Fri, 14 Sep 2018 17:08:08 +0300 Subject: [PATCH] [K/N] Safe determining Kotlin/Native meta version --- .../org/jetbrains/kotlin/konan/KonanVersion.kt | 16 +++++++++++----- .../org/jetbrains/kotlin/konan/MetaVersion.kt | 10 +++++++++- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/konan/utils/src/org/jetbrains/kotlin/konan/KonanVersion.kt b/konan/utils/src/org/jetbrains/kotlin/konan/KonanVersion.kt index 4e34964249f..d66191c16cb 100644 --- a/konan/utils/src/org/jetbrains/kotlin/konan/KonanVersion.kt +++ b/konan/utils/src/org/jetbrains/kotlin/konan/KonanVersion.kt @@ -20,12 +20,18 @@ interface KonanVersion : Serializable { // major.minor.patch-meta-build where patch, meta and build are optional. private val versionPattern = "(\\d+)\\.(\\d+)(?:\\.(\\d+))?(?:-(\\p{Alpha}\\p{Alnum}*))?(?:-(\\d+))?".toRegex() - fun fromString(version: String) : KonanVersion { + fun fromString(version: String): KonanVersion { val (major, minor, maintenance, metaString, build) = - versionPattern.matchEntire(version)?.destructured ?: - throw IllegalArgumentException("Cannot parse Kotlin/Native version: $version") - val meta = metaString.ifEmpty { "release" }.let { MetaVersion.valueOf(it.toUpperCase()) } - return KonanVersionImpl(meta, major.toInt(), minor.toInt(), maintenance.toIntOrNull() ?: 0, build.toIntOrNull() ?: -1) + versionPattern.matchEntire(version)?.destructured + ?: throw IllegalArgumentException("Cannot parse Kotlin/Native version: $version") + + return KonanVersionImpl( + MetaVersion.findAppropriate(metaString), + major.toInt(), + minor.toInt(), + maintenance.toIntOrNull() ?: 0, + build.toIntOrNull() ?: -1 + ) } } } diff --git a/konan/utils/src/org/jetbrains/kotlin/konan/MetaVersion.kt b/konan/utils/src/org/jetbrains/kotlin/konan/MetaVersion.kt index 204f03b220d..ec19bddcd04 100644 --- a/konan/utils/src/org/jetbrains/kotlin/konan/MetaVersion.kt +++ b/konan/utils/src/org/jetbrains/kotlin/konan/MetaVersion.kt @@ -17,5 +17,13 @@ enum class MetaVersion(val metaString: String) { BETA("beta"), RC1("rc1"), RC2("rc2"), - RELEASE("release") + RELEASE("release"); + + companion object { + + fun findAppropriate(metaString: String): MetaVersion { + return MetaVersion.values().find { it.metaString.equals(metaString, ignoreCase = true) } + ?: if (metaString.isBlank()) RELEASE else error("Unknown meta version: $metaString") + } + } }