diff --git a/idea/idea-analysis/src/org/jetbrains/jet/plugin/JetBundle.properties b/idea/idea-analysis/src/org/jetbrains/jet/plugin/JetBundle.properties index 274b88676b8..45ae82b3725 100644 --- a/idea/idea-analysis/src/org/jetbrains/jet/plugin/JetBundle.properties +++ b/idea/idea-analysis/src/org/jetbrains/jet/plugin/JetBundle.properties @@ -338,6 +338,9 @@ property.is.overridden.header=Is overridden in
navigation.title.overriding.property=Choose Implementation of {0} navigation.findUsages.title.overriding.property=Overriding properties of {0} +navigation.title.super.declaration=Choose Super Implementation of {0} +navigation.findUsages.title.super.declaration=Super Implementations of {0} + add.function.to.supertype.family=Add Function to Supertype add.function.to.supertype.action.multiple=Add function to supertype... add.function.to.type.action.single=Add ''{0}'' to ''{1}'' diff --git a/idea/src/org/jetbrains/jet/plugin/highlighter/JetLineMarkerProvider.java b/idea/src/org/jetbrains/jet/plugin/highlighter/JetLineMarkerProvider.java index e20c5e08961..991c63876f4 100644 --- a/idea/src/org/jetbrains/jet/plugin/highlighter/JetLineMarkerProvider.java +++ b/idea/src/org/jetbrains/jet/plugin/highlighter/JetLineMarkerProvider.java @@ -25,16 +25,12 @@ import com.intellij.codeInsight.daemon.impl.GutterIconTooltipHelper; import com.intellij.codeInsight.daemon.impl.LineMarkerNavigator; import com.intellij.codeInsight.daemon.impl.MarkerType; import com.intellij.codeInsight.daemon.impl.PsiElementListNavigator; -import com.intellij.codeInsight.hint.HintUtil; -import com.intellij.codeInsight.navigation.NavigationUtil; import com.intellij.icons.AllIcons; import com.intellij.ide.util.DefaultPsiElementCellRenderer; import com.intellij.ide.util.PsiClassListCellRenderer; import com.intellij.openapi.editor.markup.GutterIconRenderer; import com.intellij.openapi.progress.ProgressManager; import com.intellij.openapi.project.DumbService; -import com.intellij.openapi.ui.popup.JBPopup; -import com.intellij.openapi.ui.popup.JBPopupFactory; import com.intellij.openapi.util.Pair; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.*; @@ -44,8 +40,6 @@ import com.intellij.psi.search.PsiElementProcessorAdapter; import com.intellij.psi.search.searches.AllOverridingMethodsSearch; import com.intellij.psi.search.searches.ClassInheritorsSearch; import com.intellij.psi.search.searches.OverridingMethodsSearch; -import com.intellij.psi.util.PsiUtilCore; -import com.intellij.ui.awt.RelativePoint; import com.intellij.util.*; import gnu.trove.THashSet; import org.jetbrains.annotations.NonNls; @@ -57,12 +51,12 @@ import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; import org.jetbrains.jet.lang.descriptors.Modality; import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.resolve.BindingContext; -import org.jetbrains.jet.lang.resolve.DescriptorToSourceUtils; import org.jetbrains.jet.lang.resolve.OverrideResolver; import org.jetbrains.jet.lexer.JetTokens; import org.jetbrains.jet.plugin.JetBundle; import org.jetbrains.jet.plugin.ProjectRootsUtil; import org.jetbrains.jet.plugin.caches.resolve.ResolvePackage; +import org.jetbrains.jet.plugin.codeInsight.DescriptorToDeclarationUtil; import org.jetbrains.jet.plugin.codeInsight.JetFunctionPsiElementCellRenderer; import org.jetbrains.jet.plugin.project.AnalyzerFacadeWithCache; import org.jetbrains.jet.plugin.search.ideaExtensions.KotlinDefinitionsSearcher; @@ -281,47 +275,30 @@ public class JetLineMarkerProvider implements LineMarkerProvider { } private static void iconNavigatorHandler(MouseEvent event, PsiElement elt) { - JetFile file = (JetFile)elt.getContainingFile(); - assert file != null; - BindingContext bindingContext = AnalyzerFacadeWithCache.getContextForElement((JetElement) elt); DeclarationDescriptor descriptor = bindingContext.get(BindingContext.DECLARATION_TO_DESCRIPTOR, elt); - if (!(descriptor instanceof CallableMemberDescriptor)) { - return; - } - - Set overriddenMembers = OverrideResolver - .getDirectlyOverriddenDeclarations((CallableMemberDescriptor) descriptor); - if (overriddenMembers.size() == 0) { - return; - } + if (!(descriptor instanceof CallableMemberDescriptor)) return; + Set overriddenMembers = + OverrideResolver.getDirectlyOverriddenDeclarations((CallableMemberDescriptor) descriptor); if (overriddenMembers.isEmpty()) return; - List list = Lists.newArrayList(); + + List list = Lists.newArrayList(); for (CallableMemberDescriptor overriddenMember : overriddenMembers) { - PsiElement declarationPsiElement = DescriptorToSourceUtils.descriptorToDeclaration(overriddenMember); - list.add(declarationPsiElement); - } - if (list.isEmpty()) { - String myEmptyText = "empty text"; - JComponent renderer = HintUtil.createErrorLabel(myEmptyText); - JBPopup popup = JBPopupFactory.getInstance().createComponentPopupBuilder(renderer, renderer).createPopup(); - if (event != null) { - popup.show(new RelativePoint(event)); - } - return; - } - if (list.size() == 1) { - PsiNavigateUtil.navigate(list.iterator().next()); - } - else { - JBPopup popup = NavigationUtil.getPsiElementPopup(PsiUtilCore.toPsiElementArray(list), - new JetFunctionPsiElementCellRenderer(bindingContext), - DescriptorRenderer.FQ_NAMES_IN_TYPES.render(descriptor)); - if (event != null) { - popup.show(new RelativePoint(event)); + Collection declarations = DescriptorToDeclarationUtil.INSTANCE$.resolveToPsiElements(elt.getProject(), overriddenMember); + for (PsiElement declaration : declarations) { + if (declaration instanceof NavigatablePsiElement) { + list.add((NavigatablePsiElement) declaration); + } } } + + PsiElementListNavigator.openTargets( + event, + ArrayUtil.toObjectArray(list, NavigatablePsiElement.class), + JetBundle.message("navigation.title.super.declaration", descriptor.getName()), + JetBundle.message("navigation.findUsages.title.super.declaration", descriptor.getName()), + new JetFunctionPsiElementCellRenderer(bindingContext)); } private static String calculateTooltipString(PsiElement element) {