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 5b11cc328cdd..fe948ccf0394 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 @@ -332,7 +332,7 @@ public class MarkerType { ContainerUtil.addIfNotNull(inheritors, collectProcessor.getFoundElement()); ContainerUtil.addIfNotNull(inheritors, collectExprProcessor.getFoundElement()); if (inheritors.isEmpty()) return; - final SubclassUpdater subclassUpdater = new SubclassUpdater(aClass, renderer); + final SubclassUpdater subclassUpdater = new SubclassUpdater(aClass, renderer, inheritors); inheritors.sort(renderer.getComparator()); PsiElementListNavigator.openTargets(e, inheritors.toArray(NavigatablePsiElement.EMPTY_NAVIGATABLE_ELEMENT_ARRAY), subclassUpdater.getCaption(inheritors.size()), CodeInsightBundle.message("goto.implementation.findUsages.title", aClass.getName()), renderer, subclassUpdater); @@ -362,10 +362,16 @@ public class MarkerType { @IntellijInternalApi public static final class SubclassUpdater extends OverridingMembersUpdater { private final PsiClass myClass; + private final List myInheritors; - public SubclassUpdater(@NotNull PsiClass aClass, @NotNull PsiElementListCellRenderer renderer) { + public SubclassUpdater( + @NotNull PsiClass aClass, + @NotNull PsiElementListCellRenderer renderer, + @NotNull List inheritors + ) { super(aClass.getProject(), JavaAnalysisBundle.message("subclasses.search.progress.title"), renderer); myClass = aClass; + myInheritors = inheritors; } @Override @@ -389,6 +395,7 @@ public class MarkerType { @Override public void run(@NotNull final ProgressIndicator indicator) { super.run(indicator); + final Set navigatablePsiElementSet = new HashSet<>(myInheritors); ClassInheritorsSearch.search(myClass, ReadAction.compute(() -> PsiSearchHelper.getInstance(myProject).getUseScope(myClass)), true).forEach( new CommonProcessors.CollectProcessor<>() { @Override @@ -397,6 +404,9 @@ public class MarkerType { indicator.cancel(); } ProgressManager.checkCanceled(); + if (navigatablePsiElementSet.add(o)) { + myInheritors.add(o); + } return super.process(o); } }); diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/highlighter/markers/SubClassMarker.kt b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/highlighter/markers/SubClassMarker.kt index 9b064687897e..47ba9949f66c 100644 --- a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/highlighter/markers/SubClassMarker.kt +++ b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/highlighter/markers/SubClassMarker.kt @@ -5,7 +5,6 @@ import com.intellij.codeInsight.CodeInsightBundle import com.intellij.codeInsight.daemon.impl.MarkerType import com.intellij.java.JavaBundle import com.intellij.java.analysis.JavaAnalysisBundle -import com.intellij.openapi.application.runReadAction import com.intellij.openapi.progress.ProgressManager import com.intellij.openapi.project.DumbService import com.intellij.psi.NavigatablePsiElement @@ -14,10 +13,8 @@ import com.intellij.psi.PsiElement import com.intellij.psi.PsiFunctionalExpression import com.intellij.psi.search.PsiElementProcessor import com.intellij.psi.search.PsiElementProcessorAdapter -import com.intellij.psi.search.PsiSearchHelper import com.intellij.psi.search.searches.ClassInheritorsSearch import com.intellij.psi.search.searches.FunctionalExpressionSearch -import com.intellij.util.CommonProcessors.CollectProcessor import org.jetbrains.kotlin.idea.presentation.DeclarationByModuleRenderer import org.jetbrains.kotlin.utils.addIfNotNull import java.awt.event.MouseEvent @@ -54,40 +51,18 @@ fun buildNavigateToClassInheritorsPopup(e: MouseEvent?, element: PsiElement?): N return null } - val inheritors = mutableSetOf() + val inheritors = mutableListOf() inheritors.addIfNotNull(collectProcessor.foundElement) inheritors.addIfNotNull(collectExprProcessor.foundElement) if (inheritors.isEmpty()) return null - if (!ProgressManager.getInstance().runProcessWithProgressSynchronously( - { - ClassInheritorsSearch.search(psiClass, runReadAction { - PsiSearchHelper.getInstance(project).getUseScope(psiClass) - }, true).forEach(object : CollectProcessor() { - override fun process(o: PsiClass): Boolean { - ProgressManager.checkCanceled() - inheritors.add(o) - return true - } - }) - }, - JavaAnalysisBundle.message("progress.title.searching.for.overridden.methods"), - true, - project, - e?.component as? JComponent - ) - ) { - return null - } + inheritors.sortWith(renderer.comparator as Comparator) - val inheritorList = inheritors.toMutableList() - inheritorList.sortWith(renderer.comparator as Comparator) - - val updater = MarkerType.SubclassUpdater(psiClass, renderer) + val updater = MarkerType.SubclassUpdater(psiClass, renderer, inheritors) val className = psiClass.name return NavigationPopupDescriptor( - inheritorList, + inheritors, updater.getCaption(inheritors.size)!!, CodeInsightBundle.message("goto.implementation.findUsages.title", className), renderer,