import com.jetbrains.plugin.structure.base.utils.isFile
import org.gradle.api.tasks.testing.logging.TestExceptionFormat
import org.jetbrains.changelog.exceptions.MissingVersionException
import org.jetbrains.intellij.platform.gradle.Constants
import org.jetbrains.intellij.platform.gradle.TestFrameworkType
import org.jetbrains.intellij.platform.gradle.tasks.PrepareSandboxTask
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
import kotlin.io.path.absolute
import kotlin.io.path.isDirectory
plugins {
alias(libs.plugins.changelog)
alias(libs.plugins.gradleIntelliJPlatform)
alias(libs.plugins.gradleJvmWrapper)
alias(libs.plugins.kotlinJvm)
id("java")
}
allprojects {
repositories {
maven("https://cache-redirector.jetbrains.com/intellij-dependencies")
mavenCentral()
}
}
repositories {
intellijPlatform {
defaultRepositories()
jetbrainsRuntime()
}
}
val pluginVersion: String by project
val untilBuildVersion: String by project
val buildConfiguration: String by project
val dotNetPluginId: String by project
val dotNetSrcDir = File(projectDir, "src/dotnet")
version = pluginVersion
val riderSdkPath by lazy {
val path = intellijPlatform.platformPath.resolve("lib/DotNetSdkForRdPlugins").absolute()
if (!path.isDirectory()) error("$path does not exist or not a directory")
println("Rider SDK path: $path")
return@lazy path
}
dependencies {
intellijPlatform {
with(file("build/rider")) {
when {
exists() -> {
logger.lifecycle("*** Using Rider SDK from local path $this")
local(this)
}
else -> {
logger.lifecycle("*** Using Rider SDK from intellij-snapshots repository")
rider(libs.versions.riderSdk, useInstaller = false)
}
}
}
jetbrainsRuntime()
testFramework(TestFrameworkType.Bundled)
}
}
intellijPlatform {
this.instrumentCode = false
this.buildSearchableOptions = false
}
kotlin {
jvmToolchain {
languageVersion = JavaLanguageVersion.of(17)
}
}
sourceSets {
main {
kotlin.srcDir("src/rider/generated/kotlin")
kotlin.srcDir("src/rider/main/kotlin")
resources.srcDir("src/rider/main/resources")
}
}
tasks {
val generateDotNetSdkProperties by registering {
val dotNetSdkGeneratedPropsFile = File(projectDir, "build/DotNetSdkPath.Generated.props")
doLast {
dotNetSdkGeneratedPropsFile.writeTextIfChanged("""
$riderSdkPath
""")
}
}
val generateNuGetConfig by registering {
val nuGetConfigFile = File(dotNetSrcDir, "nuget.config")
doLast {
nuGetConfigFile.writeTextIfChanged("""
""".trimIndent())
}
}
val rdGen = ":protocol:rdgen"
register("prepare") {
dependsOn(rdGen, generateDotNetSdkProperties, generateNuGetConfig)
}
val compileDotNet by registering {
dependsOn(rdGen, generateDotNetSdkProperties, generateNuGetConfig)
doLast {
exec {
executable(layout.projectDirectory.file("dotnet.cmd"))
args("build", "-consoleLoggerParameters:ErrorsOnly", "--configuration", buildConfiguration)
}
}
}
withType {
dependsOn(rdGen)
}
buildPlugin {
dependsOn(compileDotNet)
}
patchPluginXml {
untilBuild.set(untilBuildVersion)
val latestChangelog = try {
changelog.getUnreleased()
} catch (_: MissingVersionException) {
changelog.getLatest()
}
changeNotes.set(provider {
changelog.renderItem(
latestChangelog
.withHeader(false)
.withEmptySections(false),
org.jetbrains.changelog.Changelog.OutputType.HTML
)
})
}
withType {
dependsOn(compileDotNet)
val outputFolder = file("$dotNetSrcDir/$dotNetPluginId/bin/${dotNetPluginId}/$buildConfiguration")
val pluginFiles = listOf(
"$outputFolder/${dotNetPluginId}.dll",
"$outputFolder/${dotNetPluginId}.pdb"
)
from(pluginFiles) {
into("${rootProject.name}/dotnet")
}
doLast {
for (f in pluginFiles) {
val file = file(f)
if (!file.exists()) throw RuntimeException("File \"$file\" does not exist.")
}
}
}
withType {
classpath -= classpath.filter {
(it.name.startsWith("localization-") && it.name.endsWith(".jar")) // TODO: https://youtrack.jetbrains.com/issue/IJPL-178084/External-plugin-tests-break-due-to-localization-issues
|| it.name == "cwm-plugin.jar" // TODO: Check after 251 EAP5 release
}
useTestNG()
testLogging {
showStandardStreams = true
exceptionFormat = TestExceptionFormat.FULL
}
environment["LOCAL_ENV_RUN"] = "true"
}
val testRiderPreview by intellijPlatformTesting.testIde.registering {
version = libs.versions.riderSdkPreview
useInstaller = false
task {
enabled = libs.versions.riderSdk.get() != libs.versions.riderSdkPreview.get()
}
}
check { dependsOn(testRiderPreview.name) }
runIde {
jvmArgs("-Xmx1500m")
}
}
val riderModel: Configuration by configurations.creating {
isCanBeConsumed = true
isCanBeResolved = false
}
artifacts {
add(riderModel.name, provider {
intellijPlatform.platformPath.resolve("lib/rd/rider-model.jar").also {
check(it.isFile) {
"rider-model.jar is not found at $riderModel"
}
}
}) {
builtBy(Constants.Tasks.INITIALIZE_INTELLIJ_PLATFORM_PLUGIN)
}
}
fun File.writeTextIfChanged(content: String) {
val bytes = content.toByteArray()
if (!exists() || !readBytes().contentEquals(bytes)) {
println("Writing $path")
parentFile.mkdirs()
writeBytes(bytes)
}
}