[kotlin] k2: quick documentation: find annotations on backing field

- also fix links on annotation classes

^KTIJ-29181 fixed

GitOrigin-RevId: 450d4f2af447578480bc0ec7ae46f24ce0a3f904
This commit is contained in:
Anna Kozlova
2024-03-22 19:11:41 +00:00
committed by intellij-monorepo-bot
parent 6839d9f650
commit 156f86a322
4 changed files with 35 additions and 3 deletions
@@ -140,7 +140,13 @@ internal class KotlinIdeDeclarationRenderer(
annotationListRenderer = object : KtAnnotationListRenderer {
context(KtAnalysisSession, KtAnnotationRenderer)
override fun renderAnnotations(owner: KtAnnotated, printer: PrettyPrinter) {
val annotations = owner.annotations.filter { annotationFilter.filter(it, owner) }.ifEmpty { return }
val backingFieldAnnotations = (owner as? KtPropertySymbol)?.backingFieldSymbol?.annotations
val annotations = (backingFieldAnnotations?.let { owner.annotations + it } ?: owner.annotations).filter {
annotationFilter.filter(
it,
owner
)
}.ifEmpty { return }
printer.printCollection(
annotations, separator = when (owner) {
is KtValueParameterSymbol -> " "
@@ -149,7 +155,10 @@ internal class KotlinIdeDeclarationRenderer(
}
) { annotation ->
append(highlight("@") { asAnnotationName })
annotationUseSiteTargetRenderer.renderUseSiteTarget(annotation, owner, printer)
if (backingFieldAnnotations != null && annotation in backingFieldAnnotations) {
printer.append(highlight("field") { asKeyword })
printer.append(':')
}
annotationsQualifiedNameRenderer.renderQualifier(annotation, owner, printer)
annotationArgumentsRenderer.renderAnnotationArguments(annotation, owner, printer)
}
@@ -164,7 +173,7 @@ internal class KotlinIdeDeclarationRenderer(
val classId = annotation.classId
if (classId != null) {
val buffer = StringBuilder()
DocumentationManagerUtil.createHyperlink(buffer, classId.asString(), classId.shortClassName.renderName(), true, false)
DocumentationManagerUtil.createHyperlink(buffer, classId.asSingleFqName().asString(), classId.shortClassName.renderName(), true, false)
printer.append(highlight(buffer.toString()) { asAnnotationName })
} else {
printer.append(highlight("ERROR_ANNOTATION") { asError })
@@ -158,6 +158,11 @@ public class FirQuickDocTestGenerated extends AbstractFirQuickDocTest {
runTest("../../idea/tests/testData/editor/quickDoc/JavaMethodUsedInKotlinInParen.kt");
}
@TestMetadata("JvmFieldAnnotation.kt")
public void testJvmFieldAnnotation() throws Exception {
runTest("../../idea/tests/testData/editor/quickDoc/JvmFieldAnnotation.kt");
}
@TestMetadata("KotlinClassUsedFromJava.java")
public void testKotlinClassUsedFromJava() throws Exception {
runTest("../../idea/tests/testData/editor/quickDoc/KotlinClassUsedFromJava.java");
@@ -158,6 +158,11 @@ public class QuickDocProviderTestGenerated extends AbstractQuickDocProviderTest
runTest("testData/editor/quickDoc/JavaMethodUsedInKotlinInParen.kt");
}
@TestMetadata("JvmFieldAnnotation.kt")
public void testJvmFieldAnnotation() throws Exception {
runTest("testData/editor/quickDoc/JvmFieldAnnotation.kt");
}
@TestMetadata("KotlinClassUsedFromJava.java")
public void testKotlinClassUsedFromJava() throws Exception {
runTest("testData/editor/quickDoc/KotlinClassUsedFromJava.java");
@@ -0,0 +1,13 @@
annotation class Anno
class JvmFieldContainerContainer {
companion object {
@JvmField @Anno val jvmF<caret>ield = 0
}
}
//K2_INFO: <div class='definition'><pre><span style="color:#808000;">@</span><span style="color:#808000;"><a href="psi_element://Anno">Anno</a></span>
//K2_INFO: <span style="color:#808000;">@</span><span style="color:#000080;font-weight:bold;">field</span>:<span style="color:#808000;"><a href="psi_element://kotlin.jvm.JvmField">JvmField</a></span>
//K2_INFO: <span style="color:#000080;font-weight:bold;">public</span> <span style="color:#000080;font-weight:bold;">final</span> <span style="color:#000080;font-weight:bold;">val</span> <span style="color:#660e7a;font-weight:bold;">jvmField</span><span style="">: </span><span style="color:#000000;">Int</span></pre></div><div class='bottom'><icon src="/org/jetbrains/kotlin/idea/icons/classKotlin.svg"/>&nbsp;<a href="psi_element://JvmFieldContainerContainer.Companion"><code><span style="color:#000000;">JvmFieldContainerContainer.Companion</span></code></a><br/></div>
//INFO: <div class='definition'><pre><span style="color:#808000;">@</span><span style="color:#808000;"><a href="psi_element://Anno">Anno</a></span>
//INFO: <span style="color:#808000;">@</span><span style="color:#000080;font-weight:bold;">field</span><span style="color:#808000;">:</span><span style="color:#808000;"><a href="psi_element://kotlin.jvm.JvmField">JvmField</a></span> <span style="color:#000080;font-weight:bold;">public</span> <span style="color:#000080;font-weight:bold;">final</span> <span style="color:#000080;font-weight:bold;">val</span> <span style="color:#660e7a;font-weight:bold;">jvmField</span><span style="">: </span><span style="color:#000000;">Int</span></pre></div><div class='bottom'><icon src="/org/jetbrains/kotlin/idea/icons/classKotlin.svg"/>&nbsp;<a href="psi_element://JvmFieldContainerContainer.Companion"><code><span style="color:#000000;">JvmFieldContainerContainer.Companion</span></code></a><br/></div>