when in doubt, distinguish lambdas by offset (IDEA-180742)

This commit is contained in:
Anna.Kozlova
2017-10-18 12:49:52 +02:00
parent 7014f5b23d
commit 727477d048
5 changed files with 27 additions and 11 deletions
@@ -375,7 +375,7 @@ public class MarkerType {
private final PsiClass myClass;
private SubclassUpdater(@NotNull PsiClass aClass, @NotNull PsiElementListCellRenderer<NavigatablePsiElement> renderer) {
super(aClass.getProject(), SEARCHING_FOR_OVERRIDDEN_METHODS, ((Comparator)renderer.getComparator()));
super(aClass.getProject(), SEARCHING_FOR_OVERRIDDEN_METHODS, createComparatorWrapper((Comparator)renderer.getComparator()));
myClass = aClass;
}
@@ -433,7 +433,7 @@ public class MarkerType {
private final PsiMethod myMethod;
private OverridingMethodsUpdater(@NotNull PsiMethod method, @NotNull PsiElementListCellRenderer renderer) {
super(method.getProject(), SEARCHING_FOR_OVERRIDING_METHODS, renderer.getComparator());
super(method.getProject(), SEARCHING_FOR_OVERRIDING_METHODS, createComparatorWrapper(renderer.getComparator()));
myMethod = method;
}
@@ -17,11 +17,13 @@ package com.intellij.codeInsight.navigation;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.application.ModalityState;
import com.intellij.openapi.application.ReadAction;
import com.intellij.openapi.progress.ProgressIndicator;
import com.intellij.openapi.progress.Task;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Ref;
import com.intellij.psi.PsiElement;
import com.intellij.psi.util.PsiUtilCore;
import com.intellij.ui.popup.AbstractPopup;
import com.intellij.usageView.UsageInfo;
import com.intellij.usages.UsageInfo2UsageAdapter;
@@ -70,6 +72,17 @@ public abstract class BackgroundUpdaterTask<T> extends Task.Backgroundable {
public abstract String getCaption(int size);
protected abstract void replaceModel(@NotNull List<PsiElement> data);
public static Comparator<PsiElement> createComparatorWrapper(@NotNull Comparator<PsiElement> comparator) {
return (o1, o2) -> {
int diff = comparator.compare(o1, o2);
if (diff == 0) {
return ReadAction.compute(() -> PsiUtilCore.compareElementsByPosition(o1, o2));
}
return diff;
};
}
protected abstract void paintBusy(boolean paintBusy);
public boolean setCanceled() {
@@ -35,6 +35,8 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.Collections;
import java.util.Comparator;
import java.util.function.Function;
public class GotoImplementationHandler extends GotoTargetHandler {
@Override
@@ -138,7 +140,13 @@ public class GotoImplementationHandler extends GotoTargetHandler {
private final PsiReference myReference;
ImplementationsUpdaterTask(@NotNull GotoData gotoData, @NotNull Editor editor, int offset, final PsiReference reference) {
super(gotoData.source.getProject(), ImplementationSearcher.SEARCHING_FOR_IMPLEMENTATIONS, createComparator(gotoData));
super(gotoData.source.getProject(), ImplementationSearcher.SEARCHING_FOR_IMPLEMENTATIONS,
createComparatorWrapper(Comparator.comparing(new Function<PsiElement, Comparable>() {
@Override
public Comparable apply(PsiElement e1) {
return getRenderer(e1, gotoData).getComparingObject(e1);
}
})));
myEditor = editor;
myOffset = offset;
myGotoData = gotoData;
@@ -40,7 +40,6 @@ import com.intellij.pom.Navigatable;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiNamedElement;
import com.intellij.psi.util.PsiUtilCore;
import com.intellij.ui.CollectionListModel;
import com.intellij.ui.components.JBList;
import com.intellij.ui.popup.AbstractPopup;
@@ -211,7 +210,7 @@ public abstract class GotoTargetHandler implements CodeInsightActionHandler {
}
@NotNull
private PsiElementListCellRenderer getRenderer(Object value, @NotNull GotoData gotoData) {
protected PsiElementListCellRenderer getRenderer(Object value, @NotNull GotoData gotoData) {
PsiElementListCellRenderer renderer = gotoData.getRenderer(value);
return renderer != null ? renderer : myDefaultTargetElementRenderer;
}
@@ -221,11 +220,7 @@ public abstract class GotoTargetHandler implements CodeInsightActionHandler {
return new Comparator<PsiElement>() {
@Override
public int compare(PsiElement o1, PsiElement o2) {
int diff = getComparingObject(o1).compareTo(getComparingObject(o2));
if (diff == 0) {
return ReadAction.compute(() -> PsiUtilCore.compareElementsByPosition(o1, o2));
}
return diff;
return getComparingObject(o1).compareTo(getComparingObject(o2));
}
private Comparable getComparingObject(PsiElement o1) {
@@ -325,7 +325,7 @@ public class GroovyMarkerTypes {
private final GrMethod myMethod;
public OverridingMethodsUpdater(GrMethod method, PsiElementListCellRenderer renderer) {
super(method.getProject(), MarkerType.SEARCHING_FOR_OVERRIDING_METHODS, renderer.getComparator());
super(method.getProject(), MarkerType.SEARCHING_FOR_OVERRIDING_METHODS, createComparatorWrapper(renderer.getComparator()));
myMethod = method;
}