diff --git a/plugins/kotlin/base/external-build-system/kotlin.base.external-build-system.iml b/plugins/kotlin/base/external-build-system/kotlin.base.external-build-system.iml index 897100571d1f..e40d8029f650 100644 --- a/plugins/kotlin/base/external-build-system/kotlin.base.external-build-system.iml +++ b/plugins/kotlin/base/external-build-system/kotlin.base.external-build-system.iml @@ -16,5 +16,6 @@ + \ No newline at end of file diff --git a/plugins/kotlin/base/external-build-system/src/org/jetbrains/kotlin/idea/base/externalSystem/KotlinBuildSystemFacade.kt b/plugins/kotlin/base/external-build-system/src/org/jetbrains/kotlin/idea/base/externalSystem/KotlinBuildSystemFacade.kt index 343dd935872a..00414756b64c 100644 --- a/plugins/kotlin/base/external-build-system/src/org/jetbrains/kotlin/idea/base/externalSystem/KotlinBuildSystemFacade.kt +++ b/plugins/kotlin/base/external-build-system/src/org/jetbrains/kotlin/idea/base/externalSystem/KotlinBuildSystemFacade.kt @@ -4,6 +4,7 @@ package org.jetbrains.kotlin.idea.base.externalSystem import com.intellij.openapi.extensions.ExtensionPointName import com.intellij.openapi.module.Module import com.intellij.openapi.util.IntellijInternalApi +import org.jetbrains.kotlin.tooling.core.KotlinToolingVersion /** * Intended to provide build system specific information about a given project, which is not relevant @@ -15,6 +16,11 @@ import com.intellij.openapi.util.IntellijInternalApi interface KotlinBuildSystemFacade { fun findSourceSet(module: Module): KotlinBuildSystemSourceSet? + /** + * See [Module.kotlinToolingVersion] + */ + fun getKotlinToolingVersion(module: Module): KotlinToolingVersion? + companion object { @JvmStatic @@ -26,10 +32,54 @@ interface KotlinBuildSystemFacade { } } +/** + * Returns the Kotlin Tooling Version as imported by an external system (such as Gradle) + * + * ## e.g., Gradle + * ```kotlin + * //build.gradle.kts + * + * plugins { + * kotlin("jvm") version "2.0.20-Beta01" + * } + * ``` + * + * Will return "2.0.20-Beta01" as + * - major: 2 + * - minor: 0 + * - patch: 20 + * - classifier: "Beta01" + * - toString: "2.0.20-Beta01" + * + * See [kotlinToolingVersion]. + * + * + * Example Usage + * ```kotlin + * fun example(module: Module) { + * val version = module.kotlinToolingVersion ?: return + * if(version >= "1.9.20-Beta01") { + * // Code + * } + * + * if(version >= KotlinToolingVersion(1, 9, 20, "Beta01")) { + * // Code + * } + * } + * ``` + */ +val Module.kotlinToolingVersion: KotlinToolingVersion? + get() = KotlinBuildSystemFacade.getInstance().getKotlinToolingVersion(this) + + private class KotlinBuildSystemCompositeFacade( private val instances: List ) : KotlinBuildSystemFacade { override fun findSourceSet(module: Module): KotlinBuildSystemSourceSet? { return instances.firstNotNullOfOrNull { instance -> instance.findSourceSet(module) } } + + override fun getKotlinToolingVersion(module: Module): KotlinToolingVersion? { + return instances.firstNotNullOfOrNull { instance -> instance.getKotlinToolingVersion(module) } + } } \ No newline at end of file diff --git a/plugins/kotlin/gradle/gradle-java/src/org/jetbrains/kotlin/idea/gradleJava/KotlinGradleBuildSystemFacade.kt b/plugins/kotlin/gradle/gradle-java/src/org/jetbrains/kotlin/idea/gradleJava/KotlinGradleBuildSystemFacade.kt index 6a9589200aa5..f83c8a7000f7 100644 --- a/plugins/kotlin/gradle/gradle-java/src/org/jetbrains/kotlin/idea/gradleJava/KotlinGradleBuildSystemFacade.kt +++ b/plugins/kotlin/gradle/gradle-java/src/org/jetbrains/kotlin/idea/gradleJava/KotlinGradleBuildSystemFacade.kt @@ -5,8 +5,10 @@ import com.intellij.openapi.module.Module import org.jetbrains.kotlin.idea.base.externalSystem.KotlinBuildSystemFacade import org.jetbrains.kotlin.idea.base.externalSystem.KotlinBuildSystemSourceSet import org.jetbrains.kotlin.idea.gradle.configuration.kotlinSourceSetData +import org.jetbrains.kotlin.idea.gradleTooling.toKotlinToolingVersion import org.jetbrains.kotlin.idea.projectModel.KotlinCompilation import org.jetbrains.kotlin.idea.projectModel.KotlinSourceSet +import org.jetbrains.kotlin.tooling.core.KotlinToolingVersion import org.jetbrains.plugins.gradle.execution.build.CachedModuleDataFinder internal class KotlinGradleBuildSystemFacade : KotlinBuildSystemFacade { @@ -23,4 +25,8 @@ internal class KotlinGradleBuildSystemFacade : KotlinBuildSystemFacade { sourceDirectories = kotlinSourceSet.sourceDirs.map { file -> file.toPath() } ) } + + override fun getKotlinToolingVersion(module: Module): KotlinToolingVersion? { + return module.kotlinGradlePluginVersion?.toKotlinToolingVersion() + } } \ No newline at end of file diff --git a/plugins/kotlin/test-framework/test/org/jetbrains/kotlin/idea/multiplatform/multiPlatformSetup.kt b/plugins/kotlin/test-framework/test/org/jetbrains/kotlin/idea/multiplatform/multiPlatformSetup.kt index 248bd1921bc6..2298c6ed6496 100644 --- a/plugins/kotlin/test-framework/test/org/jetbrains/kotlin/idea/multiplatform/multiPlatformSetup.kt +++ b/plugins/kotlin/test-framework/test/org/jetbrains/kotlin/idea/multiplatform/multiPlatformSetup.kt @@ -5,7 +5,6 @@ package org.jetbrains.kotlin.idea.multiplatform import com.intellij.openapi.application.runReadAction import com.intellij.openapi.module.Module import com.intellij.openapi.module.StdModuleTypes -import com.intellij.openapi.observable.util.whenDisposed import com.intellij.openapi.projectRoots.ProjectJdkTable import com.intellij.openapi.util.io.FileUtil import com.intellij.openapi.vfs.LocalFileSystem @@ -18,15 +17,13 @@ import org.jetbrains.kotlin.idea.base.platforms.KotlinWasmJsLibraryKind import org.jetbrains.kotlin.idea.base.platforms.KotlinWasmWasiLibraryKind import org.jetbrains.kotlin.idea.base.plugin.artifacts.TestKotlinArtifacts import org.jetbrains.kotlin.idea.framework.KotlinSdkType -import org.jetbrains.kotlin.idea.test.AbstractMultiModuleTest -import org.jetbrains.kotlin.idea.test.ConfigLibraryUtil -import org.jetbrains.kotlin.idea.test.KotlinTestUtils -import org.jetbrains.kotlin.idea.test.PluginTestCaseBase -import org.jetbrains.kotlin.idea.test.createMultiplatformFacetM1 -import org.jetbrains.kotlin.idea.test.createMultiplatformFacetM3 +import org.jetbrains.kotlin.idea.test.* import org.jetbrains.kotlin.idea.util.application.executeWriteCommand import org.jetbrains.kotlin.idea.util.sourceRoots -import org.jetbrains.kotlin.platform.* +import org.jetbrains.kotlin.platform.CommonPlatforms +import org.jetbrains.kotlin.platform.TargetPlatform +import org.jetbrains.kotlin.platform.isCommon +import org.jetbrains.kotlin.platform.isJs import org.jetbrains.kotlin.platform.js.JsPlatforms import org.jetbrains.kotlin.platform.jvm.JvmPlatforms import org.jetbrains.kotlin.platform.jvm.isJvm @@ -37,6 +34,7 @@ import org.jetbrains.kotlin.platform.wasm.isWasmJs import org.jetbrains.kotlin.platform.wasm.isWasmWasi import org.jetbrains.kotlin.projectModel.* import org.jetbrains.kotlin.test.TestJdkKind +import org.jetbrains.kotlin.tooling.core.KotlinToolingVersion import org.jetbrains.kotlin.utils.closure import java.io.File @@ -254,6 +252,10 @@ private fun AbstractMultiModuleTest.setupKotlinBuildSystemFacade() { name = module.name, sourceDirectories = module.sourceRoots.map { it.toNioPath() } ) + + override fun getKotlinToolingVersion(module: Module): KotlinToolingVersion? { + return null + } }, testRootDisposable) }