From c22e0d88f0013e4babaf606985788a7f0191b283 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Thu, 27 Apr 2017 15:18:11 +0200 Subject: [PATCH] More generic solution for testing line marker navigation --- .../markers/KotlinLineMarkerProvider.kt | 24 +++++++++++- .../markers/SuperDeclarationMarker.kt | 39 ++++++------------- .../codeInsight/AbstractLineMarkersTest.kt | 16 ++------ 3 files changed, 38 insertions(+), 41 deletions(-) diff --git a/idea/src/org/jetbrains/kotlin/idea/highlighter/markers/KotlinLineMarkerProvider.kt b/idea/src/org/jetbrains/kotlin/idea/highlighter/markers/KotlinLineMarkerProvider.kt index 1e431b0862f..eb8005bb354 100644 --- a/idea/src/org/jetbrains/kotlin/idea/highlighter/markers/KotlinLineMarkerProvider.kt +++ b/idea/src/org/jetbrains/kotlin/idea/highlighter/markers/KotlinLineMarkerProvider.kt @@ -21,17 +21,22 @@ import com.intellij.codeInsight.daemon.LineMarkerInfo import com.intellij.codeInsight.daemon.LineMarkerProvider 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.navigation.ListBackgroundUpdaterTask import com.intellij.icons.AllIcons import com.intellij.openapi.editor.markup.GutterIconRenderer import com.intellij.openapi.progress.ProgressManager import com.intellij.openapi.project.DumbService +import com.intellij.psi.NavigatablePsiElement import com.intellij.psi.PsiElement import com.intellij.psi.PsiMethod import com.intellij.psi.PsiNameIdentifierOwner import com.intellij.psi.search.searches.ClassInheritorsSearch import org.jetbrains.kotlin.asJava.LightClassUtil import org.jetbrains.kotlin.asJava.toLightClass -import org.jetbrains.kotlin.descriptors.* +import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor +import org.jetbrains.kotlin.descriptors.MemberDescriptor +import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.idea.KotlinIcons import org.jetbrains.kotlin.idea.caches.resolve.findModuleDescriptor import org.jetbrains.kotlin.idea.core.toDescriptor @@ -42,6 +47,7 @@ import org.jetbrains.kotlin.psi.psiUtil.isOverridable import java.awt.event.MouseEvent import java.util.* import javax.swing.Icon +import javax.swing.ListCellRenderer class KotlinLineMarkerProvider : LineMarkerProvider { override fun getLineMarkerInfo(element: PsiElement): LineMarkerInfo? { @@ -101,6 +107,22 @@ private val IMPLEMENTING_MARK: Icon = AllIcons.Gutter.ImplementingMethod private val OVERRIDDEN_MARK: Icon = AllIcons.Gutter.OverridenMethod private val IMPLEMENTED_MARK: Icon = AllIcons.Gutter.ImplementedMethod +data class NavigationPopupDescriptor( + val targets: Collection, + val title: String, + val findUsagesTitle: String, + val renderer: ListCellRenderer<*>, + val updater: ListBackgroundUpdaterTask? = null +) { + fun showPopup(e: MouseEvent?) { + PsiElementListNavigator.openTargets(e, targets.toTypedArray(), title, findUsagesTitle, renderer, updater) + } +} + +interface TestableLineMarkerNavigator { + fun getTargetsPopupDescriptor(element: PsiElement?): NavigationPopupDescriptor? +} + private val SUBCLASSED_CLASS = MarkerType( "SUBCLASSED_CLASS", { getPsiClass(it)?.let { MarkerType.getSubclassedClassTooltip(it) } }, diff --git a/idea/src/org/jetbrains/kotlin/idea/highlighter/markers/SuperDeclarationMarker.kt b/idea/src/org/jetbrains/kotlin/idea/highlighter/markers/SuperDeclarationMarker.kt index f5479466fdc..9644467de37 100644 --- a/idea/src/org/jetbrains/kotlin/idea/highlighter/markers/SuperDeclarationMarker.kt +++ b/idea/src/org/jetbrains/kotlin/idea/highlighter/markers/SuperDeclarationMarker.kt @@ -17,11 +17,9 @@ package org.jetbrains.kotlin.idea.highlighter.markers import com.intellij.codeInsight.daemon.GutterIconNavigationHandler -import com.intellij.codeInsight.daemon.impl.PsiElementListNavigator -import com.intellij.openapi.application.ApplicationManager import com.intellij.psi.NavigatablePsiElement +import com.intellij.psi.PsiElement import com.intellij.util.Function -import org.jetbrains.annotations.TestOnly import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.PropertyAccessorDescriptor @@ -65,20 +63,16 @@ object SuperDeclarationMarkerTooltip: Function { } } -class SuperDeclarationMarkerNavigationHandler : GutterIconNavigationHandler { - private var testNavigableElements: List? = null - - @TestOnly fun getNavigationElements(): List { - val navigationResult = testNavigableElements!! - testNavigableElements = null - return navigationResult +class SuperDeclarationMarkerNavigationHandler : GutterIconNavigationHandler, TestableLineMarkerNavigator { + override fun navigate(e: MouseEvent?, element: KtDeclaration?) { + getTargetsPopupDescriptor(element)?.showPopup(e) } - override fun navigate(e: MouseEvent?, element: KtDeclaration?) { - if (element == null) return + override fun getTargetsPopupDescriptor(element: PsiElement?): NavigationPopupDescriptor? { + if (element !is KtDeclaration) return null val (elementDescriptor, overriddenDescriptors) = resolveDeclarationWithParents(element) - if (overriddenDescriptors.isEmpty()) return + if (overriddenDescriptors.isEmpty()) return null val superDeclarations = ArrayList() for (overriddenMember in overriddenDescriptors) { @@ -90,20 +84,11 @@ class SuperDeclarationMarkerNavigationHandler : GutterIconNavigationHandler - val elementFirstStr = ReferenceUtils.renderAsGotoImplementation(first) - val elementSecondStr = ReferenceUtils.renderAsGotoImplementation(second) - - elementFirstStr.compareTo(elementSecondStr) - } - + val navigateElements = handler.getTargetsPopupDescriptor(element)?.targets?.sortedBy { ReferenceUtils.renderAsGotoImplementation(it) } val actualNavigationData = NavigationTestUtils.getNavigateElementsText(myFixture.project, navigateElements) UsefulTestCase.assertSameLines(getExpectedNavigationText(navigationComment), actualNavigationData)