IDEA-238782 PsiViewerDialog: fix memory leaks and cleanup code

GitOrigin-RevId: 30ceeaaeec6fb59f6a8d634af00b06d237e7bc1a
This commit is contained in:
Piotr Tomiak
2020-04-24 17:25:12 +00:00
committed by intellij-monorepo-bot
parent d0e30d46df
commit 208b694de8
@@ -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<String> 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<String> model = (DefaultListModel<String>)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