From 27a405684de5654ff136629f9ceb5dccfa89a36d Mon Sep 17 00:00:00 2001 From: Marius Erath Date: Wed, 4 Feb 2026 11:02:41 +0100 Subject: [PATCH] [kotlin, gradle, kmt] KMT-2153: Add run configuration extension Add a run configuration extension that indicates compose is used with Kotlin JVM Gradle plugin. It also stores the location of the main function that will be executed by the compose gradle run tasks. GitOrigin-RevId: a58f96d599a8a7ce6a1fc97f25b8cca3f9b281f5 --- plugins/kotlin/gradle/gradle-java/BUILD.bazel | 2 + .../gradle-java/kotlin.gradle.gradle-java.iml | 1 + .../resources/kotlin.gradle.gradle-java.xml | 2 + .../ComposeJvmRunConfigurationExtension.kt | 72 +++++++++++++++++++ 4 files changed, 77 insertions(+) create mode 100644 plugins/kotlin/gradle/gradle-java/src/org/jetbrains/kotlin/idea/gradleJava/run/ComposeJvmRunConfigurationExtension.kt diff --git a/plugins/kotlin/gradle/gradle-java/BUILD.bazel b/plugins/kotlin/gradle/gradle-java/BUILD.bazel index 8ea2272d359d..1ec0be8f2eaa 100644 --- a/plugins/kotlin/gradle/gradle-java/BUILD.bazel +++ b/plugins/kotlin/gradle/gradle-java/BUILD.bazel @@ -93,6 +93,7 @@ jvm_library( "//platform/lang-api:lang", "//platform/execution", "//plugins/kotlin/base/indices", + "//platform/util/jdom", ] ) @@ -183,6 +184,7 @@ jvm_library( "//platform/lang-api:lang", "//platform/execution", "//plugins/kotlin/base/indices", + "//platform/util/jdom", ] ) ### auto-generated section `build kotlin.gradle.gradle-java` end diff --git a/plugins/kotlin/gradle/gradle-java/kotlin.gradle.gradle-java.iml b/plugins/kotlin/gradle/gradle-java/kotlin.gradle.gradle-java.iml index 0f50540ab3a5..356a1c5e7e30 100644 --- a/plugins/kotlin/gradle/gradle-java/kotlin.gradle.gradle-java.iml +++ b/plugins/kotlin/gradle/gradle-java/kotlin.gradle.gradle-java.iml @@ -95,5 +95,6 @@ + \ No newline at end of file diff --git a/plugins/kotlin/gradle/gradle-java/resources/kotlin.gradle.gradle-java.xml b/plugins/kotlin/gradle/gradle-java/resources/kotlin.gradle.gradle-java.xml index a5f541e23934..80be347a8e25 100644 --- a/plugins/kotlin/gradle/gradle-java/resources/kotlin.gradle.gradle-java.xml +++ b/plugins/kotlin/gradle/gradle-java/resources/kotlin.gradle.gradle-java.xml @@ -109,6 +109,8 @@ + + ("isComposeJvm") +private val mainFunctionClassFqnKey = Key.create("mainClassFqn") + +internal var ExternalSystemRunConfiguration.isComposeJvm: Boolean + get() = getUserData(isComposeJvmKey) == true + set(value) = putUserData(isComposeJvmKey, value) + +internal var ExternalSystemRunConfiguration.mainFunctionClassFqn: String? + get() = getUserData(mainFunctionClassFqnKey) as? String + set(value) = putUserData(mainFunctionClassFqnKey, value) + + +internal class ComposeJvmRunConfigurationExtension : + ExternalSystemReifiedRunConfigurationExtension(GradleRunConfiguration::class.java) { + + private companion object { + const val ROOT_KEY = "ComposeJvm" + const val MAIN_FUNCTION_FILE_KEY = "mainFunctionFile" + } + + override fun SettingsEditorFragmentContainer.configureFragments( + configuration: GradleRunConfiguration + ) { + // fragment will only be visible + accessible if set programmatically for this run configuration + if (!configuration.isComposeJvm) return + + addRemovableLabeledTextSettingsEditorFragment( + settingsFragmentInfo = object : LabeledSettingsFragmentInfo { + override val editorLabel: String = KotlinJavaGradleBundle.message("settings.run.configuration.compose.jvm.main.class.name") + override val settingsId: String = "compose.jvm.main.class.fragment" + override val settingsName: String = KotlinJavaGradleBundle.message("settings.run.configuration.compose.jvm.main.class.name") + override val settingsGroup: String = KotlinJavaGradleBundle.message("settings.run.configuration.compose.jvm.main.class.group") + override val settingsHint: String = KotlinJavaGradleBundle.message("settings.run.configuration.compose.jvm.main.class.hint") + override val settingsActionHint: String? = null + }, + createComponent = { JBTextField() }, + getter = { configuration.mainFunctionClassFqn }, + setter = { configuration.mainFunctionClassFqn = it ?: "" }, + default = { null }) + } + + override fun writeExternal(runConfiguration: ExternalSystemRunConfiguration, element: Element) { + super.writeExternal(runConfiguration, element) + if (!runConfiguration.isComposeJvm) return + + element.addContent(Element(ROOT_KEY).apply { + addContent(Element(MAIN_FUNCTION_FILE_KEY).apply { text = runConfiguration.mainFunctionClassFqn }) + }) + } + + override fun readExternal(runConfiguration: ExternalSystemRunConfiguration, element: Element) { + super.readExternal(runConfiguration, element) + val myElement = element.getChild(ROOT_KEY) ?: return + + runConfiguration.isComposeJvm = true + runConfiguration.mainFunctionClassFqn = myElement.getChild(MAIN_FUNCTION_FILE_KEY)?.text ?: "" + } +}