[python] PY-83881 pass DumbAware runnable to runWhenProjectIsInitialized to avoid waiting for indexation before setting a correct sdk

(cherry picked from commit 0a8fd1b3ebcd459f45c24d4d58f2098abe190dc3)

IJ-CR-181097

GitOrigin-RevId: 7a0d58aaf913eb9a1c1d035b1a8e16773b08b27c
This commit is contained in:
Vladimir.Koshelev
2025-11-03 21:42:44 +00:00
committed by intellij-monorepo-bot
parent 59e5932730
commit e431ddbba0
@@ -4,10 +4,13 @@ package com.intellij.pycharm.community.ide.impl
import com.intellij.ide.trustedProjects.TrustedProjects
import com.intellij.openapi.application.ApplicationManager
import com.intellij.openapi.application.EDT
import com.intellij.openapi.components.Service
import com.intellij.openapi.components.service
import com.intellij.openapi.diagnostic.debug
import com.intellij.openapi.diagnostic.thisLogger
import com.intellij.openapi.extensions.ExtensionNotApplicableException
import com.intellij.openapi.module.Module
import com.intellij.openapi.project.DumbAware
import com.intellij.openapi.project.Project
import com.intellij.openapi.project.ProjectManager
import com.intellij.openapi.project.impl.getOrInitializeModule
@@ -39,7 +42,9 @@ import com.jetbrains.python.sdk.configuration.PyProjectSdkConfiguration.setSdkUs
import com.jetbrains.python.sdk.configuration.PyProjectSdkConfiguration.suppressTipAndInspectionsFor
import com.jetbrains.python.sdk.configuration.PyProjectSdkConfigurationExtension
import com.jetbrains.python.sdk.impl.PySdkBundle
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import org.jetbrains.annotations.ApiStatus
import java.nio.file.Path
@@ -72,16 +77,19 @@ class PythonSdkConfigurator : DirectoryProjectConfigurator {
val module = moduleRef.getOrInitializeModule(project, baseDir).also { thisLogger().debug { "Module: $it" } }
StartupManager.getInstance(project).runWhenProjectIsInitialized {
PyPackageCoroutine.launch(project) {
if (module.isDisposed) return@launch
val sdkInfos = findSuitableCreateSdkInfos(module)
withBackgroundProgress(project, PySdkBundle.message("python.configuring.interpreter.progress"), true) {
val lifetime = suppressTipAndInspectionsFor(module, "all suitable extensions")
lifetime.use { configureSdk(project, module, sdkInfos) }
StartupManager.getInstance(project).runWhenProjectIsInitialized(object : Runnable, DumbAware {
override fun run() {
if (module.isDisposed) return
service<MyCoroutineScopeProvider>().coroutineScope.launch {
val sdkInfos = findSuitableCreateSdkInfos(module)
withBackgroundProgress(project, PySdkBundle.message("python.configuring.interpreter.progress"), true) {
val lifetime = suppressTipAndInspectionsFor(module, "all suitable extensions")
lifetime.use { configureSdk(project, module, sdkInfos) }
}
}
}
}
)
}
private suspend fun findSuitableCreateSdkInfos(module: Module): List<CreateSdkInfo> = withContext(Dispatchers.Default) {
@@ -262,3 +270,6 @@ class PythonSdkConfigurator : DirectoryProjectConfigurator {
return ProjectRootManager.getInstance(ProjectManager.getInstance().defaultProject).projectSdk?.takeIf { it.sdkType is PythonSdkType }
}
}
@Service
private class MyCoroutineScopeProvider(val coroutineScope: CoroutineScope)