cleanup: threading annotate (part of IJPL-210489 rework auto-imports hints to show in more places)

GitOrigin-RevId: 6ba2983dad5dea331608ea02b26b8a5a867643a2
This commit is contained in:
Alexey Kudravtsev
2025-09-30 16:10:52 +00:00
committed by intellij-monorepo-bot
parent 85c1fc3031
commit 164a90ccda
11 changed files with 26 additions and 12 deletions
@@ -13,6 +13,7 @@ import com.intellij.pom.java.LanguageLevel;
import com.intellij.psi.*;
import com.intellij.psi.tree.IElementType;
import com.intellij.psi.util.PropertyMemberType;
import com.intellij.util.concurrency.annotations.RequiresBackgroundThread;
import org.jetbrains.annotations.*;
import java.util.*;
@@ -280,6 +281,7 @@ public abstract class QuickFixFactory {
public abstract @NotNull IntentionAction createCreateAnnotationMethodFromUsageFix(@NotNull PsiNameValuePair pair);
@RequiresBackgroundThread
public abstract @NotNull ModCommandAction createOptimizeImportsFix(boolean fixOnTheFly, @NotNull PsiFile file);
public abstract @NotNull IntentionAction createSafeDeleteUnusedParameterInHierarchyFix(@NotNull PsiParameter parameter, boolean excludingHierarchy);
@@ -54,6 +54,7 @@ import com.intellij.refactoring.JavaRefactoringActionHandlerFactory;
import com.intellij.util.ObjectUtils;
import com.intellij.util.ThreeState;
import com.intellij.util.concurrency.ThreadingAssertions;
import com.intellij.util.concurrency.annotations.RequiresBackgroundThread;
import com.siyeh.ig.controlflow.UnnecessaryDefaultInspection;
import com.siyeh.ig.fixes.*;
import com.siyeh.ipp.imports.ReplaceOnDemandImportIntention;
@@ -590,6 +591,7 @@ public final class QuickFixFactoryImpl extends QuickFixFactory {
}
@Override
@RequiresBackgroundThread
public @NotNull ModCommandAction createOptimizeImportsFix(final boolean fixOnTheFly, @NotNull PsiFile file) {
ApplicationManager.getApplication().assertIsNonDispatchThread();
VirtualFile virtualFile = file.getVirtualFile();
@@ -34,15 +34,7 @@ public interface HintAction extends IntentionAction {
*/
boolean showHint(@NotNull Editor editor);
/**
* Perform this action if it doesn't require any user interaction and doesn't show any popups. Example: insert a new unambiguous import
* for the reference that this intention or quick fix was created for.
* This method is invoked on UI thread after the highlighting is finished, without a write action.
* Before the invocation, {@link #isAvailable(Project, Editor, PsiFile)} is checked to be {@code true}.
* @return whether the action was performed and anything has changed in document/PSI/project model
* @deprecated Use {@link com.intellij.codeInsight.daemon.ReferenceImporter} instead, which does a better job to avoid freezes
*/
@Deprecated
@Deprecated(forRemoval = true)
default boolean fixSilently(@NotNull Editor editor) {
return false;
}
@@ -4,6 +4,7 @@ package com.intellij.codeHighlighting;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.project.PossiblyDumbAware;
import com.intellij.psi.PsiFile;
import com.intellij.util.concurrency.annotations.RequiresBackgroundThread;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -20,5 +21,6 @@ public interface TextEditorHighlightingPassFactory extends PossiblyDumbAware {
* For example, read action should be acquired before accessing PSI.
*/
@Nullable
@RequiresBackgroundThread
TextEditorHighlightingPass createHighlightingPass(@NotNull PsiFile psiFile, @NotNull Editor editor);
}
@@ -11,6 +11,7 @@ import com.intellij.psi.PsiCodeFragment;
import com.intellij.psi.PsiFileSystemItem;
import com.intellij.util.ThreeState;
import com.intellij.util.concurrency.ThreadingAssertions;
import com.intellij.util.concurrency.annotations.RequiresEdt;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.NotNull;
@@ -67,6 +68,7 @@ final class CanISilentlyChange {
}
}
@RequiresEdt
@ApiStatus.Internal
static @NotNull Result thisFile(@NotNull PsiFileSystemItem file) {
ThreadingAssertions.assertEventDispatchThread();
@@ -69,7 +69,7 @@ public abstract class DaemonCodeAnalyzerEx extends DaemonCodeAnalyzer {
HighlightInfo info = HighlightInfo.fromRangeHighlighter(marker);
if (info == null) return true;
return minSeverity != null && severityRegistrar.compare(info.getSeverity(), minSeverity) < 0
|| info.getHighlighter() == null
|| info.getHighlighter() != marker
|| !CodeInsightContextHighlightingUtil.acceptRangeHighlighter(context, marker)
|| processor.process(info);
});
@@ -100,7 +100,7 @@ public abstract class DaemonCodeAnalyzerEx extends DaemonCodeAnalyzer {
return model.processRangeHighlightersOutside(startOffset, endOffset, marker -> {
HighlightInfo info = HighlightInfo.fromRangeHighlighter(marker);
return info == null ||
info.getHighlighter() == null ||
info.getHighlighter() != marker ||
!CodeInsightContextHighlightingUtil.acceptRangeHighlighter(context, marker) ||
processor.process(info);
});
@@ -109,6 +109,7 @@ public abstract class DaemonCodeAnalyzerEx extends DaemonCodeAnalyzer {
public abstract boolean hasVisibleLightBulbOrPopup();
@ApiStatus.Internal
@RequiresBackgroundThread
public abstract @NotNull List<HighlightInfo> runMainPasses(@NotNull PsiFile psiFile,
@NotNull Document document,
@NotNull ProgressIndicator progress);
@@ -313,6 +313,7 @@ public final class HighlightingSessionImpl implements HighlightingSession {
// compute additional stuff in background thread
@ApiStatus.Internal
@RequiresBackgroundThread
public void additionalSetupFromBackground(@NotNull PsiFile psiFile) {
ApplicationManager.getApplication().assertIsNonDispatchThread();
ReadAction.run(() -> {
@@ -394,6 +395,7 @@ public final class HighlightingSessionImpl implements HighlightingSession {
}
@ApiStatus.Internal
@RequiresEdt
public static boolean canChangeFileSilently(@NotNull PsiFileSystemItem file,
boolean isInContent,
@NotNull ThreeState extensionsAllowToChangeFileSilently) {
@@ -8,6 +8,7 @@ import com.intellij.openapi.editor.Document;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.project.Project;
import com.intellij.psi.PsiFile;
import com.intellij.util.concurrency.annotations.RequiresBackgroundThread;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.NotNull;
@@ -19,9 +20,11 @@ public abstract class TextEditorHighlightingPassRegistrarEx extends TextEditorHi
return (TextEditorHighlightingPassRegistrarEx)getInstance(project);
}
@RequiresBackgroundThread
public abstract @NotNull List<@NotNull TextEditorHighlightingPass> instantiatePasses(@NotNull PsiFile psiFile,
@NotNull Editor editor,
int @NotNull [] passesToIgnore);
@RequiresBackgroundThread
public abstract @NotNull List<@NotNull TextEditorHighlightingPass> instantiateMainPasses(@NotNull PsiFile psiFile,
@NotNull Document document,
@NotNull HighlightInfoProcessor highlightInfoProcessor);
@@ -27,6 +27,7 @@ import com.intellij.psi.PsiFile;
import com.intellij.psi.util.PsiUtilCore;
import com.intellij.util.ArrayUtil;
import com.intellij.util.ArrayUtilRt;
import com.intellij.util.concurrency.annotations.RequiresBackgroundThread;
import com.intellij.util.containers.ContainerUtil;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
@@ -172,6 +173,7 @@ public final class TextEditorHighlightingPassRegistrarImpl extends TextEditorHig
}
@Override
@RequiresBackgroundThread
public @NotNull List<@NotNull TextEditorHighlightingPass> instantiatePasses(@NotNull PsiFile psiFile,
@NotNull Editor editor,
int @NotNull [] passesToIgnore) {
@@ -250,6 +252,7 @@ public final class TextEditorHighlightingPassRegistrarImpl extends TextEditorHig
}
@Override
@RequiresBackgroundThread
public @NotNull List<@NotNull TextEditorHighlightingPass> instantiateMainPasses(@NotNull PsiFile psiFile,
@NotNull Document document,
@NotNull HighlightInfoProcessor highlightInfoProcessor) {
@@ -79,6 +79,7 @@ import com.intellij.util.KeyedLazyInstance;
import com.intellij.util.ThreeState;
import com.intellij.util.concurrency.ThreadingAssertions;
import com.intellij.util.concurrency.annotations.RequiresBackgroundThread;
import com.intellij.util.concurrency.annotations.RequiresEdt;
import com.intellij.util.concurrency.annotations.RequiresReadLock;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.io.storage.HeavyProcessLatch;
@@ -529,7 +530,9 @@ public final class DaemonListeners implements Disposable {
* - files under explicit write permission version control (such as Perforce, which asks "do you want to edit this file"),
* - files in the middle of cut-n-paste operation.
*/
public static boolean canChangeFileSilently(@NotNull PsiFileSystemItem file, boolean isInContent,
@RequiresEdt
public static boolean canChangeFileSilently(@NotNull PsiFileSystemItem file,
boolean isInContent,
@NotNull ThreeState extensionsAllowToChangeFileSilently) {
ThreadingAssertions.assertEventDispatchThread();
Project project = file.getProject();
@@ -28,6 +28,7 @@ import com.intellij.psi.PsiWhiteSpace
import com.intellij.psi.util.PsiEditorUtil
import com.intellij.util.DocumentUtil
import com.intellij.util.ThreeState
import com.intellij.util.concurrency.annotations.RequiresBackgroundThread
import org.jetbrains.kotlin.idea.base.codeInsight.KotlinOptimizeImportsFacility
import org.jetbrains.kotlin.idea.base.projectStructure.RootKindFilter
import org.jetbrains.kotlin.idea.base.projectStructure.matches
@@ -77,6 +78,7 @@ class KotlinUnusedImportInspection : AbstractKotlinInspection() {
return KotlinOptimizeImportsFacility.getInstance().analyzeImports(file)
}
@RequiresBackgroundThread
private fun scheduleOptimizeImportsOnTheFly(file: KtFile, data: KotlinOptimizeImportsFacility.ImportData) {
if (!KotlinCodeInsightWorkspaceSettings.getInstance(file.project).optimizeImportsOnTheFly) return
val optimizedImports = KotlinOptimizeImportsFacility.getInstance().prepareOptimizedImports(file, data) ?: return // return if already optimized