[kotlin] Add Module.kotlinToolingVersion in 'external-build-system'

This API is intended to be offering versions (such as the Kotlin Gradle Plugin version)

GitOrigin-RevId: 98e6c3dde132e248c8de4e227b0b00cf97f31df2
This commit is contained in:
Sebastian Sellmair
2024-09-13 17:01:08 +02:00
committed by intellij-monorepo-bot
parent 3c9dfaea46
commit db18f08a1c
4 changed files with 67 additions and 8 deletions

View File

@@ -16,5 +16,6 @@
<orderEntry type="module" module-name="intellij.platform.projectModel.impl" />
<orderEntry type="module" module-name="intellij.platform.execution" />
<orderEntry type="module" module-name="intellij.platform.externalSystem" />
<orderEntry type="library" name="kotlin-tooling-core" level="project" />
</component>
</module>

View File

@@ -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>
) : 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) }
}
}

View File

@@ -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()
}
}

View File

@@ -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)
}