tests memory leak

This commit is contained in:
Alexey Kudravtsev
2013-08-07 14:33:51 +04:00
parent ab1492f527
commit 0c8af20f31
4 changed files with 65 additions and 65 deletions
@@ -180,12 +180,12 @@ public abstract class CompletionPhase implements Disposable {
}
}, this);
if (indicator.isAutopopupCompletion()) {
// lookup is not visible, we have to check ourselves if editor retains focus
// lookup is not visible, we have to check ourselves if editor retains focus
((EditorEx)indicator.getEditor()).addFocusListener(new FocusChangeListener() {
@Override
public void focusGained(Editor editor) {
}
@Override
public void focusLost(Editor editor) {
indicator.closeAndFinish(true);
@@ -318,14 +318,12 @@ public abstract class CompletionPhase implements Disposable {
private final Project project;
private final EditorMouseAdapter mouseListener;
private final CaretListener caretListener;
private final DocumentAdapter documentListener;
private final PropertyChangeListener lookupListener;
private final SelectionListener selectionListener;
public EmptyAutoPopup(CompletionProgressIndicator indicator) {
super(indicator);
this.editor = indicator.getEditor();
this.project = indicator.getProject();
editor = indicator.getEditor();
project = indicator.getProject();
MessageBusConnection connection = project.getMessageBus().connect(this);
connection.subscribe(FileEditorManagerListener.FILE_EDITOR_MANAGER, new FileEditorManagerAdapter() {
@Override
@@ -355,26 +353,24 @@ public abstract class CompletionPhase implements Disposable {
stopAutoPopup();
}
};
documentListener = new DocumentAdapter() {
editor.addEditorMouseListener(mouseListener);
editor.getCaretModel().addCaretListener(caretListener);
editor.getDocument().addDocumentListener(new DocumentAdapter() {
@Override
public void documentChanged(DocumentEvent e) {
if (!TypedAction.isTypedActionInProgress()) {
stopAutoPopup();
}
}
};
lookupListener = new PropertyChangeListener() {
}, this);
editor.getSelectionModel().addSelectionListener(selectionListener);
LookupManager.getInstance(project).addPropertyChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
stopAutoPopup();
}
};
editor.addEditorMouseListener(mouseListener);
editor.getCaretModel().addCaretListener(caretListener);
editor.getDocument().addDocumentListener(documentListener);
editor.getSelectionModel().addSelectionListener(selectionListener);
LookupManager.getInstance(project).addPropertyChangeListener(lookupListener);
}, this);
}
@Override
@@ -382,8 +378,6 @@ public abstract class CompletionPhase implements Disposable {
editor.removeEditorMouseListener(mouseListener);
editor.getCaretModel().removeCaretListener(caretListener);
editor.getSelectionModel().removeSelectionListener(selectionListener);
editor.getDocument().removeDocumentListener(documentListener);
LookupManager.getInstance(project).removePropertyChangeListener(lookupListener);
}
private static void stopAutoPopup() {
@@ -48,18 +48,15 @@ import java.beans.PropertyChangeListener;
import java.util.ArrayList;
import java.util.List;
public class ParameterInfoController {
public class ParameterInfoController implements Disposable {
private final Project myProject;
@NotNull private final Editor myEditor;
private final String myParameterCloseChars;
private final RangeMarker myLbraceMarker;
private final LightweightHint myHint;
private final ParameterInfoComponent myComponent;
private final CaretListener myEditorCaretListener;
private final DocumentListener myEditorDocumentListener;
private final PropertyChangeListener myLookupListener;
@NotNull private final ParameterInfoHandler<Object, Object> myHandler;
private final ShowParameterInfoHandler.BestLocationPointProvider myProvider;
@@ -71,16 +68,16 @@ public class ParameterInfoController {
/**
* Keeps Vector of ParameterInfoController's in Editor
*/
private static final Key<ArrayList<ParameterInfoController>> ALL_CONTROLLERS_KEY = Key.create("ParameterInfoController.ALL_CONTROLLERS_KEY");
private static final Key<List<ParameterInfoController>> ALL_CONTROLLERS_KEY = Key.create("ParameterInfoController.ALL_CONTROLLERS_KEY");
public static ParameterInfoController findControllerAtOffset(Editor editor, int offset) {
ArrayList<ParameterInfoController> allControllers = getAllControllers(editor);
List<ParameterInfoController> allControllers = getAllControllers(editor);
for (int i = 0; i < allControllers.size(); ++i) {
ParameterInfoController controller = allControllers.get(i);
if (controller.myLbraceMarker.getStartOffset() == offset) {
if (controller.myHint.isVisible()) return controller;
controller.dispose();
Disposer.dispose(controller);
--i;
}
}
@@ -147,8 +144,8 @@ public class ParameterInfoController {
}
}
private static ArrayList<ParameterInfoController> getAllControllers(@NotNull Editor editor) {
ArrayList<ParameterInfoController> array = editor.getUserData(ALL_CONTROLLERS_KEY);
private static List<ParameterInfoController> getAllControllers(@NotNull Editor editor) {
List<ParameterInfoController> array = editor.getUserData(ALL_CONTROLLERS_KEY);
if (array == null){
array = new ArrayList<ParameterInfoController>();
editor.putUserData(ALL_CONTROLLERS_KEY, array);
@@ -170,12 +167,11 @@ public class ParameterInfoController {
myEditor = editor;
myHandler = handler;
myProvider = provider;
myParameterCloseChars = handler.getParameterCloseChars();
myLbraceMarker = editor.getDocument().createRangeMarker(lbraceOffset, lbraceOffset);
myHint = hint;
myComponent = (ParameterInfoComponent)myHint.getComponent();
ArrayList<ParameterInfoController> allControllers = getAllControllers(myEditor);
List<ParameterInfoController> allControllers = getAllControllers(myEditor);
allControllers.add(this);
myEditorCaretListener = new CaretListener(){
@@ -187,53 +183,46 @@ public class ParameterInfoController {
};
myEditor.getCaretModel().addCaretListener(myEditorCaretListener);
myEditorDocumentListener = new DocumentAdapter(){
myEditor.getDocument().addDocumentListener(new DocumentAdapter() {
@Override
public void documentChanged(DocumentEvent e) {
myAlarm.cancelAllRequests();
addAlarmRequest();
}
};
myEditor.getDocument().addDocumentListener(myEditorDocumentListener);
}, this);
myLookupListener = new PropertyChangeListener() {
PropertyChangeListener lookupListener = new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
if (LookupManager.PROP_ACTIVE_LOOKUP.equals(evt.getPropertyName())){
if (LookupManager.PROP_ACTIVE_LOOKUP.equals(evt.getPropertyName())) {
final LookupImpl lookup = (LookupImpl)evt.getNewValue();
if (lookup != null && lookup.isShown()){
if (lookup != null && lookup.isShown()) {
adjustPositionForLookup(lookup);
}
}
}
};
LookupManager.getInstance(project).addPropertyChangeListener(myLookupListener);
LookupManager.getInstance(project).addPropertyChangeListener(lookupListener, this);
updateComponent();
if (myEditor instanceof EditorImpl) {
Disposer.register(((EditorImpl)myEditor).getDisposable(), new Disposable() {
@Override
public void dispose() {
ParameterInfoController.this.dispose();
}
});
Disposer.register(((EditorImpl)myEditor).getDisposable(), this);
}
}
private void dispose(){
@Override
public void dispose(){
if (myDisposed) return;
myDisposed = true;
ArrayList<ParameterInfoController> allControllers = getAllControllers(myEditor);
List<ParameterInfoController> allControllers = getAllControllers(myEditor);
allControllers.remove(this);
myEditor.getCaretModel().removeCaretListener(myEditorCaretListener);
myEditor.getDocument().removeDocumentListener(myEditorDocumentListener);
LookupManager.getInstance(myProject).removePropertyChangeListener(myLookupListener);
}
private void adjustPositionForLookup(@NotNull Lookup lookup) {
if (!myHint.isVisible() || myEditor.isDisposed()) {
dispose();
Disposer.dispose(this);
return;
}
@@ -259,7 +248,7 @@ public class ParameterInfoController {
private void updateComponent(){
if (!myHint.isVisible()){
dispose();
Disposer.dispose(this);
return;
}
@@ -382,7 +371,7 @@ public class ParameterInfoController {
@Override
public void removeHint() {
myHint.hide();
dispose();
Disposer.dispose(ParameterInfoController.this);
}
@Override
@@ -16,6 +16,7 @@
package com.intellij.codeInsight.lookup;
import com.intellij.openapi.Disposable;
import com.intellij.openapi.components.ServiceManager;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.project.Project;
@@ -45,18 +46,20 @@ public abstract class LookupManager {
}
@Nullable
public LookupEx showLookup(Editor editor, @NotNull LookupElement... items) {
public LookupEx showLookup(@NotNull Editor editor, @NotNull LookupElement... items) {
return showLookup(editor, items, "", new LookupArranger.DefaultArranger());
}
@Nullable
public LookupEx showLookup(Editor editor, @NotNull LookupElement[] items, @NotNull String prefix) {
public LookupEx showLookup(@NotNull Editor editor, @NotNull LookupElement[] items, @NotNull String prefix) {
return showLookup(editor, items, prefix, new LookupArranger.DefaultArranger());
}
@Nullable
public abstract LookupEx showLookup(Editor editor, @NotNull LookupElement[] items,
@NotNull String prefix, @NotNull LookupArranger arranger);
public abstract LookupEx showLookup(@NotNull Editor editor,
@NotNull LookupElement[] items,
@NotNull String prefix,
@NotNull LookupArranger arranger);
public abstract void hideActiveLookup();
@@ -65,11 +68,11 @@ public abstract class LookupManager {
@NonNls public static final String PROP_ACTIVE_LOOKUP = "activeLookup";
public abstract void addPropertyChangeListener(PropertyChangeListener listener);
public abstract void removePropertyChangeListener(PropertyChangeListener listener);
public abstract void addPropertyChangeListener(@NotNull PropertyChangeListener listener);
public abstract void addPropertyChangeListener(@NotNull PropertyChangeListener listener, @NotNull Disposable disposable);
public abstract void removePropertyChangeListener(@NotNull PropertyChangeListener listener);
//public abstract boolean isDisposed();
public abstract Lookup createLookup(Editor editor, @NotNull LookupElement[] items, @NotNull final String prefix, LookupArranger arranger);
@NotNull
public abstract Lookup createLookup(@NotNull Editor editor, @NotNull LookupElement[] items, @NotNull final String prefix, @NotNull LookupArranger arranger);
}
@@ -25,6 +25,7 @@ import com.intellij.codeInsight.documentation.DocumentationManager;
import com.intellij.codeInsight.hint.EditorHintListener;
import com.intellij.codeInsight.hint.HintManager;
import com.intellij.codeInsight.lookup.*;
import com.intellij.openapi.Disposable;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.editor.Editor;
@@ -110,7 +111,7 @@ public class LookupManagerImpl extends LookupManager {
}
@Override
public LookupEx showLookup(final Editor editor,
public LookupEx showLookup(@NotNull final Editor editor,
@NotNull LookupElement[] items,
@NotNull final String prefix,
@NotNull final LookupArranger arranger) {
@@ -119,11 +120,12 @@ public class LookupManagerImpl extends LookupManager {
}
LookupImpl lookup = createLookup(editor, items, prefix, arranger);
return lookup != null && lookup.showLookup() ? lookup : null;
return lookup.showLookup() ? lookup : null;
}
@NotNull
@Override
public LookupImpl createLookup(final Editor editor,
public LookupImpl createLookup(@NotNull final Editor editor,
@NotNull LookupElement[] items,
@NotNull final String prefix,
@NotNull final LookupArranger arranger) {
@@ -213,12 +215,13 @@ public class LookupManagerImpl extends LookupManager {
myActiveLookup.addItem(item, matcher);
}
myActiveLookup.refreshUi(true, true);
} else {
}
else {
alarm.cancelAllRequests(); // no items -> no doc
}
myPropertyChangeSupport.firePropertyChange(PROP_ACTIVE_LOOKUP, null, myActiveLookup);
return myActiveLookup;
return lookup;
}
@Override
@@ -243,12 +246,23 @@ public class LookupManagerImpl extends LookupManager {
}
@Override
public void addPropertyChangeListener(PropertyChangeListener listener) {
public void addPropertyChangeListener(@NotNull PropertyChangeListener listener) {
myPropertyChangeSupport.addPropertyChangeListener(listener);
}
@Override
public void removePropertyChangeListener(PropertyChangeListener listener) {
public void addPropertyChangeListener(@NotNull final PropertyChangeListener listener, @NotNull Disposable disposable) {
addPropertyChangeListener(listener);
Disposer.register(disposable, new Disposable() {
@Override
public void dispose() {
removePropertyChangeListener(listener);
}
});
}
@Override
public void removePropertyChangeListener(@NotNull PropertyChangeListener listener) {
myPropertyChangeSupport.removePropertyChangeListener(listener);
}