deprecate Disposer.isDisposing() in favor of isDisposed() for consistency and clients...
authorAlexey Kudravtsev <cdr@intellij.com>
Wed, 12 Aug 2020 17:20:29 +0000 (20:20 +0300)
committerintellij-monorepo-bot <intellij-monorepo-bot-no-reply@jetbrains.com>
Wed, 12 Aug 2020 17:37:40 +0000 (17:37 +0000)
GitOrigin-RevId: be03400f05deb6a5a5b36b4e72bf1e38bc151d90

16 files changed:
platform/platform-api/src/com/intellij/openapi/rd/DisposableEx.kt
platform/platform-impl/src/com/intellij/openapi/application/constraints/Expiration.kt
platform/platform-impl/src/com/intellij/openapi/wm/impl/status/StatusPanel.java
platform/projectModel-impl/src/com/intellij/openapi/roots/impl/OrderRootsCache.java
platform/projectModel-impl/src/com/intellij/openapi/roots/impl/ProjectRootManagerImpl.java
platform/rd-platform-community/src/com/intellij/openapi/rd/LifetimeDisposableEx.kt
platform/util/src/com/intellij/openapi/util/Disposer.java
platform/util/testSrc/com/intellij/openapi/util/DisposerTest.java
platform/vcs-log/impl/src/com/intellij/vcs/log/impl/VcsLogTabsManager.java
platform/workspaceModel/ide/src/com/intellij/workspaceModel/ide/impl/WorkspaceModelImpl.kt
platform/workspaceModel/ide/src/com/intellij/workspaceModel/ide/impl/legacyBridge/module/ModifiableModuleModelBridgeImpl.kt
platform/workspaceModel/ide/src/com/intellij/workspaceModel/ide/impl/legacyBridge/project/ProjectRootManagerBridge.kt
platform/workspaceModel/ide/src/com/intellij/workspaceModel/ide/impl/legacyBridge/project/ProjectRootsChangeListener.kt
platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame/XThreadsFramesView.kt
xml/dom-impl/src/com/intellij/util/xml/impl/DomApplicationComponent.java
xml/dom-impl/src/com/intellij/util/xml/impl/ImplementationClassCache.java

index 77ec64d8f22ce7f4e35287e8f97f242770dcdbf6..e97b46a78f8647e7720e95107d28b91ec12e0a5a 100644 (file)
@@ -15,7 +15,7 @@ import org.jetbrains.annotations.ApiStatus
 @Deprecated("Use version from `LifetimeDisposableEx`")
 fun defineNestedLifetime(disposable: Disposable): LifetimeDefinition {
   val lifetimeDefinition = Lifetime.Eternal.createNested()
-  if (Disposer.isDisposing(disposable) || Disposer.isDisposed(disposable)) {
+  if (Disposer.isDisposed(disposable)) {
     lifetimeDefinition.terminate()
     return lifetimeDefinition
   }
index f4702522c8ae0b1f133213efd49a84dad0918397..5d9f7d0c998494ce97a910fa2c0088ab484a2924 100644 (file)
@@ -4,7 +4,6 @@ package com.intellij.openapi.application.constraints
 import com.intellij.openapi.Disposable
 import com.intellij.openapi.WeakReferenceDisposableWrapper
 import com.intellij.openapi.util.Disposer
-import com.intellij.util.IncorrectOperationException
 import com.intellij.util.ObjectUtils
 import kotlinx.coroutines.*
 
@@ -81,7 +80,7 @@ class DisposableExpiration(private val disposable: Disposable) : AbstractExpirat
   }
 
   override val isExpired: Boolean
-    get() = job.isCompleted && disposable.isDisposed
+    get() = job.isCompleted && Disposer.isDisposed(disposable)
 
   override fun equals(other: Any?): Boolean = other is DisposableExpiration && disposable === other.disposable
   override fun hashCode(): Int = System.identityHashCode(disposable)
@@ -111,25 +110,6 @@ fun Expiration.cancelJobOnExpiration(job: Job): Expiration.Handle {
   }
 }
 
