Add module-specific cell renderers to navigate to actuals correctly

So #KT-23685 Fixed
This commit is contained in:
Mikhail Glukhikh
2018-06-08 18:14:57 +03:00
parent efd6b7a035
commit 0a2ed054f1
6 changed files with 53 additions and 15 deletions
@@ -22,6 +22,9 @@ import com.intellij.ide.util.PsiElementListCellRenderer
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.asJava.classes.KtLightClass
import org.jetbrains.kotlin.idea.presentation.KtLightClassListCellRenderer
import org.jetbrains.kotlin.idea.presentation.DeclarationByModuleRenderer
import org.jetbrains.kotlin.idea.util.isEffectivelyActual
import org.jetbrains.kotlin.psi.KtDeclaration
class KotlinGotoTargetRenderProvider : GotoTargetRendererProvider {
override fun getRenderer(element: PsiElement, gotoData: GotoTargetHandler.GotoData): PsiElementListCellRenderer<*>? {
@@ -30,6 +33,13 @@ class KotlinGotoTargetRenderProvider : GotoTargetRendererProvider {
// Need to override default Java render
KtLightClassListCellRenderer()
}
is KtDeclaration -> {
if (element.isEffectivelyActual()) {
DeclarationByModuleRenderer()
} else {
null
}
}
else -> {
null
}
@@ -12,7 +12,6 @@ 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.ide.util.PsiClassOrFunctionalExpressionListCellRenderer
import com.intellij.openapi.actionSystem.IdeActions
import com.intellij.openapi.editor.colors.CodeInsightColors
import com.intellij.openapi.editor.colors.EditorColorsManager
@@ -41,6 +40,7 @@ import org.jetbrains.kotlin.idea.caches.resolve.findModuleDescriptor
import org.jetbrains.kotlin.idea.core.isInheritable
import org.jetbrains.kotlin.idea.core.isOverridable
import org.jetbrains.kotlin.idea.core.toDescriptor
import org.jetbrains.kotlin.idea.presentation.DeclarationByModuleRenderer
import org.jetbrains.kotlin.idea.search.declarationsSearch.toPossiblyFakeLightMethods
import org.jetbrains.kotlin.idea.util.*
import org.jetbrains.kotlin.lexer.KtTokens
@@ -151,20 +151,14 @@ interface TestableLineMarkerNavigator {
fun getTargetsPopupDescriptor(element: PsiElement?): NavigationPopupDescriptor?
}
private class SubclassRenderer : PsiClassOrFunctionalExpressionListCellRenderer() {
override fun getComparingObject(element: NavigatablePsiElement?): Comparable<Nothing> {
val baseText = super.getComparingObject(element)
val moduleName = element?.module?.name ?: return baseText
return "$baseText [$moduleName]"
}
}
private val SUBCLASSED_CLASS = MarkerType(
"SUBCLASSED_CLASS",
{ getPsiClass(it)?.let { MarkerType.getSubclassedClassTooltip(it) } },
object : LineMarkerNavigator() {
override fun browse(e: MouseEvent?, element: PsiElement?) {
getPsiClass(element)?.let { MarkerType.navigateToSubclassedClass(e, it, SubclassRenderer()) }
getPsiClass(element)?.let {
MarkerType.navigateToSubclassedClass(e, it, DeclarationByModuleRenderer())
}
}
})
@@ -40,6 +40,7 @@ import org.jetbrains.kotlin.idea.caches.resolve.findModuleDescriptor
import org.jetbrains.kotlin.idea.core.isInheritable
import org.jetbrains.kotlin.idea.core.isOverridable
import org.jetbrains.kotlin.idea.core.toDescriptor
import org.jetbrains.kotlin.idea.presentation.DeclarationByModuleRenderer
import org.jetbrains.kotlin.idea.search.declarationsSearch.toPossiblyFakeLightMethods
import org.jetbrains.kotlin.idea.util.*
import org.jetbrains.kotlin.lexer.KtTokens
@@ -155,7 +156,7 @@ private val SUBCLASSED_CLASS = MarkerType(
{ getPsiClass(it)?.let { MarkerType.getSubclassedClassTooltip(it) } },
object : LineMarkerNavigator() {
override fun browse(e: MouseEvent?, element: PsiElement?) {
getPsiClass(element)?.let { MarkerType.navigateToSubclassedClass(e, it) }
getPsiClass(element)?.let { MarkerType.navigateToSubclassedClass(e, it, DeclarationByModuleRenderer()) }
}
})
@@ -0,0 +1,16 @@
/*
* Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
* that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.idea.presentation
import com.intellij.psi.NavigatablePsiElement
import com.intellij.psi.presentation.java.SymbolPresentationUtil
class DeclarationByModuleRenderer : KtModuleSpecificListCellRenderer<NavigatablePsiElement>() {
override fun getContainerText(element: NavigatablePsiElement?, name: String?) = ""
override fun getElementText(element: NavigatablePsiElement): String =
SymbolPresentationUtil.getSymbolPresentableText(element)
}
@@ -16,18 +16,15 @@
package org.jetbrains.kotlin.idea.presentation
import com.intellij.ide.util.PsiElementListCellRenderer
import com.intellij.psi.presentation.java.ClassPresentationUtil
import org.jetbrains.kotlin.asJava.classes.KtLightClass
import org.jetbrains.kotlin.name.FqName
class KtLightClassListCellRenderer : PsiElementListCellRenderer<KtLightClass>() {
class KtLightClassListCellRenderer : KtModuleSpecificListCellRenderer<KtLightClass>() {
override fun getElementText(element: KtLightClass) = ClassPresentationUtil.getNameForClass(element, false)
// TODO: correct text for local, anonymous, enum entries ... etc
override fun getContainerText(element: KtLightClass, name: String) = element.qualifiedName?.let { qName ->
"(" + FqName(qName).parent().asString() + ")"
} ?: ""
override fun getIconFlags() = 0
}
@@ -0,0 +1,20 @@
/*
* Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
* that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.idea.presentation
import com.intellij.ide.util.PsiElementListCellRenderer
import com.intellij.psi.NavigatablePsiElement
import org.jetbrains.kotlin.idea.util.module
abstract class KtModuleSpecificListCellRenderer<T : NavigatablePsiElement> : PsiElementListCellRenderer<T>() {
override fun getIconFlags() = 0
override fun getComparingObject(element: T?): Comparable<Nothing> {
val baseText = super.getComparingObject(element)
val moduleName = element?.module?.name ?: return baseText
return "$baseText [$moduleName]"
}
}