From 164a90ccda70bcc726c45bcf985e285d8fbdb99a Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Tue, 30 Sep 2025 14:42:44 +0200 Subject: [PATCH] cleanup: threading annotate (part of IJPL-210489 rework auto-imports hints to show in more places) GitOrigin-RevId: 6ba2983dad5dea331608ea02b26b8a5a867643a2 --- .../codeInsight/intention/QuickFixFactory.java | 2 ++ .../intention/impl/config/QuickFixFactoryImpl.java | 2 ++ .../src/com/intellij/codeInspection/HintAction.java | 10 +--------- .../TextEditorHighlightingPassFactory.java | 2 ++ .../codeInsight/daemon/impl/CanISilentlyChange.java | 2 ++ .../codeInsight/daemon/impl/DaemonCodeAnalyzerEx.java | 5 +++-- .../daemon/impl/HighlightingSessionImpl.java | 2 ++ .../impl/TextEditorHighlightingPassRegistrarEx.java | 3 +++ .../impl/TextEditorHighlightingPassRegistrarImpl.java | 3 +++ .../codeInsight/daemon/impl/DaemonListeners.java | 5 ++++- .../inspections/shared/KotlinUnusedImportInspection.kt | 2 ++ 11 files changed, 26 insertions(+), 12 deletions(-) diff --git a/java/java-analysis-api/src/com/intellij/codeInsight/intention/QuickFixFactory.java b/java/java-analysis-api/src/com/intellij/codeInsight/intention/QuickFixFactory.java index 93283b98ce9a..61fb277ec0bc 100644 --- a/java/java-analysis-api/src/com/intellij/codeInsight/intention/QuickFixFactory.java +++ b/java/java-analysis-api/src/com/intellij/codeInsight/intention/QuickFixFactory.java @@ -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); diff --git a/java/java-impl/src/com/intellij/codeInsight/intention/impl/config/QuickFixFactoryImpl.java b/java/java-impl/src/com/intellij/codeInsight/intention/impl/config/QuickFixFactoryImpl.java index 83c824849e79..270c6ab47a8e 100644 --- a/java/java-impl/src/com/intellij/codeInsight/intention/impl/config/QuickFixFactoryImpl.java +++ b/java/java-impl/src/com/intellij/codeInsight/intention/impl/config/QuickFixFactoryImpl.java @@ -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(); diff --git a/platform/analysis-api/src/com/intellij/codeInspection/HintAction.java b/platform/analysis-api/src/com/intellij/codeInspection/HintAction.java index 5dfd0f1812e1..8041919570d0 100644 --- a/platform/analysis-api/src/com/intellij/codeInspection/HintAction.java +++ b/platform/analysis-api/src/com/intellij/codeInspection/HintAction.java @@ -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; } diff --git a/platform/analysis-impl/src/com/intellij/codeHighlighting/TextEditorHighlightingPassFactory.java b/platform/analysis-impl/src/com/intellij/codeHighlighting/TextEditorHighlightingPassFactory.java index 8863445271fe..c3c3dddd78de 100644 --- a/platform/analysis-impl/src/com/intellij/codeHighlighting/TextEditorHighlightingPassFactory.java +++ b/platform/analysis-impl/src/com/intellij/codeHighlighting/TextEditorHighlightingPassFactory.java @@ -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); } diff --git a/platform/analysis-impl/src/com/intellij/codeInsight/daemon/impl/CanISilentlyChange.java b/platform/analysis-impl/src/com/intellij/codeInsight/daemon/impl/CanISilentlyChange.java index 6f9ba5d52093..254acf68bdd5 100644 --- a/platform/analysis-impl/src/com/intellij/codeInsight/daemon/impl/CanISilentlyChange.java +++ b/platform/analysis-impl/src/com/intellij/codeInsight/daemon/impl/CanISilentlyChange.java @@ -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(); 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 2e9613a0926a..7601702a3ce4 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 @@ -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 runMainPasses(@NotNull PsiFile psiFile, @NotNull Document document, @NotNull ProgressIndicator progress); diff --git a/platform/analysis-impl/src/com/intellij/codeInsight/daemon/impl/HighlightingSessionImpl.java b/platform/analysis-impl/src/com/intellij/codeInsight/daemon/impl/HighlightingSessionImpl.java index a2a7b561ae84..2e8f6e24e943 100644 --- a/platform/analysis-impl/src/com/intellij/codeInsight/daemon/impl/HighlightingSessionImpl.java +++ b/platform/analysis-impl/src/com/intellij/codeInsight/daemon/impl/HighlightingSessionImpl.java @@ -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) { diff --git a/platform/analysis-impl/src/com/intellij/codeInsight/daemon/impl/TextEditorHighlightingPassRegistrarEx.java b/platform/analysis-impl/src/com/intellij/codeInsight/daemon/impl/TextEditorHighlightingPassRegistrarEx.java index eacb92833d29..6c93bec21dee 100644 --- a/platform/analysis-impl/src/com/intellij/codeInsight/daemon/impl/TextEditorHighlightingPassRegistrarEx.java +++ b/platform/analysis-impl/src/com/intellij/codeInsight/daemon/impl/TextEditorHighlightingPassRegistrarEx.java @@ -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); diff --git a/platform/analysis-impl/src/com/intellij/codeInsight/daemon/impl/TextEditorHighlightingPassRegistrarImpl.java b/platform/analysis-impl/src/com/intellij/codeInsight/daemon/impl/TextEditorHighlightingPassRegistrarImpl.java index 11043800dc2a..62297237bbc5 100644 --- a/platform/analysis-impl/src/com/intellij/codeInsight/daemon/impl/TextEditorHighlightingPassRegistrarImpl.java +++ b/platform/analysis-impl/src/com/intellij/codeInsight/daemon/impl/TextEditorHighlightingPassRegistrarImpl.java @@ -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) { diff --git a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/DaemonListeners.java b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/DaemonListeners.java index e09fb844095c..d585ba018645 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/DaemonListeners.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/DaemonListeners.java @@ -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(); diff --git a/plugins/kotlin/code-insight/inspections-shared/src/org/jetbrains/kotlin/idea/codeInsight/inspections/shared/KotlinUnusedImportInspection.kt b/plugins/kotlin/code-insight/inspections-shared/src/org/jetbrains/kotlin/idea/codeInsight/inspections/shared/KotlinUnusedImportInspection.kt index 9a20087eb070..d8efbdfb788e 100644 --- a/plugins/kotlin/code-insight/inspections-shared/src/org/jetbrains/kotlin/idea/codeInsight/inspections/shared/KotlinUnusedImportInspection.kt +++ b/plugins/kotlin/code-insight/inspections-shared/src/org/jetbrains/kotlin/idea/codeInsight/inspections/shared/KotlinUnusedImportInspection.kt @@ -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