[pycharm] introduce cleanAllFileLevelInspections to get rid of getting psi files on EDT for nothing

GitOrigin-RevId: 28acc147cf396d63d27338ce15cab1a6fdfe4a32
This commit is contained in:
Vladimir Koshelev
2024-08-27 18:59:03 +02:00
committed by intellij-monorepo-bot
parent d72eba89a1
commit aca9d92e9d
5 changed files with 22 additions and 17 deletions

View File

@@ -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);

View File

@@ -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();

View File

@@ -2340,7 +2340,7 @@ public final class PyTypingTypeProvider extends PyTypeProviderWithCustomContext<
public Stack<PyQualifiedNameOwner> getTypeAliasStack() {
return myTypeAliasStack;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;

View File

@@ -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?

View File

@@ -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);
}
}