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) {