PY-76147: Do not call sync tasks on pure EDT.

Use coroutines instead

GitOrigin-RevId: 447a28ae363f88b575b148b2dea931e09f6a4741
This commit is contained in:
Ilya.Kazakevich
2024-09-23 16:00:51 +02:00
committed by intellij-monorepo-bot
parent 63b2359362
commit 24be5efa81
3 changed files with 19 additions and 29 deletions

View File

@@ -31,5 +31,6 @@
<orderEntry type="library" name="jackson" level="project" />
<orderEntry type="library" name="jackson-databind" level="project" />
<orderEntry type="library" name="jackson-module-kotlin" level="project" />
<orderEntry type="module" module-name="intellij.platform.ide.progress" />
</component>
</module>

View File

@@ -1,10 +1,15 @@
package com.jetbrains.python.sdk.flavors
import com.intellij.execution.target.TargetEnvironmentConfiguration
import com.intellij.platform.ide.progress.ModalTaskOwner
import com.intellij.platform.ide.progress.runWithModalProgressBlocking
import com.intellij.util.concurrency.annotations.RequiresBackgroundThread
import com.intellij.util.concurrency.annotations.RequiresEdt
import com.jetbrains.python.pathValidation.PlatformAndRoot.Companion.getPlatformAndRoot
import com.jetbrains.python.pathValidation.ValidationRequest
import com.jetbrains.python.pathValidation.validateExecutableFile
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import org.jetbrains.annotations.Nls
import org.jetbrains.annotations.NonNls
@@ -13,4 +18,12 @@ import org.jetbrains.annotations.NonNls
*/
@RequiresBackgroundThread
internal fun getFileExecutionError(@NonNls fullPath: String, targetEnvConfig: TargetEnvironmentConfiguration?): @Nls String? =
validateExecutableFile(ValidationRequest(fullPath, platformAndRoot = targetEnvConfig.getPlatformAndRoot()))?.message
validateExecutableFile(ValidationRequest(fullPath, platformAndRoot = targetEnvConfig.getPlatformAndRoot()))?.message
@RequiresEdt
internal fun getFileExecutionErrorOnEdt(@NonNls fullPath: String, targetEnvConfig: TargetEnvironmentConfiguration?): @Nls String? =
runWithModalProgressBlocking(ModalTaskOwner.guess(), "...") {
withContext(Dispatchers.IO) {
getFileExecutionError(fullPath, targetEnvConfig)
}
}

View File

@@ -10,24 +10,18 @@ import com.intellij.execution.target.TargetEnvironmentConfiguration;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.extensions.ExtensionPointName;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.progress.ProgressIndicator;
import com.intellij.openapi.progress.ProgressManager;
import com.intellij.openapi.progress.Task;
import com.intellij.openapi.projectRoots.Sdk;
import com.intellij.openapi.projectRoots.SdkAdditionalData;
import com.intellij.openapi.util.UserDataHolder;
import com.intellij.openapi.util.io.FileUtilRt;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.util.PatternUtil;
import com.intellij.util.concurrency.annotations.RequiresBackgroundThread;
import com.intellij.util.containers.ContainerUtil;
import com.jetbrains.python.PySdkBundle;
import com.jetbrains.python.psi.LanguageLevel;
import com.jetbrains.python.psi.icons.PythonPsiApiIcons;
import com.jetbrains.python.run.CommandLinePatcher;
import com.jetbrains.python.sdk.*;
import org.jetbrains.annotations.Nls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -41,6 +35,7 @@ import java.util.regex.Pattern;
import static com.jetbrains.python.sdk.PythonSdkUtilKtKt.tryResolvePath;
import static com.jetbrains.python.sdk.flavors.PySdkFlavorUtilKt.getFileExecutionError;
import static com.jetbrains.python.sdk.flavors.PySdkFlavorUtilKt.getFileExecutionErrorOnEdt;
/**
@@ -168,7 +163,9 @@ public abstract class PythonSdkFlavor<D extends PyFlavorData> {
if (executable != null) {
return executable;
}
var error = getErrorIfNotExecutable(fullPath, targetEnvConfig);
var error = SwingUtilities.isEventDispatchThread()
? getFileExecutionErrorOnEdt(fullPath, targetEnvConfig)
: getFileExecutionError(fullPath, targetEnvConfig);
if (error != null) {
Logger.getInstance(PythonSdkFlavor.class).warn(String.format("%s is not executable: %s", fullPath, error));
}
@@ -177,27 +174,6 @@ public abstract class PythonSdkFlavor<D extends PyFlavorData> {
return newValue;
}
@Nullable
@Nls
private static String getErrorIfNotExecutable(@NotNull String fullPath, @Nullable TargetEnvironmentConfiguration targetEnvConfig) {
if (SwingUtilities.isEventDispatchThread()) {
// Run under progress
// TODO: use pyModalBlocking when we merge two modules
return ProgressManager.getInstance()
.run(new Task.WithResult<@Nullable @Nls String, RuntimeException>(null, PySdkBundle.message("path.validation.wait.path", fullPath),
false) {
@Override
@Nls
@Nullable
protected String compute(@NotNull ProgressIndicator indicator) throws RuntimeException {
return getFileExecutionError(fullPath, targetEnvConfig);
}
});
}
else {
return getFileExecutionError(fullPath, targetEnvConfig);
}
}
public static void clearExecutablesCache() {
ourExecutableFiles.invalidateAll();