don't let context be gc-ed while goto popup is active (fixes one case of ChooseByNameTest blinking)

This commit is contained in:
peter
2015-11-20 18:55:00 +01:00
parent 7ed39bf193
commit f1f3e39d56
2 changed files with 13 additions and 9 deletions
@@ -323,9 +323,11 @@ class Intf {
myPopup.close(false)
}
def popup = myPopup = ChooseByNamePopup.createPopup(project, model, (PsiElement)context, "")
Disposer.register(testRootDisposable, { popup.close(false) } as Disposable)
popup
edt {
def popup = myPopup = ChooseByNamePopup.createPopup(project, model, (PsiElement)context, "")
Disposer.register(testRootDisposable, { popup.close(false) } as Disposable)
}
myPopup
}
@Override
@@ -26,6 +26,8 @@ import com.intellij.openapi.util.TextRange;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.PsiCompiledElement;
import com.intellij.psi.PsiElement;
import com.intellij.psi.SmartPointerManager;
import com.intellij.psi.SmartPsiElementPointer;
import com.intellij.psi.codeStyle.MinusculeMatcher;
import com.intellij.psi.codeStyle.NameUtil;
import com.intellij.psi.search.GlobalSearchScope;
@@ -38,16 +40,14 @@ import com.intellij.util.indexing.IdFilter;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.lang.ref.Reference;
import java.lang.ref.WeakReference;
import java.util.*;
public class DefaultChooseByNameItemProvider implements ChooseByNameItemProvider {
private static final Logger LOG = Logger.getInstance("#com.intellij.ide.util.gotoByName.ChooseByNameIdea");
private final Reference<PsiElement> myContext;
private final SmartPsiElementPointer myContext;
public DefaultChooseByNameItemProvider(PsiElement context) {
myContext = new WeakReference<PsiElement>(context);
public DefaultChooseByNameItemProvider(@Nullable PsiElement context) {
myContext = context == null ? null : SmartPointerManager.getInstance(context.getProject()).createSmartPsiElementPointer(context);
}
@Override
@@ -110,7 +110,9 @@ public class DefaultChooseByNameItemProvider implements ChooseByNameItemProvider
final Map<Object, MatchResult> qualifierMatchResults = ContainerUtil.newIdentityTroveMap();
Comparator<Object> weightComparator = new Comparator<Object>() {
Comparator<Object> modelComparator = model instanceof Comparator ? (Comparator<Object>)model : new PathProximityComparator(myContext.get());
Comparator<Object> modelComparator = model instanceof Comparator
? (Comparator<Object>)model
: new PathProximityComparator(myContext == null ? null :myContext.getElement());
@Override
public int compare(Object o1, Object o2) {