From 9441e756d3aa56353944c9562a3ebd666b4f56be Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Fri, 9 Aug 2024 15:29:49 +0200 Subject: [PATCH] encapsulate TextEditorBackgroundHighlighter.getPasses, since it's dangerous and very implicit-contract-demanding GitOrigin-RevId: cefb97e5a7798ad50e7bcc33da048f5e0e580ba3 --- platform/analysis-impl/api-dump-unreviewed.txt | 1 - .../impl/TextEditorBackgroundHighlighter.kt | 17 ++++++++++++----- ...TextEditorHighlightingPassRegistrarImpl.java | 2 ++ .../daemon/impl/DaemonCodeAnalyzerImpl.java | 7 ++++--- 4 files changed, 18 insertions(+), 9 deletions(-) diff --git a/platform/analysis-impl/api-dump-unreviewed.txt b/platform/analysis-impl/api-dump-unreviewed.txt index 7f327d5f3a26..437983e9545d 100644 --- a/platform/analysis-impl/api-dump-unreviewed.txt +++ b/platform/analysis-impl/api-dump-unreviewed.txt @@ -873,7 +873,6 @@ f:com.intellij.codeInsight.daemon.impl.TextEditorBackgroundHighlighter - com.intellij.codeHighlighting.BackgroundEditorHighlighter - (com.intellij.openapi.project.Project,com.intellij.openapi.editor.Editor):V - createPassesForEditor():com.intellij.codeHighlighting.TextEditorHighlightingPass[] -- f:getPasses(I[]):java.util.List f:com.intellij.codeInsight.daemon.impl.TextEditorHighlightingPassRegistrarImpl - com.intellij.codeHighlighting.TextEditorHighlightingPassRegistrar - sf:EP_NAME:com.intellij.openapi.extensions.ExtensionPointName diff --git a/platform/analysis-impl/src/com/intellij/codeInsight/daemon/impl/TextEditorBackgroundHighlighter.kt b/platform/analysis-impl/src/com/intellij/codeInsight/daemon/impl/TextEditorBackgroundHighlighter.kt index 0c63d4232f87..9baa34e9d8b6 100644 --- a/platform/analysis-impl/src/com/intellij/codeInsight/daemon/impl/TextEditorBackgroundHighlighter.kt +++ b/platform/analysis-impl/src/com/intellij/codeInsight/daemon/impl/TextEditorBackgroundHighlighter.kt @@ -5,7 +5,9 @@ import com.intellij.codeHighlighting.BackgroundEditorHighlighter import com.intellij.codeHighlighting.Pass import com.intellij.codeHighlighting.TextEditorHighlightingPass import com.intellij.codeInsight.daemon.DaemonCodeAnalyzer +import com.intellij.codeInspection.ex.GlobalInspectionContextBase import com.intellij.diagnostic.StartUpMeasurer +import com.intellij.openapi.application.ApplicationManager import com.intellij.openapi.diagnostic.logger import com.intellij.openapi.editor.Editor import com.intellij.openapi.progress.ProcessCanceledException @@ -16,7 +18,7 @@ import com.intellij.psi.PsiDocumentManager import com.intellij.psi.PsiFile import com.intellij.psi.impl.PsiDocumentManagerBase import com.intellij.psi.impl.PsiFileEx -import com.intellij.util.ArrayUtilRt +import com.intellij.util.ArrayUtil import com.intellij.util.containers.toArray import java.util.concurrent.CancellationException @@ -36,7 +38,7 @@ class TextEditorBackgroundHighlighter(private val project: Project, private val return file } - fun getPasses(passesToIgnore: IntArray): List { + private fun createPasses(): List { if (project.isDisposed()) { return emptyList() } @@ -48,14 +50,17 @@ class TextEditorBackgroundHighlighter(private val project: Project, private val var file = renewFile() ?: return emptyList() - var effectivePassesToIgnore = passesToIgnore + val effectivePassesToIgnore = if (file is PsiCompiledFile) { file = file.getDecompiledPsiFile() - effectivePassesToIgnore = IGNORE_FOR_COMPILED + IGNORE_FOR_COMPILED } else if (!DaemonCodeAnalyzer.getInstance(project).isHighlightingAvailable(file)) { return emptyList() } + else { + ArrayUtil.EMPTY_INT_ARRAY + } HighlightingPassTracer.HIGHLIGHTING_PASS_TRACER.spanBuilder("passes instantiation").use { span -> val startupActivity = StartUpMeasurer.startActivity("highlighting passes instantiation") @@ -81,7 +86,9 @@ class TextEditorBackgroundHighlighter(private val project: Project, private val } override fun createPassesForEditor(): Array { - val passes = getPasses(ArrayUtilRt.EMPTY_INT_ARRAY) + ApplicationManager.getApplication().assertIsNonDispatchThread() + GlobalInspectionContextBase.assertUnderDaemonProgress() + val passes = createPasses() return if (passes.isEmpty()) TextEditorHighlightingPass.EMPTY_ARRAY else passes.toArray(TextEditorHighlightingPass.EMPTY_ARRAY) } } \ No newline at end of file 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 7341c184e7f1..8f718df60a19 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 @@ -3,6 +3,7 @@ package com.intellij.codeInsight.daemon.impl; import com.intellij.codeHighlighting.*; import com.intellij.codeInsight.daemon.ProblemHighlightFilter; +import com.intellij.codeInspection.ex.GlobalInspectionContextBase; import com.intellij.codeWithMe.ClientId; import com.intellij.openapi.application.AccessToken; import com.intellij.openapi.application.ApplicationManager; @@ -161,6 +162,7 @@ public final class TextEditorHighlightingPassRegistrarImpl extends TextEditorHig @NotNull Editor editor, int @NotNull [] passesToIgnore) { ApplicationManager.getApplication().assertIsNonDispatchThread(); + GlobalInspectionContextBase.assertUnderDaemonProgress(); PsiDocumentManager documentManager = PsiDocumentManager.getInstance(myProject); Document document = editor.getDocument(); PsiFile fileFromDoc = documentManager.getPsiFile(document); 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 a80a38e72817..ffa47f533bd5 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 @@ -1274,9 +1274,10 @@ public final class DaemonCodeAnalyzerImpl extends DaemonCodeAnalyzerEx } session.additionalSetupFromBackground(psiFile); try (AccessToken ignored = ClientId.withClientId(ClientFileEditorManager.getClientId(fileEditor))) { - HighlightingPass[] r = backgroundEditorHighlighter instanceof TextEditorBackgroundHighlighter textHighlighter ? - textHighlighter.getPasses(passesToIgnore).toArray(HighlightingPass.EMPTY_ARRAY) : - backgroundEditorHighlighter.createPassesForEditor(); + HighlightingPass[] r = backgroundEditorHighlighter.createPassesForEditor(); + if (passesToIgnore.length != 0) { + r = ContainerUtil.findAllAsArray(r, pass->!(pass instanceof TextEditorHighlightingPass te) || ArrayUtil.indexOf(passesToIgnore, te.getId()) == -1); + } if (heavyProcessIsRunning) { r = ContainerUtil.findAllAsArray(r, o -> DumbService.isDumbAware(o)); }