diff --git a/ultimate/src/org/jetbrains/kotlin/idea/spring/lineMarking/KotlinSpringClassAnnotator.kt b/ultimate/src/org/jetbrains/kotlin/idea/spring/lineMarking/KotlinSpringClassAnnotator.kt index 8d6623683b5..8f693d4e4c9 100644 --- a/ultimate/src/org/jetbrains/kotlin/idea/spring/lineMarking/KotlinSpringClassAnnotator.kt +++ b/ultimate/src/org/jetbrains/kotlin/idea/spring/lineMarking/KotlinSpringClassAnnotator.kt @@ -22,8 +22,10 @@ import com.intellij.codeInsight.daemon.RelatedItemLineMarkerInfo import com.intellij.navigation.GotoRelatedItem import com.intellij.openapi.editor.markup.GutterIconRenderer import com.intellij.openapi.util.NotNullLazyValue +import com.intellij.psi.PsiAnnotation import com.intellij.psi.PsiElement import com.intellij.psi.PsiNameIdentifierOwner +import com.intellij.psi.impl.source.tree.LeafPsiElement import com.intellij.spring.gutter.SpringClassAnnotator import com.intellij.util.Function import com.intellij.util.SmartList @@ -38,6 +40,7 @@ import org.jetbrains.kotlin.asJava.toLightMethods import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptor import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.containingClassOrObject +import org.jetbrains.kotlin.psi.psiUtil.getCallNameExpression import org.jetbrains.kotlin.psi.psiUtil.getParentOfTypeAndBranch import org.jetbrains.kotlin.resolve.annotations.hasJvmStaticAnnotation import javax.swing.Icon @@ -93,6 +96,13 @@ class KotlinSpringClassAnnotator : SpringClassAnnotator() { private val iconAlignmentField by lazy { LineMarkerInfo::class.java.getDeclaredField("myIconAlignment").apply { isAccessible = true } } private val targetsField by lazy { RelatedItemLineMarkerInfo::class.java.getDeclaredField("myTargets").apply { isAccessible = true } } + override fun getIdentifierLocal(annotation: PsiAnnotation): PsiElement? { + return when (annotation) { + is KtLightAnnotationForSourceEntry -> annotation.kotlinOrigin.getCallNameExpression()?.getIdentifier() + else -> super.getIdentifierLocal(annotation) + } + } + override fun collectNavigationMarkers(psiElement: PsiElement, result: MutableCollection>) { val newItems = SmartList>() @@ -101,8 +111,14 @@ class KotlinSpringClassAnnotator : SpringClassAnnotator() { newItems.mapNotNullTo(result) { item -> val itemElement = item.element val elementToAnnotate = when (itemElement) { - is KtLightIdentifier -> itemElement.origin + is KtLightIdentifier -> itemElement.origin.let { ktElement -> + when (ktElement) { + is KtParameterList -> ktElement.leftParenthesis + else -> ktElement + } + } is KtLightElement<*, *> -> itemElement.kotlinOrigin + is LeafPsiElement -> itemElement else -> return@mapNotNullTo item } if (elementToAnnotate == null) return@mapNotNullTo null diff --git a/ultimate/testData/spring/core/gutter/autowiredConstructor/autowiredConstructor.test b/ultimate/testData/spring/core/gutter/autowiredConstructor/autowiredConstructor.test index 37a60e3ce98..3bc9da70884 100644 --- a/ultimate/testData/spring/core/gutter/autowiredConstructor/autowiredConstructor.test +++ b/ultimate/testData/spring/core/gutter/autowiredConstructor/autowiredConstructor.test @@ -2,7 +2,7 @@ springConfig: ["config.xml"], file: "Bean.kt", icon: "SpringBeanMethod", - tooltip: "Navigate to the spring bean ", + tooltip: "Navigate to the spring bean", naming: "bean", targets: ["bean"] } \ No newline at end of file diff --git a/ultimate/tests/org/jetbrains/kotlin/idea/spring/tests/gutter/AbstractSpringClassAnnotatorTest.kt b/ultimate/tests/org/jetbrains/kotlin/idea/spring/tests/gutter/AbstractSpringClassAnnotatorTest.kt index 3a03b3864a9..ca1f367901b 100644 --- a/ultimate/tests/org/jetbrains/kotlin/idea/spring/tests/gutter/AbstractSpringClassAnnotatorTest.kt +++ b/ultimate/tests/org/jetbrains/kotlin/idea/spring/tests/gutter/AbstractSpringClassAnnotatorTest.kt @@ -73,7 +73,8 @@ abstract class AbstractSpringClassAnnotatorTest : KotlinLightCodeInsightFixtureT val iconName = config.getString("icon") val icon = SpringApiIcons::class.java.getField(iconName)[null] - val gutterMark = myFixture.findGutter(fileName)!!.let { + val gutter = myFixture.findGutter(fileName) ?: throw AssertionError("no gutter for '$fileName'") + val gutterMark = gutter.let { if (it.icon == icon) it else myFixture.findGuttersAtCaret().let { gutters -> gutters.firstOrNull() { it.icon == icon }