-
-internal val Disposable.isDisposed: Boolean
-  get() = Disposer.isDisposed(this)
-internal val Disposable.isDisposing: Boolean
-  get() = Disposer.isDisposing(this)
-
-private fun tryRegisterDisposable(parent: Disposable, child: Disposable): Boolean {
-  if (!parent.isDisposing &&
-      !parent.isDisposed) {
-    try {
-      Disposer.register(parent, child)
-      return true
-    }
-    catch (ignore: IncorrectOperationException) {  // Sorry but Disposer.register() is inherently thread-unsafe
-    }
-  }
-  return false
-}
-
 /**
  * NOTE: there may be a hard ref to the [job] in the returned handle.
  */
@@ -145,7 +125,7 @@ internal fun Disposable.cancelJobOnDisposal(job: Job,
     if (!weaklyReferencedJob) child
     else WeakReferenceDisposableWrapper(child)
 
-  if (!tryRegisterDisposable(this, childRef)) {
+  if (!Disposer.tryRegister(this, childRef)) {
     Disposer.dispose(childRef)  // runs disposableBlock()
     ObjectUtils.reachabilityFence(child)
     return AutoCloseable { }
index 69fa0219dcd7dd4607ad30eb45992d11e2d1c528..e5a6fa82a13094d008e207bdc73da3687dd811e5 100644 (file)
@@ -28,7 +28,6 @@ import com.intellij.openapi.project.Project;
 import com.intellij.openapi.project.ProjectManager;
 import com.intellij.openapi.ui.JBMenuItem;
 import com.intellij.openapi.ui.JBPopupMenu;
-import com.intellij.openapi.util.Disposer;
 import com.intellij.openapi.util.Trinity;
 import com.intellij.openapi.util.text.StringUtil;
 import com.intellij.openapi.wm.IdeFrame;
@@ -193,10 +192,11 @@ class StatusPanel extends JPanel {
   // editor window.
   @Nullable
   private Alarm getAlarm() {
+    ApplicationManager.getApplication().assertIsDispatchThread();
     if (myLogAlarm == null || myLogAlarm.isDisposed()) {
       myLogAlarm = null; //Welcome screen
       Project project = getActiveProject();
-      if (project != null && !project.isDisposed() && !Disposer.isDisposing(project)) {
+      if (project != null && !project.isDisposed()) {
         myLogAlarm = new Alarm(Alarm.ThreadToUse.SWING_THREAD, project);
       }
     }
index 0274c4012ae8781ece12187508da651b3963bcbe..6cb49b9720c76c4e7c66c2c89d954816a2a83863 100644 (file)
@@ -37,7 +37,7 @@ public class OrderRootsCache {
     if (myRootsDisposable != null) {
       Disposer.dispose(myRootsDisposable);
     }
-    if (!Disposer.isDisposing(myParentDisposable)) {
+    if (!Disposer.isDisposed(myParentDisposable)) {
       Disposer.register(myParentDisposable, myRootsDisposable = Disposer.newDisposable());
     }
   }
index 94b0871d1ea10e43212744df50c4e9cb5badd7f9..fe3f4b68750ca565b7cf76e45eba09fa1a6045ef 100644 (file)
@@ -366,7 +366,7 @@ public class ProjectRootManagerImpl extends ProjectRootManagerEx implements Pers
 
   @Override
   public void makeRootsChange(@NotNull Runnable runnable, boolean fileTypes, boolean fireEvents) {
-    if (myProject.isDisposed() || Disposer.isDisposing(myProject)) return;
+    if (myProject.isDisposed()) return;
     BatchSession session = getBatchSession(fileTypes);
     try {
       if (fireEvents) session.beforeRootsChanged();
@@ -409,7 +409,7 @@ public class ProjectRootManagerImpl extends ProjectRootManagerEx implements Pers
   protected void fireBeforeRootsChangeEvent(boolean fileTypes) { }
 
   private boolean fireRootsChanged(boolean fileTypes) {
-    if (myProject.isDisposed() || Disposer.isDisposing(myProject)) return false;
+    if (myProject.isDisposed()) return false;
 
     ApplicationManager.getApplication().assertWriteAccessAllowed();
 
index 23613d1e9ecb6ba2cb317c87cb36040f3699540f..f72735a3bde675308ccbceebc7c698c9062b5669 100644 (file)
@@ -12,7 +12,7 @@ fun Disposable.createLifetime(): Lifetime = this.defineNestedLifetime().lifetime
 
 fun Disposable.defineNestedLifetime(): LifetimeDefinition {
   val lifetimeDefinition = Lifetime.Eternal.createNested()
-  if (Disposer.isDisposing(this) || Disposer.isDisposed(this)) {
+  if (Disposer.isDisposed(this)) {
     lifetimeDefinition.terminate()
     return lifetimeDefinition
   }
index 2694f5d3fcdac7dac25a1712f2004d89d6fe806d..3648a95307facceccd496c6584b45e63b8f5d906 100644 (file)
@@ -65,8 +65,7 @@ public final class Disposer {
    * it's unregistered from {@code oldParent} before registering with {@code parent}.
    *
    * @throws com.intellij.util.IncorrectOperationException If {@code child} has been registered with {@code parent} before;
-   *                                                       if {@code parent} is being disposed ({@link #isDisposing(Disposable)}) or
-   *                                                       already disposed ({@link #isDisposed(Disposable)}.
+   *                                                       if {@code parent} is being disposed or already disposed ({@link #isDisposed(Disposable)}.
    */
   public static void register(@NotNull Disposable parent, @NotNull Disposable child) {
     RuntimeException e = ourTree.register(parent, child);
@@ -106,10 +105,17 @@ public final class Disposer {
     }
   }
 
+  /**
+   * @return true if {@code disposable} is disposed or being disposed (i.e. its {@link Disposable#dispose()} method is executing).
+   */
   public static boolean isDisposed(@NotNull Disposable disposable) {
     return ourTree.getDisposalInfo(disposable) != null;
   }
 
+  /**
+   * @deprecated use {@link #isDisposed(Disposable)} instead
+   */
+  @Deprecated
   public static boolean isDisposing(@NotNull Disposable disposable) {
     return isDisposed(disposable);
   }
index 20c28bb3d3dce1d9b2b6b4cd7fc648f084c6bd10..ffc88bd1450489abce5f2336afdb4f372fc3684d 100644 (file)
@@ -183,11 +183,11 @@ public class DisposerTest extends TestCase {
     };
     Disposer.register(myRoot, disposable);
 
-    assertFalse(Disposer.isDisposing(disposable));
+    assertFalse(Disposer.isDisposed(disposable));
     ExecutorService executor = SequentialTaskExecutor.createSequentialApplicationPoolExecutor(StringUtil.capitalize(getName()));
     Future<?> future = executor.submit(() -> Disposer.dispose(myRoot));
     while (!disposeRun.get());
-    assertTrue(Disposer.isDisposing(disposable));
+    assertTrue(Disposer.isDisposed(disposable));
     assertFalse(future.isDone());
     allowToContinueDispose.set(true);
     future.get();
@@ -201,11 +201,11 @@ public class DisposerTest extends TestCase {
       disposeRun.set(true);
       while (!allowToContinueDispose.get());
     };
-    assertFalse(Disposer.isDisposing(disposable));
+    assertFalse(Disposer.isDisposed(disposable));
     ExecutorService executor = SequentialTaskExecutor.createSequentialApplicationPoolExecutor(StringUtil.capitalize(getName()));
     Future<?> future = executor.submit(() -> Disposer.dispose(disposable));
     while (!disposeRun.get());
-    assertTrue(Disposer.isDisposing(disposable));
+    assertTrue(Disposer.isDisposed(disposable));
     assertFalse(future.isDone());
     allowToContinueDispose.set(true);
     future.get();
index 9423d779268a80a7d17f093dee164e15f213e8db..ce3471bd76930e533150130118beabc2f3b63182 100644 (file)
@@ -158,7 +158,7 @@ public class VcsLogTabsManager {
       MainVcsLogUi ui = myFactory.createLogUi(project, logData);
       myUiProperties.addTab(ui.getId(), myLogWindowKind);
       Disposer.register(ui, () -> {
-        if (Disposer.isDisposing(myProject) || myIsLogDisposing) return; // need to restore the tab after project/log is recreated
+        if (myProject.isDisposed() || myIsLogDisposing) return; // need to restore the tab after project/log is recreated
 
         myUiProperties.removeTab(ui.getId()); // tab is closed by a user
       });
index 240d601e3e3fec5b207f070c4d43a0d32ccbc929..2a35592aeed1892551c33427456daaca97317735 100644 (file)
@@ -63,12 +63,14 @@ class WorkspaceModelImpl(private val project: Project) : WorkspaceModel, Disposa
   override fun dispose() = Unit
 
   private fun onBeforeChanged(change: VersionedStorageChange) {
-    if (project.isDisposed || Disposer.isDisposing(project)) return
+    ApplicationManager.getApplication().assertWriteAccessAllowed()
+    if (project.isDisposed) return
     WorkspaceModelTopics.getInstance(project).syncPublisher(project.messageBus).beforeChanged(change)
   }
 
   private fun onChanged(change: VersionedStorageChange) {
-    if (project.isDisposed || Disposer.isDisposing(project)) return
+    ApplicationManager.getApplication().assertWriteAccessAllowed()
+    if (project.isDisposed) return
     WorkspaceModelTopics.getInstance(project).syncPublisher(project.messageBus).changed(change)
   }
 }
\ No newline at end of file
index ea203605e980e98cfc7fcc659dec5440cf32a8bd..0e84856574397598c83c1447ed976d97de776771 100644 (file)
@@ -160,7 +160,7 @@ internal class ModifiableModuleModelBridgeImpl(
   }
 
   override fun disposeModule(module: Module) {
-    if (Disposer.isDisposing(module.project)) {
+    if (module.project.isDisposed()) {
       //if the project is being disposed now, removing module won't work because WorkspaceModelImpl won't fire events and the module won't be disposed
       //it looks like this may happen in tests only so it's ok to skip removal of the module since the project will be disposed anyway
       return
index 66fe4764bb762c6308294cc0a63adbbf3e3658ad..b9c9e0d91484077219cdb5a207cc9cdb9983b35c 100644 (file)
@@ -40,7 +40,7 @@ class ProjectRootManagerBridge(project: Project) : ProjectRootManagerComponent(p
 
     WorkspaceModelTopics.getInstance(project).subscribeAfterModuleLoading(bus, object : WorkspaceModelChangeListener {
       override fun changed(event: VersionedStorageChange) {
-        if (myProject.isDisposed || Disposer.isDisposing(myProject)) return
+        if (myProject.isDisposed) return
 
         // Roots changed event should be fired for the global libraries linked with module
         val moduleChanges = event.getChanges(ModuleEntity::class.java)
index 7d05e1a0cb35f3280a9b13a9ebf0fa1ffffb93bf..6ded177ba7143d88fdfe4955c92f2f7ea38f01d6 100644 (file)
@@ -1,6 +1,7 @@
 // Copyright 2000-2020 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.workspaceModel.ide.impl.legacyBridge.project
 
+import com.intellij.openapi.application.ApplicationManager
 import com.intellij.openapi.module.ModuleManager
 import com.intellij.openapi.project.Project
 import com.intellij.openapi.roots.LibraryOrderEntry
@@ -13,7 +14,8 @@ import com.intellij.workspaceModel.storage.bridgeEntities.*
 
 internal class ProjectRootsChangeListener(private val project: Project) {
   fun beforeChanged(event: VersionedStorageChange) {
-    if (project.isDisposed || Disposer.isDisposing(project)) return
+    ApplicationManager.getApplication().assertWriteAccessAllowed()
+    if (project.isDisposed) return
     val projectRootManager = ProjectRootManager.getInstance(project)
     if (projectRootManager !is ProjectRootManagerBridge) return
     val performUpdate = shouldFireRootsChanged(event, project)
@@ -21,7 +23,8 @@ internal class ProjectRootsChangeListener(private val project: Project) {
   }
 
   fun changed(event: VersionedStorageChange) {
-    if (project.isDisposed || Disposer.isDisposing(project)) return
+    ApplicationManager.getApplication().assertWriteAccessAllowed()
+    if (project.isDisposed) return
     val projectRootManager = ProjectRootManager.getInstance(project)
     if (projectRootManager !is ProjectRootManagerBridge) return
     val performUpdate = shouldFireRootsChanged(event, project)
index 5afd228c7c5242b3d2fd83814e5a23cb5ec0a1fd..bbdfeb4cf5503fc7052f11cfce378f7576d243d5 100644 (file)
@@ -55,10 +55,7 @@ class XThreadsFramesView(val project: Project) : XDebugView() {
     private const val splitterProportionKey = "XThreadsFramesViewSplitterKey"
     private const val splitterProportionDefaultValue = 0.5f
 
-    private val Disposable.isDisposed get() = Disposer.isDisposed(this)
-    private val Disposable.isDisposing get() = Disposer.isDisposing(this)
-
-    private val Disposable.isAlive get() = !isDisposed && !isDisposing
+    private val Disposable.isAlive get() = !Disposer.isDisposed(this)
     private val Disposable.isNotAlive get() = !isAlive
 
     private fun Disposable.onTermination(disposable: Disposable) = Disposer.register(this, disposable)
index ed3f755acafeb09a97eb0fe09527df9b65f1fe04..3383da136158cf8a134df6cb1ec4adfeee26524f 100644 (file)
@@ -6,7 +6,6 @@ import com.intellij.openapi.application.Application;
 import com.intellij.openapi.application.ApplicationManager;
 import com.intellij.openapi.components.ServiceManager;
 import com.intellij.openapi.extensions.ExtensionPointName;
-import com.intellij.openapi.util.Disposer;
 import com.intellij.openapi.util.text.StringUtil;
 import com.intellij.util.ReflectionAssignabilityCache;
 import com.intellij.util.ReflectionUtil;
@@ -58,7 +57,7 @@ public final class DomApplicationComponent {
 
   private static <T> void addChangeListener(ExtensionPointName<T> ep, Runnable onChange) {
     Application app = ApplicationManager.getApplication();
-    if (Disposer.isDisposing(app)) {
+    if (app.isDisposed()) {
       return;
     }
     ep.addChangeListener(onChange, app);
index 3e537fe6b1986445f3c650dda41b4bba478a7860..c101424ba212eaa89541f060027e6e1532a4b03f 100644 (file)
@@ -35,7 +35,7 @@ final class ImplementationClassCache {
 
   ImplementationClassCache(ExtensionPointName<DomImplementationClassEP> epName) {
     Application app = ApplicationManager.getApplication();
-    if (!Disposer.isDisposing(app)) {
+    if (!app.isDisposed()) {
       epName.getPoint().addExtensionPointListener(new ExtensionPointListener<DomImplementationClassEP>() {
         @Override
         public void extensionAdded(@NotNull DomImplementationClassEP ep, @NotNull PluginDescriptor pluginDescriptor) {