From 593f76c11f5968d0c5fc9bb8923a300a469558a2 Mon Sep 17 00:00:00 2001 From: BoD Date: Fri, 14 Mar 2025 17:57:08 +0100 Subject: [PATCH] Used configured Gradle JVM when executing tasks --- .../ijplugin/codegen/ApolloCodegenService.kt | 9 +++++++++ .../ijplugin/gradle/DownloadSchemaAction.kt | 6 +++++- .../ijplugin/gradle/GradleToolingModelService.kt | 2 ++ .../com/apollographql/ijplugin/gradle/GradleUtil.kt | 9 --------- .../ijplugin/settings/ProjectSettingsService.kt | 9 +++++++++ .../ijplugin/settings/SettingsComponent.kt | 13 +++++++++++++ .../ijplugin/settings/SettingsConfigurable.kt | 5 +++++ .../main/resources/messages/ApolloBundle.properties | 1 + 8 files changed, 44 insertions(+), 10 deletions(-) diff --git a/intellij-plugin/src/main/kotlin/com/apollographql/ijplugin/codegen/ApolloCodegenService.kt b/intellij-plugin/src/main/kotlin/com/apollographql/ijplugin/codegen/ApolloCodegenService.kt index 6b4936b32b6..ed6217a7f6e 100644 --- a/intellij-plugin/src/main/kotlin/com/apollographql/ijplugin/codegen/ApolloCodegenService.kt +++ b/intellij-plugin/src/main/kotlin/com/apollographql/ijplugin/codegen/ApolloCodegenService.kt @@ -38,6 +38,7 @@ import org.gradle.tooling.GradleConnector import org.jetbrains.plugins.gradle.service.execution.GradleExecutionHelper import org.jetbrains.plugins.gradle.settings.GradleExecutionSettings import org.jetbrains.plugins.gradle.util.GradleConstants +import java.io.File import java.util.concurrent.Executors @Service(Service.Level.PROJECT) @@ -191,9 +192,17 @@ class ApolloCodegenService( try { val cancellationToken = gradleCodegenCancellation!!.token() connection.newBuild() + .setJavaHome(executionSettings.javaHome?.let { File(it) }) .forTasks(CODEGEN_GRADLE_TASK_NAME) .withCancellationToken(cancellationToken) .addArguments("--continuous") + .let { + if (project.projectSettingsState.automaticCodegenAdditionalGradleJvmArguments.isNotEmpty()) { + it.addJvmArguments(project.projectSettingsState.automaticCodegenAdditionalGradleJvmArguments.split(' ')) + } else { + it + } + } .addProgressListener(object : SimpleProgressListener() { override fun onSuccess() { logd("Gradle build success, marking generated source roots as dirty") diff --git a/intellij-plugin/src/main/kotlin/com/apollographql/ijplugin/gradle/DownloadSchemaAction.kt b/intellij-plugin/src/main/kotlin/com/apollographql/ijplugin/gradle/DownloadSchemaAction.kt index f472864993e..7cb6705b5ea 100644 --- a/intellij-plugin/src/main/kotlin/com/apollographql/ijplugin/gradle/DownloadSchemaAction.kt +++ b/intellij-plugin/src/main/kotlin/com/apollographql/ijplugin/gradle/DownloadSchemaAction.kt @@ -22,6 +22,7 @@ import org.gradle.tooling.model.GradleProject import org.jetbrains.plugins.gradle.service.execution.GradleExecutionHelper import org.jetbrains.plugins.gradle.settings.GradleExecutionSettings import org.jetbrains.plugins.gradle.util.GradleConstants +import java.io.File class DownloadSchemaAction : AnAction() { override fun actionPerformed(e: AnActionEvent) { @@ -55,7 +56,9 @@ private class DownloadSchemaTask(project: Project) : Task.Backgroundable( val rootGradleProject = gradleExecutionHelper.execute(rootProjectPath, executionSettings) { connection -> logd("Fetch Gradle project model") return@execute try { - connection.model(GradleProject::class.java).get() + connection.model(GradleProject::class.java) + .setJavaHome(executionSettings.javaHome?.let { File(it) }) + .get() } catch (t: Throwable) { logw(t, "Couldn't fetch Gradle project model") null @@ -83,6 +86,7 @@ private class DownloadSchemaTask(project: Project) : Task.Backgroundable( gradleExecutionHelper.execute(rootProjectPath, executionSettings) { connection -> try { connection.newBuild() + .setJavaHome(executionSettings.javaHome?.let { File(it) }) .forTasks(*allDownloadSchemaTasks.toTypedArray()) .addProgressListener(object : SimpleProgressListener() { override fun onFailure(failures: List) { diff --git a/intellij-plugin/src/main/kotlin/com/apollographql/ijplugin/gradle/GradleToolingModelService.kt b/intellij-plugin/src/main/kotlin/com/apollographql/ijplugin/gradle/GradleToolingModelService.kt index a6302664f86..cc47783bad7 100644 --- a/intellij-plugin/src/main/kotlin/com/apollographql/ijplugin/gradle/GradleToolingModelService.kt +++ b/intellij-plugin/src/main/kotlin/com/apollographql/ijplugin/gradle/GradleToolingModelService.kt @@ -167,6 +167,7 @@ class GradleToolingModelService( logd("Fetch Gradle project model") return@execute try { connection.model(GradleProject::class.java) + .setJavaHome(executionSettings.javaHome?.let { File(it) }) .withCancellationToken(gradleCancellation!!.token()) .get() } catch (t: Throwable) { @@ -191,6 +192,7 @@ class GradleToolingModelService( logd("Fetch tooling model for ${gradleProject.path}") return@execute try { connection.model(ApolloGradleToolingModel::class.java) + .setJavaHome(executionSettings.javaHome?.let { File(it) }) .withCancellationToken(gradleCancellation!!.token()) .get() .takeIf { diff --git a/intellij-plugin/src/main/kotlin/com/apollographql/ijplugin/gradle/GradleUtil.kt b/intellij-plugin/src/main/kotlin/com/apollographql/ijplugin/gradle/GradleUtil.kt index bd979061382..abbc8645d58 100644 --- a/intellij-plugin/src/main/kotlin/com/apollographql/ijplugin/gradle/GradleUtil.kt +++ b/intellij-plugin/src/main/kotlin/com/apollographql/ijplugin/gradle/GradleUtil.kt @@ -2,21 +2,12 @@ package com.apollographql.ijplugin.gradle import com.apollographql.ijplugin.util.logw import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil -import com.intellij.openapi.module.Module import com.intellij.openapi.module.ModuleManager import com.intellij.openapi.project.Project import org.gradle.tooling.model.GradleProject const val CODEGEN_GRADLE_TASK_NAME = "generateApolloSources" -fun Module.getGradleName(): String? { - val projectId = ExternalSystemApiUtil.getExternalProjectId(this) ?: return null - // "MyProject:main" -> "" - // "MyProject:MyModule:main" -> "MyModule" - // "MyProject:MyModule:MySubModule:main" -> "MyModule:MySubModule" - return projectId.split(":").drop(1).dropLast(1).joinToString(":") -} - fun Project.getGradleRootPath(): String? { val rootProjectPath = ModuleManager.getInstance(this).modules.firstNotNullOfOrNull { ExternalSystemApiUtil.getExternalRootProjectPath(it) diff --git a/intellij-plugin/src/main/kotlin/com/apollographql/ijplugin/settings/ProjectSettingsService.kt b/intellij-plugin/src/main/kotlin/com/apollographql/ijplugin/settings/ProjectSettingsService.kt index df8eb33dead..c884daace9a 100644 --- a/intellij-plugin/src/main/kotlin/com/apollographql/ijplugin/settings/ProjectSettingsService.kt +++ b/intellij-plugin/src/main/kotlin/com/apollographql/ijplugin/settings/ProjectSettingsService.kt @@ -47,6 +47,13 @@ class ProjectSettingsService(private val project: Project) : PersistentStateComp notifySettingsChanged() } + override var automaticCodegenAdditionalGradleJvmArguments: String + get() = _state.automaticCodegenAdditionalGradleJvmArguments + set(value) { + _state.automaticCodegenAdditionalGradleJvmArguments = value + notifySettingsChanged() + } + override var hasEnabledGraphQLPluginApolloKotlinSupport: Boolean get() = _state.hasEnabledGraphQLPluginApolloKotlinSupport set(value) { @@ -143,6 +150,7 @@ class ProjectSettingsService(private val project: Project) : PersistentStateComp interface ProjectSettingsState { var automaticCodegenTriggering: Boolean + var automaticCodegenAdditionalGradleJvmArguments: String var hasEnabledGraphQLPluginApolloKotlinSupport: Boolean var contributeConfigurationToGraphqlPlugin: Boolean var apolloKotlinServiceConfigurations: List @@ -191,6 +199,7 @@ data class ApolloKotlinServiceConfiguration( data class ProjectSettingsStateImpl( override var automaticCodegenTriggering: Boolean = true, + override var automaticCodegenAdditionalGradleJvmArguments: String = "-Xms64m -Xmx512m", override var hasEnabledGraphQLPluginApolloKotlinSupport: Boolean = false, override var contributeConfigurationToGraphqlPlugin: Boolean = true, override var apolloKotlinServiceConfigurations: List = emptyList(), diff --git a/intellij-plugin/src/main/kotlin/com/apollographql/ijplugin/settings/SettingsComponent.kt b/intellij-plugin/src/main/kotlin/com/apollographql/ijplugin/settings/SettingsComponent.kt index 2c7c265f314..c363d17ca2f 100644 --- a/intellij-plugin/src/main/kotlin/com/apollographql/ijplugin/settings/SettingsComponent.kt +++ b/intellij-plugin/src/main/kotlin/com/apollographql/ijplugin/settings/SettingsComponent.kt @@ -10,7 +10,9 @@ import com.intellij.openapi.project.Project import com.intellij.ui.AddEditRemovePanel import com.intellij.ui.dsl.builder.AlignX import com.intellij.ui.dsl.builder.bindSelected +import com.intellij.ui.dsl.builder.bindText import com.intellij.ui.dsl.builder.panel +import java.awt.Font import javax.swing.JCheckBox import javax.swing.JComponent import javax.swing.JPanel @@ -18,10 +20,12 @@ import javax.swing.JPanel class SettingsComponent(private val project: Project) { private val propertyGraph = PropertyGraph() private val automaticCodegenTriggeringProperty = propertyGraph.property(false) + private val automaticCodegenAdditionalGradleJvmArgumentsProperty = propertyGraph.property("") private val contributeConfigurationToGraphqlPluginProperty = propertyGraph.property(false) private val telemetryEnabledProperty = propertyGraph.property(false) var automaticCodegenTriggering: Boolean by automaticCodegenTriggeringProperty + var automaticCodegenAdditionalGradleJvmArguments: String by automaticCodegenAdditionalGradleJvmArgumentsProperty var contributeConfigurationToGraphqlPlugin: Boolean by contributeConfigurationToGraphqlPluginProperty var apolloKotlinServiceConfigurations: List get() = addEditRemovePanel?.data?.toList() ?: emptyList() @@ -42,6 +46,15 @@ class SettingsComponent(private val project: Project) { .bindSelected(automaticCodegenTriggeringProperty) .component } + row { + label(ApolloBundle.message("settings.codegen.additionalGradleJvmArguments.text")) + textField() + .align(AlignX.FILL) + .bindText(automaticCodegenAdditionalGradleJvmArgumentsProperty) + .applyToComponent { + font = Font(Font.MONOSPACED, font.style, font.size) + } + } }.visible(isKotlinPluginPresent && isGradlePluginPresent) group(ApolloBundle.message("settings.graphqlPlugin.title")) { row { diff --git a/intellij-plugin/src/main/kotlin/com/apollographql/ijplugin/settings/SettingsConfigurable.kt b/intellij-plugin/src/main/kotlin/com/apollographql/ijplugin/settings/SettingsConfigurable.kt index 90a126e73b8..8270e912e13 100644 --- a/intellij-plugin/src/main/kotlin/com/apollographql/ijplugin/settings/SettingsConfigurable.kt +++ b/intellij-plugin/src/main/kotlin/com/apollographql/ijplugin/settings/SettingsConfigurable.kt @@ -17,6 +17,7 @@ class SettingsConfigurable(private val project: Project) : Configurable { override fun isModified(): Boolean { return settingsComponent!!.automaticCodegenTriggering != project.projectSettingsState.automaticCodegenTriggering || + settingsComponent!!.automaticCodegenAdditionalGradleJvmArguments != project.projectSettingsState.automaticCodegenAdditionalGradleJvmArguments || settingsComponent!!.contributeConfigurationToGraphqlPlugin != project.projectSettingsState.contributeConfigurationToGraphqlPlugin || settingsComponent!!.apolloKotlinServiceConfigurations != project.projectSettingsState.apolloKotlinServiceConfigurations || settingsComponent!!.telemetryEnabled != appSettingsState.telemetryEnabled @@ -24,6 +25,8 @@ class SettingsConfigurable(private val project: Project) : Configurable { override fun apply() { project.projectSettingsState.automaticCodegenTriggering = settingsComponent!!.automaticCodegenTriggering + project.projectSettingsState.automaticCodegenAdditionalGradleJvmArguments = + settingsComponent!!.automaticCodegenAdditionalGradleJvmArguments project.projectSettingsState.contributeConfigurationToGraphqlPlugin = settingsComponent!!.contributeConfigurationToGraphqlPlugin project.projectSettingsState.apolloKotlinServiceConfigurations = settingsComponent!!.apolloKotlinServiceConfigurations appSettingsState.telemetryEnabled = settingsComponent!!.telemetryEnabled @@ -31,6 +34,8 @@ class SettingsConfigurable(private val project: Project) : Configurable { override fun reset() { settingsComponent!!.automaticCodegenTriggering = project.projectSettingsState.automaticCodegenTriggering + settingsComponent!!.automaticCodegenAdditionalGradleJvmArguments = + project.projectSettingsState.automaticCodegenAdditionalGradleJvmArguments settingsComponent!!.contributeConfigurationToGraphqlPlugin = project.projectSettingsState.contributeConfigurationToGraphqlPlugin settingsComponent!!.apolloKotlinServiceConfigurations = project.projectSettingsState.apolloKotlinServiceConfigurations settingsComponent!!.telemetryEnabled = appSettingsState.telemetryEnabled diff --git a/intellij-plugin/src/main/resources/messages/ApolloBundle.properties b/intellij-plugin/src/main/resources/messages/ApolloBundle.properties index 5307194e008..d7914677672 100644 --- a/intellij-plugin/src/main/resources/messages/ApolloBundle.properties +++ b/intellij-plugin/src/main/resources/messages/ApolloBundle.properties @@ -86,6 +86,7 @@ settings.codegen.automaticCodegenTriggering.text=Automatic code generation settings.codegen.automaticCodegenTriggering.comment=Enabling this setting will run Gradle in continuous mode, similarly to \ ./gradlew generateApolloSources --continuous.
\ This watches changes to your GraphQL files and re-generates models when they change. +settings.codegen.additionalGradleJvmArguments.text=Additional JVM arguments: settings.graphqlPlugin.title=GraphQL Plugin settings.graphqlPlugin.contributeConfigurationToGraphqlPlugin.text=Contribute configuration to the GraphQL plugin