From 23447a18c31fd45787974108c4edc98276241cb2 Mon Sep 17 00:00:00 2001 From: Marcin Aman Date: Tue, 13 Apr 2021 17:13:49 +0200 Subject: [PATCH 1/2] Fix missing unresolved links in GFM --- .../org/jetbrains/dokka/gfm/renderer/CommonmarkRenderer.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/gfm/src/main/kotlin/org/jetbrains/dokka/gfm/renderer/CommonmarkRenderer.kt b/plugins/gfm/src/main/kotlin/org/jetbrains/dokka/gfm/renderer/CommonmarkRenderer.kt index 675529462a..aa54af976b 100644 --- a/plugins/gfm/src/main/kotlin/org/jetbrains/dokka/gfm/renderer/CommonmarkRenderer.kt +++ b/plugins/gfm/src/main/kotlin/org/jetbrains/dokka/gfm/renderer/CommonmarkRenderer.kt @@ -97,7 +97,7 @@ open class CommonmarkRenderer( templateCommand(ResolveLinkGfmCommand(node.address)) { buildText(node.children, pageContext, sourceSetRestriction) } - } else Unit + } else buildText(node.children, pageContext, sourceSetRestriction) } override fun StringBuilder.buildNewLine() { From 2b46cddad80289dfae4034eb368f5f0155180246 Mon Sep 17 00:00:00 2001 From: Marcin Aman Date: Tue, 13 Apr 2021 17:24:40 +0200 Subject: [PATCH 2/2] Fix missing links to elements imported as static --- .../psi/DefaultPsiToDocumentableTranslator.kt | 13 ++++++- .../base/src/test/kotlin/model/JavaTest.kt | 38 +++++++++++++++++++ 2 files changed, 50 insertions(+), 1 deletion(-) diff --git a/plugins/base/src/main/kotlin/translators/psi/DefaultPsiToDocumentableTranslator.kt b/plugins/base/src/main/kotlin/translators/psi/DefaultPsiToDocumentableTranslator.kt index 8451082443..cd2bbfc67e 100644 --- a/plugins/base/src/main/kotlin/translators/psi/DefaultPsiToDocumentableTranslator.kt +++ b/plugins/base/src/main/kotlin/translators/psi/DefaultPsiToDocumentableTranslator.kt @@ -2,6 +2,8 @@ package org.jetbrains.dokka.base.translators.psi import com.intellij.lang.jvm.JvmModifier import com.intellij.lang.jvm.annotation.JvmAnnotationAttribute +import com.intellij.lang.jvm.annotation.JvmAnnotationAttributeValue +import com.intellij.lang.jvm.annotation.JvmAnnotationEnumFieldValue import com.intellij.lang.jvm.types.JvmReferenceType import com.intellij.openapi.vfs.VirtualFileManager import com.intellij.psi.* @@ -572,13 +574,22 @@ class DefaultPsiToDocumentableTranslator( filter { it !is KtLightAbstractAnnotation }.mapNotNull { it.toAnnotation() } private fun JvmAnnotationAttribute.toValue(): AnnotationParameterValue = when (this) { - is PsiNameValuePair -> value?.toValue() ?: StringValue("") + is PsiNameValuePair -> value?.toValue() ?: attributeValue?.toValue() ?: StringValue("") else -> StringValue(this.attributeName) }.let { annotationValue -> if (annotationValue is StringValue) annotationValue.copy(unquotedValue(annotationValue.value)) else annotationValue } + /** + * This is a workaround for static imports from JDK like RetentionPolicy + * For some reason they are not represented in the same way than using normal import + */ + private fun JvmAnnotationAttributeValue.toValue(): AnnotationParameterValue? = when (this) { + is JvmAnnotationEnumFieldValue -> (field as? PsiElement)?.let { EnumValue(fieldName ?: "", DRI.from(it)) } + else -> null + } + private fun PsiAnnotationMemberValue.toValue(): AnnotationParameterValue? = when (this) { is PsiAnnotation -> toAnnotation()?.let { AnnotationValue(it) } is PsiArrayInitializerMemberValue -> ArrayValue(initializers.mapNotNull { it.toValue() }) diff --git a/plugins/base/src/test/kotlin/model/JavaTest.kt b/plugins/base/src/test/kotlin/model/JavaTest.kt index 7234296257..da45a9202e 100644 --- a/plugins/base/src/test/kotlin/model/JavaTest.kt +++ b/plugins/base/src/test/kotlin/model/JavaTest.kt @@ -14,6 +14,7 @@ import org.junit.jupiter.api.Test import utils.AbstractModelTest import utils.assertNotNull import utils.name +import kotlin.test.assertEquals import org.jetbrains.dokka.links.Callable as DRICallable class JavaTest : AbstractModelTest("/src/main/kotlin/java/Test.java", "java") { @@ -342,4 +343,41 @@ class JavaTest : AbstractModelTest("/src/main/kotlin/java/Test.java", "java") { } } } + + @Test + fun `retention should work with static import`() { + inlineModelTest( + """ + |import java.lang.annotation.Retention; + |import java.lang.annotation.RetentionPolicy; + |import static java.lang.annotation.RetentionPolicy.RUNTIME; + | + |@Retention(RUNTIME) + |public @interface JsonClass { + |}; + """, configuration = configuration + ) { + with((this / "java" / "JsonClass").cast()) { + val annotation = extra[Annotations]?.directAnnotations?.entries + ?.firstOrNull()?.value //First sourceset + ?.firstOrNull() + + val expectedDri = DRI("java.lang.annotation", "Retention", null, PointingToDeclaration) + val expectedParams = "value" to EnumValue( + "RUNTIME", + DRI( + "java.lang.annotation", + "RetentionPolicy", + DRICallable("RUNTIME", null, emptyList()), + PointingToDeclaration + ) + ) + + assertEquals(expectedDri, annotation?.dri) + assertEquals(expectedParams.first, annotation?.params?.entries?.first()?.key) + assertEquals(expectedParams.second, annotation?.params?.entries?.first()?.value) + } + } + } + }