From e64baef10335310f9a39cff9b2d81cdb21cb990c Mon Sep 17 00:00:00 2001 From: Benoit 'BoD' Lubek Date: Thu, 24 Apr 2025 11:50:09 +0200 Subject: [PATCH 1/2] Use coroutines in ApolloCodegenService (prevents a crash when calling getExecutionSettings) (#6477) (cherry picked from commit 1bd8425ba3d6ac4dcadbf2d06afd1e6e51e2b519) --- .../ijplugin/codegen/ApolloCodegenService.kt | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 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 ed6217a7f6e..848f08acfe7 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 @@ -33,17 +33,19 @@ import com.intellij.openapi.project.Project import com.intellij.openapi.roots.ProjectRootManager import com.intellij.openapi.util.CheckedDisposable import com.intellij.openapi.vfs.VfsUtil +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.launch import org.gradle.tooling.CancellationTokenSource 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) class ApolloCodegenService( private val project: Project, + private val coroutineScope: CoroutineScope, ) : Disposable { private var documentChangesDisposable: CheckedDisposable? = null private var fileEditorChangesDisposable: CheckedDisposable? = null @@ -53,8 +55,6 @@ class ApolloCodegenService( private var gradleCodegenCancellation: CancellationTokenSource? = null - private val gradleExecutorService = Executors.newSingleThreadExecutor() - init { logd("project=${project.name}") startOrStopCodegenObservers() @@ -181,10 +181,9 @@ class ApolloCodegenService( val modules = ModuleManager.getInstance(project).modules val rootProjectPath = project.getGradleRootPath() ?: return - val executionSettings = - ExternalSystemApiUtil.getExecutionSettings(project, rootProjectPath, GradleConstants.SYSTEM_ID) - - gradleExecutorService.submit { + coroutineScope.launch { + val executionSettings = + ExternalSystemApiUtil.getExecutionSettings(project, rootProjectPath, GradleConstants.SYSTEM_ID) val gradleExecutionHelper = GradleExecutionHelper() gradleExecutionHelper.execute(rootProjectPath, executionSettings) { connection -> gradleCodegenCancellation = GradleConnector.newCancellationTokenSource() @@ -257,6 +256,5 @@ class ApolloCodegenService( override fun dispose() { logd("project=${project.name}") stopContinuousGradleCodegen() - gradleExecutorService.shutdown() } } From 627e52f25d44e57c4e6e745b576515b1a07e9022 Mon Sep 17 00:00:00 2001 From: Benoit 'BoD' Lubek Date: Wed, 9 Apr 2025 16:35:06 +0200 Subject: [PATCH 2/2] Use a coroutines to prevent an IllegalStateException (see #6459) (#6460) (cherry picked from commit 75b1cdcad28ca3cbf05e10ac13e825e8d9fb6c9a) --- .../ijplugin/gradle/GradleToolingModelService.kt | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) 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 cc47783bad7..f8e22e63c93 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 @@ -9,7 +9,6 @@ import com.apollographql.ijplugin.settings.ProjectSettingsState import com.apollographql.ijplugin.settings.projectSettingsState import com.apollographql.ijplugin.telemetry.telemetryService import com.apollographql.ijplugin.util.dispose -import com.apollographql.ijplugin.util.executeOnPooledThread import com.apollographql.ijplugin.util.isNotDisposed import com.apollographql.ijplugin.util.logd import com.apollographql.ijplugin.util.logw @@ -25,6 +24,8 @@ import com.intellij.openapi.project.guessProjectDir import com.intellij.openapi.util.CheckedDisposable import com.intellij.openapi.vfs.VfsUtilCore import com.intellij.openapi.vfs.VirtualFileManager +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.launch import org.gradle.tooling.CancellationTokenSource import org.gradle.tooling.GradleConnector import org.gradle.tooling.model.GradleProject @@ -36,6 +37,7 @@ import java.io.File @Service(Service.Level.PROJECT) class GradleToolingModelService( private val project: Project, + private val coroutineScope: CoroutineScope, ) : Disposable { private var gradleHasSyncedDisposable: CheckedDisposable? = null @@ -141,7 +143,7 @@ class GradleToolingModelService( return } - fetchToolingModelsTask = FetchToolingModelsTask().also { executeOnPooledThread { it.run() } } + fetchToolingModelsTask = FetchToolingModelsTask().also { coroutineScope.launch { it.run() } } } private inner class FetchToolingModelsTask : Runnable {