From b5b2360944a977743406c4ccea8f1a44441471d4 Mon Sep 17 00:00:00 2001 From: Anton Kosyakov Date: Wed, 23 Feb 2022 15:18:48 +0000 Subject: [PATCH] jb: auto preconfigure module SDK as well --- .../jetbrains/remote/GitpodProjectManager.kt | 61 +++++++++++++++---- 1 file changed, 49 insertions(+), 12 deletions(-) diff --git a/components/ide/jetbrains/backend-plugin/src/main/kotlin/io/gitpod/jetbrains/remote/GitpodProjectManager.kt b/components/ide/jetbrains/backend-plugin/src/main/kotlin/io/gitpod/jetbrains/remote/GitpodProjectManager.kt index aac3c1fdb257f2..61ada23605629e 100644 --- a/components/ide/jetbrains/backend-plugin/src/main/kotlin/io/gitpod/jetbrains/remote/GitpodProjectManager.kt +++ b/components/ide/jetbrains/backend-plugin/src/main/kotlin/io/gitpod/jetbrains/remote/GitpodProjectManager.kt @@ -4,35 +4,72 @@ package io.gitpod.jetbrains.remote +import com.intellij.ProjectTopics import com.intellij.openapi.diagnostic.thisLogger +import com.intellij.openapi.module.Module +import com.intellij.openapi.module.ModuleManager +import com.intellij.openapi.project.ModuleListener import com.intellij.openapi.project.Project import com.intellij.openapi.projectRoots.ProjectJdkTable +import com.intellij.openapi.projectRoots.Sdk +import com.intellij.openapi.roots.ModuleRootManager +import com.intellij.openapi.roots.ModuleRootModificationUtil import com.intellij.openapi.roots.ProjectRootManager import com.intellij.util.application +import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.future.await +import kotlinx.coroutines.launch +import java.util.concurrent.CompletableFuture + class GitpodProjectManager( private val project: Project ) { + /** + * It is a workaround for https://youtrack.jetbrains.com/issue/GTW-88 + */ init { + val pendingSdk = CompletableFuture() application.invokeLaterOnWriteThread { application.runWriteAction { - configureSdk() + try { + ProjectJdkTable.getInstance().preconfigure() + pendingSdk.complete(ProjectJdkTable.getInstance().allJdks.firstOrNull()) + } catch (t: Throwable) { + pendingSdk.completeExceptionally(t) + } } } + GlobalScope.launch { + val sdk = pendingSdk.await() ?: return@launch + thisLogger().warn("gitpod: '${project.name}' project: SDK detected: $sdk") + project.messageBus.connect().subscribe(ProjectTopics.MODULES, object : ModuleListener { + override fun moduleAdded(project: Project, module: Module) { + configureSdk(sdk) + } + }) + configureSdk(sdk) + } } - /** - * It is a workaround for https://youtrack.jetbrains.com/issue/GTW-88 - */ - private fun configureSdk() { - ProjectJdkTable.getInstance().preconfigure() - val sdk = ProjectJdkTable.getInstance().allJdks.firstOrNull() ?: return - val projectRootManager = ProjectRootManager.getInstance(project) - if (projectRootManager.projectSdk != null) { - return + private fun configureSdk(sdk: Sdk) { + application.invokeLaterOnWriteThread { + application.runWriteAction { + val projectRootManager = ProjectRootManager.getInstance(project) + if (projectRootManager.projectSdk == null) { + projectRootManager.projectSdk = sdk + thisLogger().warn("gitpod: '${project.name}' project: SDK was auto preconfigured: $sdk") + } + } + } + for (module in ModuleManager.getInstance(project).modules) { + ModuleRootModificationUtil.updateModel(module) { m -> + if (m.sdk == null) { + m.sdk = sdk + thisLogger().warn("gitpod: '${module.name}' module: SDK was auto preconfigured: $sdk") + } + } } - projectRootManager.projectSdk = sdk - thisLogger().warn("gitpod: SDK was auto preconfigured: $sdk") } } \ No newline at end of file