From 4d1abd260f465431e9689665ad3c6b9a4e78ece5 Mon Sep 17 00:00:00 2001 From: Peter Gromov Date: Wed, 10 Jun 2020 21:18:43 +0200 Subject: [PATCH] NonBlockingReadActionImpl: use earlyDisposable only on light projects GitOrigin-RevId: 55e7b21a3de95344301f62ad5ba2373e1bd87e2f --- .../impl/NonBlockingReadActionImpl.java | 25 ++++++------------- 1 file changed, 7 insertions(+), 18 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/openapi/application/impl/NonBlockingReadActionImpl.java b/platform/platform-impl/src/com/intellij/openapi/application/impl/NonBlockingReadActionImpl.java index 77460f8ecf26..85eedf987436 100644 --- a/platform/platform-impl/src/com/intellij/openapi/application/impl/NonBlockingReadActionImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/application/impl/NonBlockingReadActionImpl.java @@ -14,7 +14,6 @@ import com.intellij.openapi.application.constraints.BaseConstrainedExecution; import com.intellij.openapi.application.constraints.ConstrainedExecution.ContextConstraint; import com.intellij.openapi.application.ex.ApplicationEx; import com.intellij.openapi.application.ex.ApplicationManagerEx; -import com.intellij.openapi.components.ComponentManager; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.Editor; @@ -25,6 +24,8 @@ import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.progress.ProgressIndicatorProvider; import com.intellij.openapi.progress.util.ProgressIndicatorUtils; import com.intellij.openapi.project.Project; +import com.intellij.openapi.project.ex.ProjectEx; +import com.intellij.openapi.project.impl.ProjectImpl; import com.intellij.openapi.util.Disposer; import com.intellij.openapi.util.Pair; import com.intellij.openapi.util.Ref; @@ -105,12 +106,12 @@ public class NonBlockingReadActionImpl implements NonBlockingReadAction { @Override public NonBlockingReadAction inSmartMode(@NotNull Project project) { - return withConstraint(new InSmartMode(project)).expireWithRWCompliantParent(project); + return withConstraint(new InSmartMode(project)).expireWith(project); } @Override public NonBlockingReadAction withDocumentsCommitted(@NotNull Project project) { - return withConstraint(new WithDocumentsCommitted(project, ModalityState.any())).expireWithRWCompliantParent(project); + return withConstraint(new WithDocumentsCommitted(project, ModalityState.any())).expireWith(project); } @Override @@ -123,25 +124,12 @@ public class NonBlockingReadActionImpl implements NonBlockingReadAction { @NotNull @Override public NonBlockingReadAction expireWith(@NotNull Disposable parentDisposable) { - if (parentDisposable instanceof ComponentManager) { - return expireWithRWCompliantParent((ComponentManager)parentDisposable); - } Set disposables = new HashSet<>(); disposables.add(parentDisposable); return new NonBlockingReadActionImpl<>(myComputation, myEdtFinish, myConstraints, myCancellationConditions, disposables, myCoalesceEquality, myProgressIndicator); } - /** - * App/projects/modules are always disposed in a write action, - * so checking them at computation/finish start is enough - * and allows to avoid querying Disposer, which isn't free. - */ - @NotNull - private NonBlockingReadAction expireWithRWCompliantParent(@NotNull ComponentManager parent) { - return expireWhen(() -> parent.isDisposed()); - } - @Override public NonBlockingReadAction wrapProgress(@NotNull ProgressIndicator progressIndicator) { LOG.assertTrue(myProgressIndicator == null, "Unspecified behaviour. Outer progress indicator is already set for the action."); @@ -234,7 +222,7 @@ public class NonBlockingReadActionImpl implements NonBlockingReadAction { ourTasks.add(this); } for (Disposable parent : myDisposables) { - if (Disposer.isDisposed(parent)) { + if (parent instanceof Project ? ((Project)parent).isDisposed() : Disposer.isDisposed(parent)) { cancel(); break; } @@ -244,7 +232,8 @@ public class NonBlockingReadActionImpl implements NonBlockingReadAction { cancel(); } }; - Disposer.register(parent, child); + //noinspection TestOnlyProblems + Disposer.register(parent instanceof ProjectImpl && ((ProjectEx)parent).isLight() ? ((ProjectImpl)parent).getEarlyDisposable() : parent, child); myExpirationDisposables.add(child); } }