From 36e0f786c3e19c940b5ccc02415eef7aed4a8f30 Mon Sep 17 00:00:00 2001 From: Yuriy Artamonov Date: Sun, 27 Oct 2024 15:36:34 +0100 Subject: [PATCH] [editor] IJPL-165302 Use minimum safe auto reparse delay instead of 0 (cherry picked from commit b68b251f0df2a9dc8c4a6df654d0bf6f57016da2) IJ-CR-147882 GitOrigin-RevId: 06a2e91b278f1c6380892906dfd2b9283bf16e84 --- .../daemon/DaemonCodeAnalyzerSettings.java | 18 ++++++++++++++++++ .../daemon/impl/DaemonCodeAnalyzerImpl.java | 8 ++++---- .../daemon/impl/MainPassesRunner.java | 5 ++--- .../impl/CodeInsightTestFixtureImpl.java | 5 ++--- 4 files changed, 26 insertions(+), 10 deletions(-) diff --git a/platform/analysis-impl/src/com/intellij/codeInsight/daemon/DaemonCodeAnalyzerSettings.java b/platform/analysis-impl/src/com/intellij/codeInsight/daemon/DaemonCodeAnalyzerSettings.java index dedec7aac383..48ea8f5578d9 100644 --- a/platform/analysis-impl/src/com/intellij/codeInsight/daemon/DaemonCodeAnalyzerSettings.java +++ b/platform/analysis-impl/src/com/intellij/codeInsight/daemon/DaemonCodeAnalyzerSettings.java @@ -4,15 +4,20 @@ package com.intellij.codeInsight.daemon; import com.intellij.openapi.application.ApplicationManager; import com.intellij.util.xmlb.annotations.OptionTag; import com.intellij.util.xmlb.annotations.Transient; +import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NonNls; public class DaemonCodeAnalyzerSettings { + private static final int SAFE_AUTO_REPARSE_DELAY_MS = 100; + private boolean myNextErrorActionGoesToErrorsFirst = true; private int myAutoReparseDelay = 300; private int myErrorStripeMarkMinHeight = 2; private boolean mySuppressWarnings = true; + private boolean myUseZeroAutoReparseDelay = false; + public static DaemonCodeAnalyzerSettings getInstance() { return ApplicationManager.getApplication().getService(DaemonCodeAnalyzerSettings.class); } @@ -32,10 +37,23 @@ public class DaemonCodeAnalyzerSettings { return myAutoReparseDelay; } + @ApiStatus.Internal + public int chooseSafeAutoReparseDelay() { + if (myUseZeroAutoReparseDelay) return 0; + if (ApplicationManager.getApplication().isUnitTestMode()) return myAutoReparseDelay; + + return Math.max(myAutoReparseDelay, SAFE_AUTO_REPARSE_DELAY_MS); + } + public void setAutoReparseDelay(int millis) { myAutoReparseDelay = millis; } + @ApiStatus.Internal + public void forceUseZeroAutoReparseDelay(boolean useZeroAutoReparseDelay) { + myUseZeroAutoReparseDelay = useZeroAutoReparseDelay; + } + @OptionTag("ERROR_STRIPE_MARK_MIN_HEIGHT") public int getErrorStripeMarkMinHeight() { return myErrorStripeMarkMinHeight; 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 bcb674801635..c9361e4434e6 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,8 +1,8 @@ // Copyright 2000-2024 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.Pass; import com.intellij.codeHighlighting.*; +import com.intellij.codeHighlighting.Pass; import com.intellij.codeInsight.daemon.DaemonCodeAnalyzerSettings; import com.intellij.codeInsight.daemon.DaemonCodeAnalyzerSettingsImpl; import com.intellij.codeInsight.daemon.LineMarkerInfo; @@ -88,8 +88,8 @@ import org.jetbrains.annotations.*; import javax.swing.*; import java.awt.*; -import java.util.List; import java.util.*; +import java.util.List; import java.util.concurrent.*; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; @@ -914,9 +914,9 @@ public final class DaemonCodeAnalyzerImpl extends DaemonCodeAnalyzerEx } private void scheduleIfNotRunning() { - long autoReparseDelayNanos = TimeUnit.MILLISECONDS.toNanos(mySettings.getAutoReparseDelay()); + long autoReparseDelayNanos = TimeUnit.MILLISECONDS.toNanos(mySettings.chooseSafeAutoReparseDelay()); myScheduledUpdateTimestamp = System.nanoTime() + autoReparseDelayNanos; - // optimisation: this check is to avoid too many re-schedules in case of thousands of event spikes + // optimization: this check is to avoid too many re-schedules in case of thousands of event spikes boolean isDone = myUpdateRunnableFuture.isDone(); LOG.debug("Rescheduling highlighting: isDone ", isDone); if (isDone) { diff --git a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/MainPassesRunner.java b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/MainPassesRunner.java index 114a2f2a9cd7..07b7d74a732a 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/MainPassesRunner.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/MainPassesRunner.java @@ -190,10 +190,9 @@ public final class MainPassesRunner { // repeat several times when accidental background activity cancels highlighting int retries = 100; for (int i = 0; i < retries; i++) { - int oldDelay = settings.getAutoReparseDelay(); try { InspectionProfile currentProfile = myInspectionProfile; - settings.setAutoReparseDelay(0); + settings.forceUseZeroAutoReparseDelay(true); Function profileProvider = p -> currentProfile == null ? new InspectionProfileWrapper((InspectionProfileImpl)p) @@ -214,7 +213,7 @@ public final class MainPassesRunner { exception = e; } finally { - settings.setAutoReparseDelay(oldDelay); + settings.forceUseZeroAutoReparseDelay(false); } } if (exception != null) { diff --git a/platform/testFramework/src/com/intellij/testFramework/fixtures/impl/CodeInsightTestFixtureImpl.java b/platform/testFramework/src/com/intellij/testFramework/fixtures/impl/CodeInsightTestFixtureImpl.java index 01a90a3c8216..02bb709eee43 100644 --- a/platform/testFramework/src/com/intellij/testFramework/fixtures/impl/CodeInsightTestFixtureImpl.java +++ b/platform/testFramework/src/com/intellij/testFramework/fixtures/impl/CodeInsightTestFixtureImpl.java @@ -286,9 +286,8 @@ public class CodeInsightTestFixtureImpl extends BaseFixture implements CodeInsig Throwable exception = null; int retries = 1000; for (int i = 0; i < retries; i++) { - int oldDelay = settings.getAutoReparseDelay(); try { - settings.setAutoReparseDelay(0); + settings.forceUseZeroAutoReparseDelay(true); List infos = new ArrayList<>(); EdtTestUtil.runInEdtAndWait(() -> { codeAnalyzer.runPasses(psiFile, editor.getDocument(), textEditor, toIgnore, canChangeDocument, null); @@ -328,7 +327,7 @@ public class CodeInsightTestFixtureImpl extends BaseFixture implements CodeInsig exception = e; } finally { - settings.setAutoReparseDelay(oldDelay); + settings.forceUseZeroAutoReparseDelay(false); } } ExceptionUtil.rethrow(exception);