diff --git a/idea/src/org/jetbrains/kotlin/idea/KotlinPluginCompatibilityVerifier.kt b/idea/src/org/jetbrains/kotlin/idea/KotlinPluginCompatibilityVerifier.kt index 31b6d588bde..39b5417514c 100644 --- a/idea/src/org/jetbrains/kotlin/idea/KotlinPluginCompatibilityVerifier.kt +++ b/idea/src/org/jetbrains/kotlin/idea/KotlinPluginCompatibilityVerifier.kt @@ -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() \ No newline at end of file +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/test/CompatibilityVerifierVersionComparisonTest.kt b/idea/tests/org/jetbrains/kotlin/test/CompatibilityVerifierVersionComparisonTest.kt index 0ffc3f13d8a..5fbb528f7f2 100644 --- a/idea/tests/org/jetbrains/kotlin/test/CompatibilityVerifierVersionComparisonTest.kt +++ b/idea/tests/org/jetbrains/kotlin/test/CompatibilityVerifierVersionComparisonTest.kt @@ -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()) + } } \ No newline at end of file