From b9f01f1936e9f2d8f16186e9e2218f3af8a229cf Mon Sep 17 00:00:00 2001 From: Sergei Tachenov Date: Wed, 30 Aug 2023 12:08:57 +0300 Subject: [PATCH] IDEA-319883 Dispose old models in package dependencies Since now a model involves an Invoker, it's not a good idea to keep these models around when they're no longer needed. GitOrigin-RevId: 3210aa491a6a60e9193ef2938556d9251f67f0f4 --- .../ui/DependenciesPanel.java | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/packageDependencies/ui/DependenciesPanel.java b/platform/lang-impl/src/com/intellij/packageDependencies/ui/DependenciesPanel.java index d8ff2a3ac969..5754e04111c2 100644 --- a/platform/lang-impl/src/com/intellij/packageDependencies/ui/DependenciesPanel.java +++ b/platform/lang-impl/src/com/intellij/packageDependencies/ui/DependenciesPanel.java @@ -363,12 +363,20 @@ public final class DependenciesPanel extends JPanel implements Disposable, DataP } } deps.removeAll(scope); - myRightTreeExpansionMonitor.freeze(); - myRightTree.setModel(buildTreeModel(deps, myRightTreeMarker)); - myRightTreeExpansionMonitor.restore(); + replaceModel(myRightTree, buildTreeModel(deps, myRightTreeMarker), myRightTreeExpansionMonitor); expandFirstLevel(myRightTree); } + private static void replaceModel(@NotNull MyTree tree, @NotNull AsyncTreeModel model, @NotNull TreeExpansionMonitor monitor) { + monitor.freeze(); + var oldModel = tree.getModel(); + if (oldModel instanceof Disposable disposable) { + Disposer.dispose(disposable); + } + tree.setModel(model); + monitor.restore(); + } + private ActionGroup createTreePopupActions(boolean isRightTree) { DefaultActionGroup group = new DefaultActionGroup(); final ActionManager actionManager = ActionManager.getInstance(); @@ -398,9 +406,7 @@ public final class DependenciesPanel extends JPanel implements Disposable, DataP private void updateLeftTreeModel() { Set psiFiles = myDependencies.keySet(); - myLeftTreeExpansionMonitor.freeze(); - myLeftTree.setModel(buildTreeModel(psiFiles, myLeftTreeMarker)); - myLeftTreeExpansionMonitor.restore(); + replaceModel(myLeftTree, buildTreeModel(psiFiles, myLeftTreeMarker), myLeftTreeExpansionMonitor); expandFirstLevel(myLeftTree); }