Fix regex in KotlinPluginCompatibilityVerifier to support release and milestones

This commit is contained in:
Dmitry Savvinov
2020-03-24 15:06:41 +03:00
parent dfaebf3cdb
commit cd440841a5
2 changed files with 53 additions and 18 deletions
@@ -8,11 +8,13 @@ package org.jetbrains.kotlin.idea
import com.intellij.openapi.application.ApplicationInfo
import com.intellij.openapi.ui.Messages
import com.intellij.util.PlatformUtils
import com.intellij.util.text.nullize
import org.intellij.lang.annotations.RegExp
object KotlinPluginCompatibilityVerifier {
@JvmStatic
fun checkCompatibility() {
val kotlinVersion = KotlinPluginVersion.parse(KotlinPluginUtil.getPluginVersion()) ?: return
val kotlinVersion = KotlinPluginVersion.getCurrent() ?: return
val platformVersion = PlatformVersion.getCurrent() ?: return
if (kotlinVersion.platformVersion.platform != platformVersion.platform) {
@@ -26,20 +28,38 @@ object KotlinPluginCompatibilityVerifier {
data class KotlinPluginVersion(
val kotlinVersion: String, // 1.2.3
val milestone: String?, // M1
val status: String, // release, eap, rc
val buildNumber: String, // 53
val buildNumber: String?, // 53
val platformVersion: PlatformVersion,
val patchNumber: String // usually '1'
) {
companion object {
private val KOTLIN_VERSION_REGEX = "^([\\d.]+)-([A-Za-z]+)-(\\d+)-([A-Za-z0-9.]+)-(\\d+)$".toRegex()
private const val KOTLIN_VERSION_REGEX_STRING =
"^([\\d.]+)" + // Version number, like 1.3.50
"(?:-(M\\d+))?" + // (Optional) M-release, like M2
"-([A-Za-z]+)" + // status, like 'eap/dev/release'
"(?:-(\\d+))?" + // (Optional) buildNumber (absent for 'release')
"-([A-Za-z0-9.]+)" + // Platform version, like Studio4.0.1
"-(\\d+)$" // Tooling update, like '-1'
private val KOTLIN_VERSION_REGEX = KOTLIN_VERSION_REGEX_STRING.toRegex()
fun parse(version: String): KotlinPluginVersion? {
val matchResult = KOTLIN_VERSION_REGEX.matchEntire(version) ?: return null
val (kotlinVersion, status, buildNumber, platformString, patchNumber) = matchResult.destructured
val (kotlinVersion, milestone, status, buildNumber, platformString, patchNumber) = matchResult.destructured
val platformVersion = PlatformVersion.parse(platformString) ?: return null
return KotlinPluginVersion(kotlinVersion, status, buildNumber, platformVersion, patchNumber)
return KotlinPluginVersion(
kotlinVersion,
milestone.nullize(),
status,
buildNumber.nullize(),
platformVersion,
patchNumber
)
}
fun getCurrent(): KotlinPluginVersion? = parse(KotlinPluginUtil.getPluginVersion())
}
override fun toString() = "$kotlinVersion for $platformVersion"
@@ -75,16 +95,4 @@ data class PlatformVersion(val platform: Platform, val version: String /* 3.1 or
}
override fun toString() = platform.presentableText + " " + version
}
val KotlinPluginVersion.isSnapshot: Boolean
get() = status == "SNAPSHOT"
val KotlinPluginVersion.majorVersion: String
get() = kotlinVersion.split(".").first()
val KotlinPluginVersion.minorVersion: String
get() = kotlinVersion.split(".")[1]
val KotlinPluginVersion.patchVersion: String
get() = kotlinVersion.split(".").last()
}
@@ -6,6 +6,7 @@
package org.jetbrains.kotlin.test
import com.intellij.testFramework.LightPlatformTestCase
import org.jetbrains.kotlin.idea.KotlinPluginUtil
import org.jetbrains.kotlin.idea.KotlinPluginVersion
import org.jetbrains.kotlin.idea.PlatformVersion
import org.junit.runner.RunWith
@@ -16,6 +17,7 @@ class CompatibilityVerifierVersionComparisonTest : LightPlatformTestCase() {
val version = KotlinPluginVersion.parse("1.2.40-dev-193-Studio3.0-1") ?: throw AssertionError("Version should not be null")
assertEquals("1.2.40", version.kotlinVersion)
assertNull(version.milestone)
assertEquals("dev", version.status)
assertEquals("193", version.buildNumber)
assertEquals(PlatformVersion.Platform.ANDROID_STUDIO, version.platformVersion.platform)
@@ -23,7 +25,32 @@ class CompatibilityVerifierVersionComparisonTest : LightPlatformTestCase() {
assertEquals("1", version.patchNumber)
}
fun testReleaseVersionDoesntHaveBuildNumber() {
val version = KotlinPluginVersion.parse("1.2.40-release-Studio3.0-1") ?: throw AssertionError("Version should not be null")
assertNull(version.buildNumber)
}
fun testMilestoneVersion() {
val version = KotlinPluginVersion.parse("1.4-M1-eap-27-IJ2020.1-1") ?: throw AssertionError("Version should not be null")
assertEquals("1.4", version.kotlinVersion)
assertEquals("M1", version.milestone)
assertEquals("eap", version.status)
assertEquals("27", version.buildNumber)
assertEquals(PlatformVersion.Platform.IDEA, version.platformVersion.platform)
assertEquals("2020.1", version.platformVersion.version)
assertEquals("1", version.patchNumber)
}
fun testPlatformVersionParsing() {
PlatformVersion.getCurrent() ?: throw AssertionError("Version should not be null")
}
fun testCurrentPluginVersionParsing() {
val pluginVersion = KotlinPluginUtil.getPluginVersion()
if (pluginVersion == "@snapshot@") return
assertNotNull("Can not parse current Kotlin Plugin version: $pluginVersion", KotlinPluginVersion.getCurrent())
}
}