From 208b694de8b31e1f83d264011352c4bf1d0b2040 Mon Sep 17 00:00:00 2001 From: Piotr Tomiak Date: Fri, 24 Apr 2020 19:05:12 +0200 Subject: [PATCH] IDEA-238782 PsiViewerDialog: fix memory leaks and cleanup code GitOrigin-RevId: 30ceeaaeec6fb59f6a8d634af00b06d237e7bc1a --- .../internal/psiView/PsiViewerDialog.java | 41 ++++++++----------- 1 file changed, 16 insertions(+), 25 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/internal/psiView/PsiViewerDialog.java b/platform/lang-impl/src/com/intellij/internal/psiView/PsiViewerDialog.java index be53352a50f6..3822c91e2c6e 100644 --- a/platform/lang-impl/src/com/intellij/internal/psiView/PsiViewerDialog.java +++ b/platform/lang-impl/src/com/intellij/internal/psiView/PsiViewerDialog.java @@ -8,7 +8,6 @@ import com.intellij.lang.ASTNode; import com.intellij.lang.Language; import com.intellij.lang.LanguageUtil; import com.intellij.lang.injection.InjectedLanguageManager; -import com.intellij.openapi.Disposable; import com.intellij.openapi.actionSystem.CommonDataKeys; import com.intellij.openapi.actionSystem.DataProvider; import com.intellij.openapi.application.ApplicationManager; @@ -84,7 +83,7 @@ import static com.intellij.openapi.wm.IdeFocusManager.getGlobalInstance; /** * @author Konstantin Bulenkov */ -public class PsiViewerDialog extends DialogWrapper implements DataProvider, Disposable { +public class PsiViewerDialog extends DialogWrapper implements DataProvider { private static final String REFS_CACHE = "References Resolve Cache"; public static final Color BOX_COLOR = new JBColor(new Color(0xFC6C00), new Color(0xDE6C01)); public static final Logger LOG = Logger.getInstance(PsiViewerDialog.class); @@ -104,7 +103,7 @@ public class PsiViewerDialog extends DialogWrapper implements DataProvider, Disp private JSplitPane myTreeSplit; private Tree myPsiTree; private ViewerTreeBuilder myPsiTreeBuilder; - private final JList myRefs; + private final JList myRefs; private TitledSeparator myTextSeparator; private TitledSeparator myPsiTreeSeparator; @@ -124,7 +123,6 @@ public class PsiViewerDialog extends DialogWrapper implements DataProvider, Disp private int myLastParsedTextHashCode = 17; private int myNewDocumentHashCode = 11; - private final boolean myExternalDocument; @NotNull @@ -155,7 +153,7 @@ public class PsiViewerDialog extends DialogWrapper implements DataProvider, Disp myProject = project; myExternalDocument = selectedEditor != null; myTabs = createTabPanel(project); - myRefs = new JBList(new DefaultListModel()); + myRefs = new JBList<>(new DefaultListModel<>()); ViewerPsiBasedTree.PsiTreeUpdater psiTreeUpdater = new ViewerPsiBasedTree.PsiTreeUpdater() { private final TextAttributes myAttributes; @@ -188,6 +186,8 @@ public class PsiViewerDialog extends DialogWrapper implements DataProvider, Disp }; myStubTree = new StubViewerPsiBasedTree(project, psiTreeUpdater); myBlockTree = new BlockViewerPsiBasedTree(project, psiTreeUpdater); + Disposer.register(getDisposable(), myStubTree); + Disposer.register(getDisposable(), myBlockTree); setOKButtonText("&Build PSI Tree"); setCancelButtonText("&Close"); @@ -225,7 +225,6 @@ public class PsiViewerDialog extends DialogWrapper implements DataProvider, Disp return tabs; } - @Override protected void init() { initMnemonics(); @@ -310,16 +309,20 @@ public class PsiViewerDialog extends DialogWrapper implements DataProvider, Disp }); myEditor.getSettings().setFoldingOutlineShown(false); - myEditor.getDocument().addDocumentListener(myEditorListener); + myEditor.getDocument().addDocumentListener(myEditorListener, getDisposable()); myEditor.getSelectionModel().addSelectionListener(myEditorListener); myEditor.getCaretModel().addCaretListener(myEditorListener); + FocusTraversalPolicy oldPolicy = getPeer().getWindow().getFocusTraversalPolicy(); getPeer().getWindow().setFocusTraversalPolicy(new LayoutFocusTraversalPolicy() { @Override public Component getInitialComponent(@NotNull Window window) { return myEditor.getComponent(); } }); + Disposer.register(getDisposable(), () -> { + getPeer().getWindow().setFocusTraversalPolicy(oldPolicy); + }); VirtualFile file = myExternalDocument ? FileDocumentManager.getInstance().getFile(myEditor.getDocument()) : null; Language curLanguage = LanguageUtil.getLanguageForPsi(myProject, file); @@ -716,10 +719,7 @@ public class PsiViewerDialog extends DialogWrapper implements DataProvider, Disp } } else if (myRefs.hasFocus()) { - final Object value = myRefs.getSelectedValue(); - if (value instanceof String) { - fqn = (String)value; - } + fqn = myRefs.getSelectedValue(); } if (fqn != null) { return getContainingFileForClass(fqn); @@ -783,11 +783,11 @@ public class PsiViewerDialog extends DialogWrapper implements DataProvider, Disp public void updateReferences(PsiElement element) { - final DefaultListModel model = (DefaultListModel)myRefs.getModel(); + final DefaultListModel model = (DefaultListModel)myRefs.getModel(); model.clear(); final Object cache = myRefs.getClientProperty(REFS_CACHE); if (cache instanceof Map) { - ((Map)cache).clear(); + ((Map)cache).clear(); } else { myRefs.putClientProperty(REFS_CACHE, new HashMap()); @@ -825,13 +825,9 @@ public class PsiViewerDialog extends DialogWrapper implements DataProvider, Disp @Override public void dispose() { - Disposer.dispose(myPsiTreeBuilder); - if (!myEditor.isDisposed()) { EditorFactory.getInstance().releaseEditor(myEditor); } - Disposer.dispose(myBlockTree); - Disposer.dispose(myStubTree); super.dispose(); } @@ -896,16 +892,11 @@ public class PsiViewerDialog extends DialogWrapper implements DataProvider, Disp private class GoToListener implements KeyListener, MouseListener, ListSelectionListener { private RangeHighlighter myListenerHighlighter; - private final TextAttributes myAttributes = - new TextAttributes(JBColor.RED, null, null, null, Font.PLAIN); private void navigate() { - final Object value = myRefs.getSelectedValue(); - if (value instanceof String) { - final String fqn = (String)value; - final PsiFile file = getContainingFileForClass(fqn); - if (file != null) file.navigate(true); - } + final String fqn = myRefs.getSelectedValue(); + final PsiFile file = getContainingFileForClass(fqn); + if (file != null) file.navigate(true); } @Override