diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/impl/FileStatusMapTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/impl/FileStatusMapTest.java index 5e4e696bcd80..0f376442b6ac 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/impl/FileStatusMapTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/impl/FileStatusMapTest.java @@ -177,7 +177,7 @@ public class FileStatusMapTest extends DaemonAnalyzerTestCase { assertEmpty(highlightErrors()); PsiClass psiClass = ((PsiJavaFile)getFile()).getClasses()[0]; new RenameProcessor(myProject, psiClass, "Class2", false, false).run(); - myDaemonCodeAnalyzer.waitForUpdateFileStatusBackgroundQueueInTests(); + new TestDaemonCodeAnalyzerImpl(getProject()).waitForUpdateFileStatusBackgroundQueueInTests(); TextRange dirty = myDaemonCodeAnalyzer.getFileStatusMap().getFileDirtyScope(document, getFile(), Pass.UPDATE_ALL); assertEquals(getFile().getTextRange(), dirty); @@ -200,7 +200,7 @@ public class FileStatusMapTest extends DaemonAnalyzerTestCase { PsiDocumentManager.getInstance(getProject()).commitAllDocuments(); PsiElement elementAtCaret = myFile.findElementAt(myEditor.getCaretModel().getOffset()); assertTrue(elementAtCaret instanceof PsiWhiteSpace); - myDaemonCodeAnalyzer.waitForUpdateFileStatusBackgroundQueueInTests(); + new TestDaemonCodeAnalyzerImpl(getProject()).waitForUpdateFileStatusBackgroundQueueInTests(); TextRange dirty = myDaemonCodeAnalyzer.getFileStatusMap().getFileDirtyScope(document, getFile(), Pass.UPDATE_ALL); assertEquals(elementAtCaret.getTextRange(), dirty); assertEmpty(highlightErrors()); @@ -272,7 +272,7 @@ public class FileStatusMapTest extends DaemonAnalyzerTestCase { int offset = myEditor.getCaretModel().getOffset(); type(' '); PsiDocumentManager.getInstance(getProject()).commitAllDocuments(); // reset "defensively marked" - myDaemonCodeAnalyzer.waitForUpdateFileStatusBackgroundQueueInTests(); + new TestDaemonCodeAnalyzerImpl(getProject()).waitForUpdateFileStatusBackgroundQueueInTests(); assertEquals(new TextRange(offset-1, offset+1), fileStatusMap.getFileDirtyScope(document, myFile, Pass.LOCAL_INSPECTIONS)); } 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 8104a2cc5bee..fc29570efcf8 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 @@ -1,15 +1,22 @@ // Copyright 2000-2026 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package com.intellij.codeInsight.daemon.impl; -import com.intellij.codeHighlighting.*; +import com.intellij.codeHighlighting.BackgroundEditorHighlighter; +import com.intellij.codeHighlighting.HighlightingPass; import com.intellij.codeHighlighting.Pass; +import com.intellij.codeHighlighting.TextEditorHighlightingPass; +import com.intellij.codeHighlighting.TextEditorHighlightingPassRegistrar; import com.intellij.codeInsight.daemon.DaemonCodeAnalyzerSettings; import com.intellij.codeInsight.daemon.LineMarkerInfo; import com.intellij.codeInsight.daemon.ReferenceImporter; import com.intellij.codeInsight.hint.HintManager; import com.intellij.codeInsight.intention.impl.FileLevelIntentionComponent; import com.intellij.codeInsight.intention.impl.IntentionHintComponent; -import com.intellij.codeInsight.multiverse.*; +import com.intellij.codeInsight.multiverse.CodeInsightContext; +import com.intellij.codeInsight.multiverse.CodeInsightContextHighlightingUtil; +import com.intellij.codeInsight.multiverse.CodeInsightContextUtil; +import com.intellij.codeInsight.multiverse.CodeInsightContexts; +import com.intellij.codeInsight.multiverse.EditorContextManager; import com.intellij.codeInsight.quickfix.LazyQuickFixUpdater; import com.intellij.codeInspection.ex.GlobalInspectionContextBase; import com.intellij.codeWithMe.ClientId; @@ -22,7 +29,11 @@ import com.intellij.lang.annotation.HighlightSeverity; import com.intellij.notebook.editor.BackedVirtualFile; import com.intellij.notebook.editor.BackedVirtualFileProvider; import com.intellij.openapi.Disposable; -import com.intellij.openapi.application.*; +import com.intellij.openapi.application.AccessToken; +import com.intellij.openapi.application.Application; +import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.application.ModalityState; +import com.intellij.openapi.application.ReadAction; import com.intellij.openapi.application.ex.ApplicationManagerEx; import com.intellij.openapi.components.PersistentStateComponent; import com.intellij.openapi.components.State; @@ -40,14 +51,27 @@ import com.intellij.openapi.editor.impl.DocumentMarkupModel; import com.intellij.openapi.editor.impl.EditorMarkupModelImpl; import com.intellij.openapi.editor.markup.MarkupModel; import com.intellij.openapi.editor.markup.RangeHighlighter; -import com.intellij.openapi.fileEditor.*; +import com.intellij.openapi.fileEditor.ClientFileEditorManager; +import com.intellij.openapi.fileEditor.FileDocumentManager; +import com.intellij.openapi.fileEditor.FileEditor; +import com.intellij.openapi.fileEditor.FileEditorManager; +import com.intellij.openapi.fileEditor.FileEditorWithTextEditors; +import com.intellij.openapi.fileEditor.TextEditor; import com.intellij.openapi.fileEditor.impl.text.TextEditorProvider; import com.intellij.openapi.fileTypes.FileType; import com.intellij.openapi.progress.ProcessCanceledException; import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.progress.ProgressManager; -import com.intellij.openapi.project.*; -import com.intellij.openapi.util.*; +import com.intellij.openapi.project.DumbAware; +import com.intellij.openapi.project.DumbService; +import com.intellij.openapi.project.DumbServiceImpl; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.project.ProjectManager; +import com.intellij.openapi.util.Disposer; +import com.intellij.openapi.util.Key; +import com.intellij.openapi.util.Pair; +import com.intellij.openapi.util.ProperTextRange; +import com.intellij.openapi.util.TextRange; import com.intellij.openapi.util.registry.Registry; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.VirtualFile; @@ -59,25 +83,46 @@ import com.intellij.psi.PsiFile; import com.intellij.psi.util.PsiEditorUtil; import com.intellij.psi.util.PsiUtilBase; import com.intellij.psi.util.PsiUtilCore; -import com.intellij.util.*; -import com.intellij.util.concurrency.AppExecutorUtil; +import com.intellij.util.ArrayUtil; +import com.intellij.util.ConcurrencyUtil; +import com.intellij.util.ExceptionUtil; +import com.intellij.util.Processor; +import com.intellij.util.Processors; +import com.intellij.util.SmartList; import com.intellij.util.concurrency.EdtExecutorService; import com.intellij.util.concurrency.ThreadingAssertions; import com.intellij.util.concurrency.annotations.RequiresBackgroundThread; import com.intellij.util.concurrency.annotations.RequiresEdt; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.io.storage.HeavyProcessLatch; -import com.intellij.util.ui.UIUtil; import io.opentelemetry.context.Context; import kotlinx.coroutines.CoroutineScope; import org.jdom.Element; -import org.jetbrains.annotations.*; +import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.NonNls; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.annotations.TestOnly; +import org.jetbrains.annotations.Unmodifiable; +import org.jetbrains.annotations.VisibleForTesting; -import javax.swing.*; -import java.awt.*; -import java.util.*; +import javax.swing.SwingUtilities; +import java.awt.Window; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.HashSet; import java.util.List; -import java.util.concurrent.*; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ForkJoinPool; +import java.util.concurrent.Future; +import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; @@ -95,7 +140,7 @@ public final class DaemonCodeAnalyzerImpl extends DaemonCodeAnalyzerEx private static final @NotNull Key COMPLETE_ESSENTIAL_HIGHLIGHTING_KEY = Key.create("COMPLETE_ESSENTIAL_HIGHLIGHTING"); @NotNull private final Project myProject; private final DaemonCodeAnalyzerSettings mySettings; - private final DaemonListeners myListeners; + final DaemonListeners myListeners; private PsiDocumentManager psiDocumentManager; private FileEditorManager fileEditorManager; private final Map myUpdateProgress = new HashMap<>(); // guarded by `this` lock @@ -1605,11 +1650,6 @@ public final class DaemonCodeAnalyzerImpl extends DaemonCodeAnalyzerEx public boolean isRestartToCompleteEssentialHighlightingRequested() { return completeEssentialHighlightingRequested; } - @TestOnly - public void waitForUpdateFileStatusBackgroundQueueInTests() { - assert ApplicationManager.getApplication().isUnitTestMode(); - myListeners.waitForUpdateFileStatusQueue(); - } @Override @RequiresBackgroundThread diff --git a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/TestDaemonCodeAnalyzerImpl.java b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/TestDaemonCodeAnalyzerImpl.java index ec8814119527..802cb8bc1cb3 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/TestDaemonCodeAnalyzerImpl.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/TestDaemonCodeAnalyzerImpl.java @@ -66,7 +66,8 @@ public final class TestDaemonCodeAnalyzerImpl { public TestDaemonCodeAnalyzerImpl(@NotNull Project project) { myProject = project; - myDaemonCodeAnalyzer = getDaemonCodeAnalyzer(myProject); + myDaemonCodeAnalyzer = (DaemonCodeAnalyzerImpl)DaemonCodeAnalyzer.getInstance(myProject); + assert !myDaemonCodeAnalyzer.myDisposed; } /** @@ -128,7 +129,8 @@ public final class TestDaemonCodeAnalyzerImpl { PsiDocumentManager.getInstance(myProject).commitAllDocuments(); PsiConsistencyAssertions.assertNoFileTextMismatch(psiFile, editor.getDocument(), null); - myDaemonCodeAnalyzer.waitForUpdateFileStatusBackgroundQueueInTests(); // update the file status map before prohibiting its modifications + // update the file status map before prohibiting its modifications + waitForUpdateFileStatusBackgroundQueueInTests(); FileStatusMap fileStatusMap = myDaemonCodeAnalyzer.getFileStatusMap(); fileStatusMap.runAllowingDirt(canChangeDocument, () -> { for (int ignoreId : passesToIgnore) { @@ -144,12 +146,6 @@ public final class TestDaemonCodeAnalyzerImpl { }); } - private static @NotNull DaemonCodeAnalyzerImpl getDaemonCodeAnalyzer(Project project) { - DaemonCodeAnalyzerImpl daemonCodeAnalyzer = (DaemonCodeAnalyzerImpl)DaemonCodeAnalyzer.getInstance(project); - assert !daemonCodeAnalyzer.myDisposed; - return daemonCodeAnalyzer; - } - @TestOnly private void doRunPasses(@NotNull DaemonCodeAnalyzerImpl daemonCodeAnalyzer, @NotNull TextEditor textEditor, @@ -344,4 +340,9 @@ public final class TestDaemonCodeAnalyzerImpl { } while (!future.isDone()); } + @TestOnly + public void waitForUpdateFileStatusBackgroundQueueInTests() { + assert ApplicationManager.getApplication().isUnitTestMode(); + myDaemonCodeAnalyzer.myListeners.waitForUpdateFileStatusQueue(); + } } diff --git a/platform/platform-tests/testSrc/com/intellij/openapi/editor/impl/RangeMarkerTest.java b/platform/platform-tests/testSrc/com/intellij/openapi/editor/impl/RangeMarkerTest.java index 3fb81a47243d..9acb5bd3374f 100644 --- a/platform/platform-tests/testSrc/com/intellij/openapi/editor/impl/RangeMarkerTest.java +++ b/platform/platform-tests/testSrc/com/intellij/openapi/editor/impl/RangeMarkerTest.java @@ -1,8 +1,7 @@ // Copyright 2000-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package com.intellij.openapi.editor.impl; -import com.intellij.codeInsight.daemon.DaemonCodeAnalyzer; -import com.intellij.codeInsight.daemon.impl.DaemonCodeAnalyzerImpl; +import com.intellij.codeInsight.daemon.impl.TestDaemonCodeAnalyzerImpl; import com.intellij.lang.FileASTNode; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.WriteAction; @@ -10,7 +9,12 @@ import com.intellij.openapi.command.CommandProcessor; import com.intellij.openapi.command.WriteCommandAction; import com.intellij.openapi.command.impl.UndoManagerImpl; import com.intellij.openapi.command.undo.UndoManager; -import com.intellij.openapi.editor.*; +import com.intellij.openapi.editor.Document; +import com.intellij.openapi.editor.Editor; +import com.intellij.openapi.editor.EditorFactory; +import com.intellij.openapi.editor.FoldRegion; +import com.intellij.openapi.editor.LazyRangeMarkerFactory; +import com.intellij.openapi.editor.RangeMarker; import com.intellij.openapi.editor.event.DocumentEvent; import com.intellij.openapi.editor.event.DocumentListener; import com.intellij.openapi.editor.ex.DocumentEx; @@ -21,7 +25,11 @@ import com.intellij.openapi.editor.markup.HighlighterTargetArea; import com.intellij.openapi.editor.markup.MarkupModel; import com.intellij.openapi.editor.markup.RangeHighlighter; import com.intellij.openapi.fileEditor.FileDocumentManager; -import com.intellij.openapi.util.*; +import com.intellij.openapi.util.Pair; +import com.intellij.openapi.util.TextRange; +import com.intellij.openapi.util.TextRangeScalarUtil; +import com.intellij.openapi.util.ThrowableComputable; +import com.intellij.openapi.util.Trinity; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiDocumentListener; @@ -29,7 +37,13 @@ import com.intellij.psi.PsiDocumentManager; import com.intellij.psi.PsiFile; import com.intellij.psi.impl.PsiDocumentManagerImpl; import com.intellij.psi.impl.PsiToDocumentSynchronizer; -import com.intellij.testFramework.*; +import com.intellij.testFramework.HeavyPlatformTestCase; +import com.intellij.testFramework.LeakHunter; +import com.intellij.testFramework.LightPlatformTestCase; +import com.intellij.testFramework.PerformanceUnitTest; +import com.intellij.testFramework.PlatformTestUtil; +import com.intellij.testFramework.Timings; +import com.intellij.testFramework.VfsTestUtil; import com.intellij.tools.ide.metrics.benchmark.Benchmark; import com.intellij.util.CommonProcessors; import com.intellij.util.TestTimeOut; @@ -44,7 +58,13 @@ import java.io.IOException; import java.lang.ref.Reference; import java.lang.ref.WeakReference; import java.nio.charset.StandardCharsets; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; +import java.util.Objects; +import java.util.Random; +import java.util.Set; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; import java.util.concurrent.ThreadLocalRandom; @@ -994,8 +1014,7 @@ public class RangeMarkerTest extends LightPlatformTestCase { RangeMarker m3 = document.createRangeMarker(2, 5); assertEquals(2, ((DocumentImpl)document).getRangeMarkersNodeSize()); deleteString(document, 4, 5); - DaemonCodeAnalyzerImpl myDaemonCodeAnalyzer = (DaemonCodeAnalyzerImpl)DaemonCodeAnalyzerImpl.getInstanceEx(getProject()); - myDaemonCodeAnalyzer.waitForUpdateFileStatusBackgroundQueueInTests(); + new TestDaemonCodeAnalyzerImpl(getProject()).waitForUpdateFileStatusBackgroundQueueInTests(); assertTrue(m1.isValid()); assertTrue(m2.isValid()); assertTrue(m3.isValid()); @@ -1559,7 +1578,7 @@ public class RangeMarkerTest extends LightPlatformTestCase { Reference persistentMarkerRef = new WeakReference<>(persistentMarker[0]); marker[0] = null; persistentMarker[0] = null; - ((DaemonCodeAnalyzerImpl)DaemonCodeAnalyzer.getInstance(getProject())).waitForUpdateFileStatusBackgroundQueueInTests(); + new TestDaemonCodeAnalyzerImpl(getProject()).waitForUpdateFileStatusBackgroundQueueInTests(); PsiDocumentManager.getInstance(getProject()).commitAllDocuments(); while (markerRef.get() != null || persistentMarkerRef.get() != null) { GCUtil.tryGcSoftlyReachableObjects();