diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/MarkerType.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/MarkerType.java index a6ee702ed0ef..8ab81bbfd61f 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/MarkerType.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/MarkerType.java @@ -375,7 +375,7 @@ public class MarkerType { private final PsiClass myClass; private SubclassUpdater(@NotNull PsiClass aClass, @NotNull PsiElementListCellRenderer 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; } diff --git a/platform/lang-impl/src/com/intellij/codeInsight/navigation/BackgroundUpdaterTask.java b/platform/lang-impl/src/com/intellij/codeInsight/navigation/BackgroundUpdaterTask.java index 334f4bb4a587..6b7b93f5f593 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/navigation/BackgroundUpdaterTask.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/navigation/BackgroundUpdaterTask.java @@ -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 extends Task.Backgroundable { public abstract String getCaption(int size); protected abstract void replaceModel(@NotNull List data); + + public static Comparator createComparatorWrapper(@NotNull Comparator 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() { diff --git a/platform/lang-impl/src/com/intellij/codeInsight/navigation/GotoImplementationHandler.java b/platform/lang-impl/src/com/intellij/codeInsight/navigation/GotoImplementationHandler.java index 816e413056e3..cdd097ffb572 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/navigation/GotoImplementationHandler.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/navigation/GotoImplementationHandler.java @@ -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() { + @Override + public Comparable apply(PsiElement e1) { + return getRenderer(e1, gotoData).getComparingObject(e1); + } + }))); myEditor = editor; myOffset = offset; myGotoData = gotoData; diff --git a/platform/lang-impl/src/com/intellij/codeInsight/navigation/GotoTargetHandler.java b/platform/lang-impl/src/com/intellij/codeInsight/navigation/GotoTargetHandler.java index 37ac49df95aa..cf8414720ab2 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/navigation/GotoTargetHandler.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/navigation/GotoTargetHandler.java @@ -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() { @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) { diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/codeInsight/GroovyMarkerTypes.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/codeInsight/GroovyMarkerTypes.java index 091c3d5cc9ba..dd0a1e531200 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/codeInsight/GroovyMarkerTypes.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/codeInsight/GroovyMarkerTypes.java @@ -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; }