work around suspend/legacy api and threading isssues; #PY-77996 fixed

Merge-request: IJ-MR-151488
Merged-by: Ilya Kazakevich <ilya.kazakevich@jetbrains.com>
(cherry picked from commit db9e012e187c62fbc53ddfa0c31603eb834058f9)

GitOrigin-RevId: 543d11a54e7106bd7f057e930d3796cc76d64617
This commit is contained in:
Aleksandr Sorotskii
2024-12-12 19:09:46 +00:00
committed by intellij-monorepo-bot
parent 1d3e312dd5
commit 2df265c932
4 changed files with 34 additions and 16 deletions

View File

@@ -21,11 +21,13 @@ import com.intellij.ui.components.JBLabel
import com.intellij.util.ui.JBUI
import com.intellij.pycharm.community.ide.impl.PyCharmCommunityCustomizationBundle
import com.intellij.util.concurrency.annotations.RequiresBackgroundThread
import com.jetbrains.python.PyBundle
import com.jetbrains.python.sdk.*
import com.jetbrains.python.sdk.basePath
import com.jetbrains.python.sdk.configuration.PyProjectSdkConfigurationExtension
import com.jetbrains.python.sdk.poetry.*
import com.jetbrains.python.sdk.poetry.ui.PyAddNewPoetryFromFilePanel
import com.jetbrains.python.util.runWithModalBlockingOrInBackground
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import java.awt.BorderLayout
@@ -40,23 +42,20 @@ class PyPoetrySdkConfiguration : PyProjectSdkConfigurationExtension {
private val LOGGER = Logger.getInstance(PyPoetrySdkConfiguration::class.java)
}
override fun getIntention(module: Module): String? =
runWithModalBlockingOrInBackground(module.project, PyBundle.message("python.sdk.validating.environment")) {
val toml = findAmongRoots(module, PY_PROJECT_TOML)
if (toml == null) {
return@runWithModalBlockingOrInBackground null
}
override fun getIntention(module: Module): @IntentionName String? {
return runWithModalProgressBlocking(module.project, PyCharmCommunityCustomizationBundle.message("sdk.dialog.title.setting.up.poetry.environment")) {
val msg: String? = null
val toml = findAmongRoots(module, PY_PROJECT_TOML)
if (toml == null) {
return@runWithModalProgressBlocking null
}
val isPoetry = getPyProjectTomlForPoetry(toml) != null
if (!isPoetry) {
return@runWithModalBlockingOrInBackground null
}
val isPoetry = getPyProjectTomlForPoetry(toml) != null
if (!isPoetry) {
return@runWithModalProgressBlocking null
}
return@runWithModalProgressBlocking PyCharmCommunityCustomizationBundle.message("sdk.set.up.poetry.environment", toml.name)
return@runWithModalBlockingOrInBackground PyCharmCommunityCustomizationBundle.message("sdk.set.up.poetry.environment", toml.name)
}
}
@RequiresBackgroundThread
override fun createAndAddSdkForConfigurator(module: Module): Sdk? = runBlockingCancellable { createAndAddSDk(module, false) }

View File

@@ -305,6 +305,7 @@ remote.debug.suspend.on.connect=Suspend after connect
python.debug.remote.name=PyRemoteDebug
filetype.python.debug.remote.description=Remote debug
python.sdk.validating.environment=Validating environment
python.sdk.getting.remote.interpreter.version=Getting Remote Interpreter Version
python.sdk.cannot.evaluate.sdk.version.error.message=Can't evaluate sdk version
python.sdk.directory.macro.description=The directory containing the Python interpreter selected for the project

View File

@@ -4,7 +4,6 @@ package com.jetbrains.python.sdk.poetry.ui
import com.intellij.openapi.components.service
import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory
import com.intellij.openapi.module.Module
import com.intellij.openapi.progress.runBlockingCancellable
import com.intellij.openapi.ui.TextFieldWithBrowseButton
import com.intellij.openapi.ui.ValidationInfo
import com.intellij.util.ui.FormBuilder
@@ -12,6 +11,7 @@ import com.jetbrains.python.PyBundle
import com.jetbrains.python.sdk.PythonSdkCoroutineService
import com.jetbrains.python.sdk.poetry.getPoetryExecutable
import com.jetbrains.python.sdk.poetry.validatePoetryExecutable
import com.jetbrains.python.util.runWithModalBlockingOrInBackground
import kotlinx.coroutines.launch
import java.awt.BorderLayout
import java.nio.file.Path
@@ -40,7 +40,7 @@ class PyAddNewPoetryFromFilePanel(private val module: Module) : JPanel() {
}
}
fun validateAll(): List<ValidationInfo> = runBlockingCancellable {
fun validateAll(): List<ValidationInfo> = runWithModalBlockingOrInBackground(module.project, PyBundle.message("python.sdk.validating.environment")) {
listOfNotNull(validatePoetryExecutable(Path.of(poetryPathField.text)))
}

View File

@@ -0,0 +1,18 @@
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.jetbrains.python.util
import com.intellij.openapi.progress.runBlockingCancellable
import com.intellij.openapi.project.Project
import com.intellij.openapi.util.NlsSafe
import com.intellij.platform.ide.progress.runWithModalProgressBlocking
import kotlinx.coroutines.CoroutineScope
import java.awt.EventQueue.isDispatchThread
// In case legacy sync API can be called from both EDT and background. This wrapper automatically chooses the appropriate way to launch it.
fun <T> runWithModalBlockingOrInBackground(project: Project, @NlsSafe msg: String, action: suspend CoroutineScope.() -> T): T {
if (isDispatchThread()) {
return runWithModalProgressBlocking(project, msg, action)
}
return runBlockingCancellable(action)
}