From aca9d92e9d85957fc13a2d33cb5dcee8137ecfe5 Mon Sep 17 00:00:00 2001 From: Vladimir Koshelev Date: Tue, 27 Aug 2024 18:59:03 +0200 Subject: [PATCH] [pycharm] introduce cleanAllFileLevelInspections to get rid of getting psi files on EDT for nothing GitOrigin-RevId: 28acc147cf396d63d27338ce15cab1a6fdfe4a32 --- .../daemon/impl/DaemonCodeAnalyzerEx.java | 8 ++++++++ .../daemon/impl/DaemonCodeAnalyzerImpl.java | 8 ++++++++ .../codeInsight/typing/PyTypingTypeProvider.java | 2 +- python/src/com/jetbrains/python/sdk/PySdkExt.kt | 6 ++++-- python/src/com/jetbrains/python/ui/PyUiUtil.java | 15 +-------------- 5 files changed, 22 insertions(+), 17 deletions(-) diff --git a/platform/analysis-impl/src/com/intellij/codeInsight/daemon/impl/DaemonCodeAnalyzerEx.java b/platform/analysis-impl/src/com/intellij/codeInsight/daemon/impl/DaemonCodeAnalyzerEx.java index 1be5d57d2d07..6a6c43afa843 100644 --- a/platform/analysis-impl/src/com/intellij/codeInsight/daemon/impl/DaemonCodeAnalyzerEx.java +++ b/platform/analysis-impl/src/com/intellij/codeInsight/daemon/impl/DaemonCodeAnalyzerEx.java @@ -89,6 +89,14 @@ public abstract class DaemonCodeAnalyzerEx extends DaemonCodeAnalyzer { @ApiStatus.Internal public abstract void cleanFileLevelHighlights(int group, @NotNull PsiFile psiFile); + + /** + * Do not use because manual management of highlights is dangerous and may lead to unexpected flicking/disappearing/stuck highlighters. + * Instead, generate file-level infos in your inspection/annotator, and they will be removed automatically when outdated + */ + @ApiStatus.Internal + public abstract void cleanAllFileLevelHighlights(int group); + @ApiStatus.Internal public abstract boolean hasFileLevelHighlights(int group, @NotNull PsiFile psiFile); diff --git a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/DaemonCodeAnalyzerImpl.java b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/DaemonCodeAnalyzerImpl.java index 35a958cb177d..75e445b42cd0 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/DaemonCodeAnalyzerImpl.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/DaemonCodeAnalyzerImpl.java @@ -246,6 +246,14 @@ public final class DaemonCodeAnalyzerImpl extends DaemonCodeAnalyzerEx } } + @Override + public void cleanAllFileLevelHighlights(int group) { + ThreadingAssertions.assertEventDispatchThread(); + for (FileEditor fileEditor : getFileEditorManager().getAllEditors()) { + cleanFileLevelHighlights(fileEditor, group); + } + } + @Override public boolean hasFileLevelHighlights(int group, @NotNull PsiFile psiFile) { ApplicationManager.getApplication().assertReadAccessAllowed(); diff --git a/python/python-psi-impl/src/com/jetbrains/python/codeInsight/typing/PyTypingTypeProvider.java b/python/python-psi-impl/src/com/jetbrains/python/codeInsight/typing/PyTypingTypeProvider.java index d6187fc4192d..5ed52feaaabf 100644 --- a/python/python-psi-impl/src/com/jetbrains/python/codeInsight/typing/PyTypingTypeProvider.java +++ b/python/python-psi-impl/src/com/jetbrains/python/codeInsight/typing/PyTypingTypeProvider.java @@ -2340,7 +2340,7 @@ public final class PyTypingTypeProvider extends PyTypeProviderWithCustomContext< public Stack getTypeAliasStack() { return myTypeAliasStack; } - + @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/python/src/com/jetbrains/python/sdk/PySdkExt.kt b/python/src/com/jetbrains/python/sdk/PySdkExt.kt index 7a67f67d3483..6f15297b0175 100644 --- a/python/src/com/jetbrains/python/sdk/PySdkExt.kt +++ b/python/src/com/jetbrains/python/sdk/PySdkExt.kt @@ -64,8 +64,8 @@ import com.jetbrains.python.sdk.flavors.VirtualEnvSdkFlavor import com.jetbrains.python.sdk.flavors.conda.CondaEnvSdkFlavor import com.jetbrains.python.target.PyTargetAwareAdditionalData import com.jetbrains.python.ui.PyUiUtil -import org.jetbrains.annotations.ApiStatus import kotlinx.coroutines.CoroutineScope +import org.jetbrains.annotations.ApiStatus import java.io.File import java.io.IOException import java.nio.file.Files @@ -320,7 +320,9 @@ var Module.pythonSdk: Sdk? set(value) { thisLogger().info("Setting PythonSDK $value to module $this") ModuleRootModificationUtil.setModuleSdk(this, value) - PyUiUtil.clearFileLevelInspectionResults(project) + runInEdt { + PyUiUtil.clearFileLevelInspectionResults(project) + } } var Project.pythonSdk: Sdk? diff --git a/python/src/com/jetbrains/python/ui/PyUiUtil.java b/python/src/com/jetbrains/python/ui/PyUiUtil.java index 6805ea37e416..ab0fa7b31dde 100644 --- a/python/src/com/jetbrains/python/ui/PyUiUtil.java +++ b/python/src/com/jetbrains/python/ui/PyUiUtil.java @@ -4,13 +4,11 @@ package com.jetbrains.python.ui; import com.intellij.codeHighlighting.Pass; import com.intellij.codeInsight.daemon.impl.DaemonCodeAnalyzerEx; import com.intellij.openapi.application.ApplicationManager; -import com.intellij.openapi.application.ReadAction; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.EditorFactory; import com.intellij.openapi.editor.ex.EditorEx; import com.intellij.openapi.editor.highlighter.EditorHighlighter; import com.intellij.openapi.editor.highlighter.EditorHighlighterFactory; -import com.intellij.openapi.fileEditor.FileEditorManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.MessageType; import com.intellij.openapi.ui.popup.Balloon; @@ -18,9 +16,7 @@ import com.intellij.openapi.ui.popup.JBPopupFactory; import com.intellij.openapi.util.NlsContexts.PopupContent; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.wm.WindowManager; -import com.intellij.psi.PsiManager; import com.intellij.ui.awt.RelativePoint; -import one.util.streamex.StreamEx; import org.jetbrains.annotations.NotNull; import javax.swing.*; @@ -73,15 +69,6 @@ public final class PyUiUtil { } public static void clearFileLevelInspectionResults(@NotNull Project project) { - final DaemonCodeAnalyzerEx codeAnalyzer = DaemonCodeAnalyzerEx.getInstanceEx(project); - final PsiManager psiManager = PsiManager.getInstance(project); - StreamEx.of(FileEditorManager.getInstance(project).getAllEditors()) - .map(editor -> editor.getFile()) - .nonNull() - .map(file -> ReadAction.compute(() -> psiManager.findFile(file))) - .nonNull() - .forEach(file -> { - codeAnalyzer.cleanFileLevelHighlights(Pass.LOCAL_INSPECTIONS, file); - }); + DaemonCodeAnalyzerEx.getInstanceEx(project).cleanAllFileLevelHighlights(Pass.LOCAL_INSPECTIONS); } }