Skip to content

Commit 6b0220c

Browse files
authored
Disable Compose Hot Reload for Kotlin versions less than 2.1.20 (#5476)
Fixes [CMP-9205](https://youtrack.jetbrains.com/issue/CMP-9205) ## Release Notes N/A
1 parent e9f976f commit 6b0220c

File tree

3 files changed

+33
-8
lines changed

3 files changed

+33
-8
lines changed

gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/desktop/application/internal/configureHotReload.kt

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,24 @@ package org.jetbrains.compose.desktop.application.internal
33
import org.gradle.api.Project
44
import org.jetbrains.compose.internal.KOTLIN_JVM_PLUGIN_ID
55
import org.jetbrains.compose.internal.KOTLIN_MPP_PLUGIN_ID
6+
import org.jetbrains.compose.internal.Version
67
import org.jetbrains.compose.internal.mppExt
8+
import org.jetbrains.kotlin.gradle.plugin.KotlinBasePlugin
79
import org.jetbrains.kotlin.gradle.targets.jvm.KotlinJvmTarget
810

9-
private fun Project.applyHotReload() {
11+
private const val minimalKotlinVersionForCHR = "2.1.20"
12+
13+
private const val minimalKotlinVersionForCHRWarning = "w: " +
14+
"Compose Hot Reload is disabled. To make use of it, you need to be on Kotlin $minimalKotlinVersionForCHR or higher."
15+
16+
private fun Project.applyHotReload(kgp: KotlinBasePlugin) {
17+
// check minimal kotlin version requirement
18+
val kgpVersion = kgp.pluginVersion
19+
if (Version.fromString(kgpVersion) < Version.fromString(minimalKotlinVersionForCHR)) {
20+
logger.warn(minimalKotlinVersionForCHRWarning)
21+
return
22+
}
23+
1024
// We add an explicit runtime dependency to the Compose Hot Reload Gradle plugin of a
1125
// specific preferred version (https://docs.gradle.org/current/userguide/dependency_versions.html),
1226
// so we are able to apply the plugin by id here at least of that preferred version
@@ -17,13 +31,13 @@ private fun Project.applyHotReload() {
1731

1832
fun Project.configureHotReload() {
1933
if (!ComposeProperties.disableHotReload(providers).get()) {
20-
plugins.withId(KOTLIN_MPP_PLUGIN_ID) {
21-
mppExt.targets.withType(KotlinJvmTarget::class.java) { target ->
22-
applyHotReload()
34+
plugins.withId(KOTLIN_MPP_PLUGIN_ID) { plugin ->
35+
mppExt.targets.withType(KotlinJvmTarget::class.java) {
36+
applyHotReload(plugin as KotlinBasePlugin)
2337
}
2438
}
25-
plugins.withId(KOTLIN_JVM_PLUGIN_ID) {
26-
applyHotReload()
39+
plugins.withId(KOTLIN_JVM_PLUGIN_ID) { plugin ->
40+
applyHotReload(plugin as KotlinBasePlugin)
2741
}
2842
}
2943
}

gradle-plugins/compose/src/test/kotlin/org/jetbrains/compose/test/tests/integration/HotReloadTest.kt

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import org.gradle.testkit.runner.TaskOutcome
55
import org.jetbrains.compose.ComposeBuildConfig
66
import org.jetbrains.compose.desktop.application.internal.ComposeProperties
77
import org.jetbrains.compose.test.utils.GradlePluginTestBase
8+
import org.jetbrains.compose.test.utils.TestEnvironment
89
import org.jetbrains.compose.test.utils.checks
910
import org.junit.jupiter.api.fail
1011
import org.junit.jupiter.api.Test
@@ -32,6 +33,16 @@ class HotReloadTest : GradlePluginTestBase() {
3233
}
3334
}
3435

36+
@Test
37+
fun testIncompatibleKotlin() = with(testProject("application/jvm",
38+
TestEnvironment(defaultTestEnvironment.workingDir, kotlinVersion = "2.1.0")))
39+
{
40+
gradleFailure("hotRun").checks {
41+
check.logContains("w: Compose Hot Reload is disabled")
42+
check.logContains("Task 'hotRun' not found")
43+
}
44+
}
45+
3546
@Test
3647
fun testNonJvmProject() = with(testProject("application/nonJvm")) {
3748
gradleFailure("hotRun").checks {

gradle-plugins/compose/src/test/kotlin/org/jetbrains/compose/test/tests/integration/ResourcesTest.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -327,7 +327,7 @@ class ResourcesTest : GradlePluginTestBase() {
327327
fun testAndroidAppWithResources() {
328328
//FIXME delete the filter when https://issuetracker.google.com/456657404 is fixed
329329
Assumptions.assumeFalse {
330-
currentOS == OS.Windows && defaultTestEnvironment.gradleVersion.contains("9.0.0")
330+
currentOS == OS.Windows && defaultTestEnvironment.agpVersion.contains("9.0.0")
331331
}
332332
with(testProject("misc/androidAppWithResources", defaultTestEnvironment)) {
333333
gradle(":appModule:assembleDebug").checks {
@@ -406,7 +406,7 @@ class ResourcesTest : GradlePluginTestBase() {
406406
.getConvertedResources(commonResourcesDir, repackDir)
407407

408408
//FIXME delete the filter when https://issuetracker.google.com/456657404 is fixed
409-
val skipAndroidCheck = currentOS == OS.Windows && defaultTestEnvironment.gradleVersion.contains("9.0.0")
409+
val skipAndroidCheck = currentOS == OS.Windows && defaultTestEnvironment.agpVersion.contains("9.0.0")
410410
if (!skipAndroidCheck) {
411411
gradle(":androidApp:assemble").checks {
412412
check.taskSuccessful(":sharedUI:copyAndroidMainComposeResourcesToAndroidAssets")

0 commit comments

Comments
 (0)