From 7a83e4665cceeec448212ea97194caeadb7e4a9f Mon Sep 17 00:00:00 2001 From: Andrzej Ratajczak Date: Wed, 12 Jan 2022 13:21:54 +0100 Subject: [PATCH 1/6] Fix resolving DRIs of Enum Entries --- .../dokka/analysis/CallableFactory.kt | 14 ++++ .../jetbrains/dokka/analysis/DRIFactory.kt | 18 +++-- .../translators/psi/parsers/JavadocParser.kt | 2 +- .../test/kotlin/linking/EnumValuesLinking.kt | 70 +++++++++++++++++++ .../kotlin/linking/source/JavaEnum.java | 5 ++ .../kotlin/linking/source/JavaLinker.java | 8 +++ .../kotlin/linking/source/KotlinEnum.kt | 5 ++ .../kotlin/linking/source/KotlinLinker.kt | 8 +++ 8 files changed, 125 insertions(+), 5 deletions(-) create mode 100644 plugins/base/src/test/kotlin/linking/EnumValuesLinking.kt create mode 100644 plugins/base/src/test/resources/linking/jvmMain/kotlin/linking/source/JavaEnum.java create mode 100644 plugins/base/src/test/resources/linking/jvmMain/kotlin/linking/source/JavaLinker.java create mode 100644 plugins/base/src/test/resources/linking/jvmMain/kotlin/linking/source/KotlinEnum.kt create mode 100644 plugins/base/src/test/resources/linking/jvmMain/kotlin/linking/source/KotlinLinker.kt diff --git a/kotlin-analysis/src/main/kotlin/org/jetbrains/dokka/analysis/CallableFactory.kt b/kotlin-analysis/src/main/kotlin/org/jetbrains/dokka/analysis/CallableFactory.kt index de48cfae16..c71034e910 100644 --- a/kotlin-analysis/src/main/kotlin/org/jetbrains/dokka/analysis/CallableFactory.kt +++ b/kotlin-analysis/src/main/kotlin/org/jetbrains/dokka/analysis/CallableFactory.kt @@ -6,6 +6,8 @@ import org.jetbrains.dokka.links.Callable import org.jetbrains.dokka.links.JavaClassReference import org.jetbrains.dokka.links.TypeReference import org.jetbrains.kotlin.descriptors.CallableDescriptor +import org.jetbrains.kotlin.descriptors.impl.EnumEntrySyntheticClassDescriptor +import org.jetbrains.kotlin.resolve.lazy.descriptors.LazyClassDescriptor fun Callable.Companion.from(descriptor: CallableDescriptor, name: String? = null) = with(descriptor) { Callable( @@ -15,6 +17,18 @@ fun Callable.Companion.from(descriptor: CallableDescriptor, name: String? = null ) } +fun Callable.Companion.from(descriptor: LazyClassDescriptor) = Callable( + descriptor.name.asString(), + null, + emptyList() +) + +fun Callable.Companion.from(descriptor: EnumEntrySyntheticClassDescriptor) = Callable( + descriptor.name.asString(), + null, + emptyList() +) + fun Callable.Companion.from(psi: PsiMethod) = with(psi) { Callable( name, diff --git a/kotlin-analysis/src/main/kotlin/org/jetbrains/dokka/analysis/DRIFactory.kt b/kotlin-analysis/src/main/kotlin/org/jetbrains/dokka/analysis/DRIFactory.kt index 5f74c42991..2a358531a8 100644 --- a/kotlin-analysis/src/main/kotlin/org/jetbrains/dokka/analysis/DRIFactory.kt +++ b/kotlin-analysis/src/main/kotlin/org/jetbrains/dokka/analysis/DRIFactory.kt @@ -6,19 +6,29 @@ import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.impl.EnumEntrySyntheticClassDescriptor import org.jetbrains.kotlin.psi.psiUtil.parentsWithSelf import org.jetbrains.kotlin.resolve.descriptorUtil.parentsWithSelf +import org.jetbrains.kotlin.resolve.lazy.descriptors.LazyClassDescriptor import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstanceOrNull +import org.jetbrains.kotlin.utils.addToStdlib.safeAs fun DRI.Companion.from(descriptor: DeclarationDescriptor) = descriptor.parentsWithSelf.run { val parameter = firstIsInstanceOrNull() val callable = parameter?.containingDeclaration ?: firstIsInstanceOrNull() - DRI( packageName = firstIsInstanceOrNull()?.fqName?.asString() ?: "", - classNames = (filterIsInstance() + filterIsInstance()).toList() + classNames = (filterIsInstance().map { + if (it.kind == ClassKind.ENUM_ENTRY) + it.name.asString().split(".").dropLast(1).joinToString(".") + else + it.name.asString() + } + filterIsInstance().map { it.name.asString() } + ).toList() + .filter { it.isNotBlank() } .takeIf { it.isNotEmpty() } ?.asReversed() - ?.joinToString(separator = ".") { it.name.asString() }, - callable = callable?.let { Callable.from(it) }, + ?.joinToString(separator = "."), + callable = callable?.let { Callable.from(it) } + ?: descriptor.safeAs().takeIf { it?.kind == ClassKind.ENUM_ENTRY }?.let { Callable.from(it) } + ?: descriptor.safeAs()?.let { Callable.from(it) }, target = DriTarget.from(parameter ?: descriptor), extra = if (descriptor is EnumEntrySyntheticClassDescriptor) DRIExtraContainer().also { it[EnumEntryDRIExtra] = EnumEntryDRIExtra }.encode() diff --git a/plugins/base/src/main/kotlin/translators/psi/parsers/JavadocParser.kt b/plugins/base/src/main/kotlin/translators/psi/parsers/JavadocParser.kt index f9f591b2de..a501ae55ca 100644 --- a/plugins/base/src/main/kotlin/translators/psi/parsers/JavadocParser.kt +++ b/plugins/base/src/main/kotlin/translators/psi/parsers/JavadocParser.kt @@ -326,7 +326,7 @@ class JavadocParser( dri.toString() } ?: UNRESOLVED_PSI_ELEMENT - return """${label.ifBlank{ defaultLabel().text }}""" + return """${label.ifBlank{ defaultLabel().text }}""" } private fun convertInlineDocTag( diff --git a/plugins/base/src/test/kotlin/linking/EnumValuesLinking.kt b/plugins/base/src/test/kotlin/linking/EnumValuesLinking.kt new file mode 100644 index 0000000000..f690dfbdae --- /dev/null +++ b/plugins/base/src/test/kotlin/linking/EnumValuesLinking.kt @@ -0,0 +1,70 @@ +package linking + +import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest +import org.jetbrains.dokka.model.doc.DocumentationLink +import org.junit.jupiter.api.Test +import java.nio.file.Paths +import org.junit.jupiter.api.Assertions.assertEquals +import java.lang.AssertionError + +class EnumValuesLinking : BaseAbstractTest() { + + @Test + fun `check if enum values are correctly linked`() { + val testDataDir = getTestDataDir("linking").toAbsolutePath() + testFromData( + dokkaConfiguration { + sourceSets { + sourceSet { + sourceRoots = listOf(Paths.get("$testDataDir/jvmMain/kotlin").toString()) + analysisPlatform = "jvm" + name = "jvm" + } + } + } + ) { + documentablesTransformationStage = { + val classlikes = it.packages.single().children + assertEquals(4, classlikes.size) + + val javaLinker = classlikes.single { it.name == "JavaLinker" } + javaLinker.documentation.values.single().children.run { + when (val kotlinLink = this[0].children[1].children[1]) { + is DocumentationLink -> kotlinLink.dri.run { + assertEquals("KotlinEnum", this.classNames) + assertEquals("ON_CREATE", this.callable?.name) + } + else -> throw AssertionError("Link node is not DocumentationLink type") + } + + when (val javaLink = this[0].children[2].children[1]) { + is DocumentationLink -> javaLink.dri.run { + assertEquals("JavaEnum", this.classNames) + assertEquals("ON_DECEIT", this.callable?.name) + } + else -> throw AssertionError("Link node is not DocumentationLink type") + } + } + + val kotlinLinker = classlikes.single { it.name == "KotlinLinker" } + kotlinLinker.documentation.values.single().children.run { + when (val kotlinLink = this[0].children[0].children[5]) { + is DocumentationLink -> kotlinLink.dri.run { + assertEquals("KotlinEnum", this.classNames) + assertEquals("ON_CREATE", this.callable?.name) + } + else -> throw AssertionError("Link node is not DocumentationLink type") + } + + when (val javaLink = this[0].children[0].children[9]) { + is DocumentationLink -> javaLink.dri.run { + assertEquals("JavaEnum", this.classNames) + assertEquals("ON_DECEIT", this.callable?.name) + } + else -> throw AssertionError("Link node is not DocumentationLink type") + } + } + } + } + } +} diff --git a/plugins/base/src/test/resources/linking/jvmMain/kotlin/linking/source/JavaEnum.java b/plugins/base/src/test/resources/linking/jvmMain/kotlin/linking/source/JavaEnum.java new file mode 100644 index 0000000000..016365a723 --- /dev/null +++ b/plugins/base/src/test/resources/linking/jvmMain/kotlin/linking/source/JavaEnum.java @@ -0,0 +1,5 @@ +package linking.source; + +public enum JavaEnum { + ON_DECEIT, ON_DESTROY; +} diff --git a/plugins/base/src/test/resources/linking/jvmMain/kotlin/linking/source/JavaLinker.java b/plugins/base/src/test/resources/linking/jvmMain/kotlin/linking/source/JavaLinker.java new file mode 100644 index 0000000000..ac416530be --- /dev/null +++ b/plugins/base/src/test/resources/linking/jvmMain/kotlin/linking/source/JavaLinker.java @@ -0,0 +1,8 @@ +package linking.source; + +/** + * Reference link {@link linking.source.KotlinEnum} should resolve

+ * sjuff sjuff {@link linking.source.KotlinEnum#ON_CREATE} should resolve

+ * sjujj sjujj {@link linking.source.JavaEnum#ON_DECEIT} should resolve + */ +public class JavaLinker {} diff --git a/plugins/base/src/test/resources/linking/jvmMain/kotlin/linking/source/KotlinEnum.kt b/plugins/base/src/test/resources/linking/jvmMain/kotlin/linking/source/KotlinEnum.kt new file mode 100644 index 0000000000..a03316b125 --- /dev/null +++ b/plugins/base/src/test/resources/linking/jvmMain/kotlin/linking/source/KotlinEnum.kt @@ -0,0 +1,5 @@ +package linking.source + +enum class KotlinEnum { + ON_CREATE, ON_CATASTROPHE +} diff --git a/plugins/base/src/test/resources/linking/jvmMain/kotlin/linking/source/KotlinLinker.kt b/plugins/base/src/test/resources/linking/jvmMain/kotlin/linking/source/KotlinLinker.kt new file mode 100644 index 0000000000..45afc3d5b1 --- /dev/null +++ b/plugins/base/src/test/resources/linking/jvmMain/kotlin/linking/source/KotlinLinker.kt @@ -0,0 +1,8 @@ +package linking.source + +/** + * Reference link [KotlinEnum] should resolve

+ * stuff stuff [KotlinEnum.ON_CREATE] should resolve

+ * stuff stuff [JavaEnum.ON_DECEIT] should resolve + */ +class KotlinLinker {} From 175ca1737f8c78f9171b0ecfd560d87211e6be27 Mon Sep 17 00:00:00 2001 From: Andrzej Ratajczak Date: Mon, 17 Jan 2022 12:42:01 +0100 Subject: [PATCH 2/6] Unify DRIs for Kotlin and Java enums. Add EnumEntry linking tests --- .../dokka/analysis/CallableFactory.kt | 14 ----- .../jetbrains/dokka/analysis/DRIFactory.kt | 24 +++----- .../JavadocExternalLocationProvider.kt | 7 +-- .../resolvers/local/DokkaLocationProvider.kt | 1 + .../test/kotlin/linking/EnumValuesLinking.kt | 61 ++++++++++++++++--- .../JavadocExternalLocationProviderTest.kt | 4 +- .../base/src/test/kotlin/model/JavaTest.kt | 4 +- 7 files changed, 66 insertions(+), 49 deletions(-) diff --git a/kotlin-analysis/src/main/kotlin/org/jetbrains/dokka/analysis/CallableFactory.kt b/kotlin-analysis/src/main/kotlin/org/jetbrains/dokka/analysis/CallableFactory.kt index c71034e910..de48cfae16 100644 --- a/kotlin-analysis/src/main/kotlin/org/jetbrains/dokka/analysis/CallableFactory.kt +++ b/kotlin-analysis/src/main/kotlin/org/jetbrains/dokka/analysis/CallableFactory.kt @@ -6,8 +6,6 @@ import org.jetbrains.dokka.links.Callable import org.jetbrains.dokka.links.JavaClassReference import org.jetbrains.dokka.links.TypeReference import org.jetbrains.kotlin.descriptors.CallableDescriptor -import org.jetbrains.kotlin.descriptors.impl.EnumEntrySyntheticClassDescriptor -import org.jetbrains.kotlin.resolve.lazy.descriptors.LazyClassDescriptor fun Callable.Companion.from(descriptor: CallableDescriptor, name: String? = null) = with(descriptor) { Callable( @@ -17,18 +15,6 @@ fun Callable.Companion.from(descriptor: CallableDescriptor, name: String? = null ) } -fun Callable.Companion.from(descriptor: LazyClassDescriptor) = Callable( - descriptor.name.asString(), - null, - emptyList() -) - -fun Callable.Companion.from(descriptor: EnumEntrySyntheticClassDescriptor) = Callable( - descriptor.name.asString(), - null, - emptyList() -) - fun Callable.Companion.from(psi: PsiMethod) = with(psi) { Callable( name, diff --git a/kotlin-analysis/src/main/kotlin/org/jetbrains/dokka/analysis/DRIFactory.kt b/kotlin-analysis/src/main/kotlin/org/jetbrains/dokka/analysis/DRIFactory.kt index 2a358531a8..0aebad0024 100644 --- a/kotlin-analysis/src/main/kotlin/org/jetbrains/dokka/analysis/DRIFactory.kt +++ b/kotlin-analysis/src/main/kotlin/org/jetbrains/dokka/analysis/DRIFactory.kt @@ -6,31 +6,22 @@ import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.impl.EnumEntrySyntheticClassDescriptor import org.jetbrains.kotlin.psi.psiUtil.parentsWithSelf import org.jetbrains.kotlin.resolve.descriptorUtil.parentsWithSelf -import org.jetbrains.kotlin.resolve.lazy.descriptors.LazyClassDescriptor import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstanceOrNull import org.jetbrains.kotlin.utils.addToStdlib.safeAs fun DRI.Companion.from(descriptor: DeclarationDescriptor) = descriptor.parentsWithSelf.run { val parameter = firstIsInstanceOrNull() val callable = parameter?.containingDeclaration ?: firstIsInstanceOrNull() + DRI( packageName = firstIsInstanceOrNull()?.fqName?.asString() ?: "", - classNames = (filterIsInstance().map { - if (it.kind == ClassKind.ENUM_ENTRY) - it.name.asString().split(".").dropLast(1).joinToString(".") - else - it.name.asString() - } + filterIsInstance().map { it.name.asString() } - ).toList() - .filter { it.isNotBlank() } + classNames = (filterIsInstance() + filterIsInstance()).toList() .takeIf { it.isNotEmpty() } ?.asReversed() - ?.joinToString(separator = "."), - callable = callable?.let { Callable.from(it) } - ?: descriptor.safeAs().takeIf { it?.kind == ClassKind.ENUM_ENTRY }?.let { Callable.from(it) } - ?: descriptor.safeAs()?.let { Callable.from(it) }, + ?.joinToString(separator = ".") { it.name.asString() }, + callable = callable?.let { Callable.from(it) }, target = DriTarget.from(parameter ?: descriptor), - extra = if (descriptor is EnumEntrySyntheticClassDescriptor) + extra = if (descriptor is EnumEntrySyntheticClassDescriptor || descriptor.safeAs()?.kind == ClassKind.ENUM_ENTRY) DRIExtraContainer().also { it[EnumEntryDRIExtra] = EnumEntryDRIExtra }.encode() else null ) @@ -43,9 +34,10 @@ fun DRI.Companion.from(psi: PsiElement) = psi.parentsWithSelf.run { .toList() // We only want exact PsiClass types, not PsiTypeParameter subtype DRI( packageName = classes.lastOrNull()?.qualifiedName?.substringBeforeLast('.', "") ?: "", - classNames = classes.toList().takeIf { it.isNotEmpty() }?.asReversed()?.mapNotNull { it.name } + classNames = (if (psi is PsiEnumConstant) listOfNotNull(psiField?.name) + classes.toList().mapNotNull { it.name } else classes.toList().mapNotNull { it.name }) + .takeIf { it.isNotEmpty() }?.asReversed() ?.joinToString("."), - callable = psiMethod?.let { Callable.from(it) } ?: psiField?.let { Callable.from(it) }, + callable = psiMethod?.let { Callable.from(it) } ?: psiField?.takeUnless { psi is PsiEnumConstant }?.let { Callable.from(it) }, target = DriTarget.from(psi), extra = if (psi is PsiEnumConstant) DRIExtraContainer().also { it[EnumEntryDRIExtra] = EnumEntryDRIExtra }.encode() diff --git a/plugins/base/src/main/kotlin/resolvers/external/javadoc/JavadocExternalLocationProvider.kt b/plugins/base/src/main/kotlin/resolvers/external/javadoc/JavadocExternalLocationProvider.kt index 84445d2a05..a1f1542dbb 100644 --- a/plugins/base/src/main/kotlin/resolvers/external/javadoc/JavadocExternalLocationProvider.kt +++ b/plugins/base/src/main/kotlin/resolvers/external/javadoc/JavadocExternalLocationProvider.kt @@ -30,13 +30,10 @@ open class JavadocExternalLocationProvider( return "$docWithModule$packageLink/package-summary$extension".htmlEscape() } - // in Kotlin DRI of enum entry is not callable if (DRIExtraContainer(extra)[EnumEntryDRIExtra] != null) { - val (classSplit, enumEntityAnchor) = if (callable == null) { - val lastIndex = classNames?.lastIndexOf(".") ?: 0 + val lastIndex = classNames?.lastIndexOf(".") ?: 0 + val (classSplit, enumEntityAnchor) = classNames?.substring(0, lastIndex) to classNames?.substring(lastIndex + 1) - } else - classNames to callable?.name val classLink = if (packageLink == null) "${classSplit}$extension" else "$packageLink/${classSplit}$extension" diff --git a/plugins/base/src/main/kotlin/resolvers/local/DokkaLocationProvider.kt b/plugins/base/src/main/kotlin/resolvers/local/DokkaLocationProvider.kt index c4c4633178..691ae26e69 100644 --- a/plugins/base/src/main/kotlin/resolvers/local/DokkaLocationProvider.kt +++ b/plugins/base/src/main/kotlin/resolvers/local/DokkaLocationProvider.kt @@ -82,6 +82,7 @@ open class DokkaLocationProvider( val driWithSourceSets = DRIWithSourceSets(dri, setOfNotNull(sourceSet)) getLocalLocation(driWithSourceSets, context) ?: getLocalLocation(driWithSourceSets.copy(dri = dri.copy(target = PointingToDeclaration)), context) + ?: getLocalLocation(driWithSourceSets.copy(dri = dri.copy(target = PointingToDeclaration, extra = null)), context) // Not found in PageGraph, that means it's an external link ?: getExternalLocation(dri, sourceSets) ?: getExternalLocation(dri.copy(target = PointingToDeclaration), sourceSets) diff --git a/plugins/base/src/test/kotlin/linking/EnumValuesLinking.kt b/plugins/base/src/test/kotlin/linking/EnumValuesLinking.kt index f690dfbdae..0ca0b93358 100644 --- a/plugins/base/src/test/kotlin/linking/EnumValuesLinking.kt +++ b/plugins/base/src/test/kotlin/linking/EnumValuesLinking.kt @@ -1,16 +1,23 @@ package linking import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest +import org.jetbrains.dokka.model.dfs import org.jetbrains.dokka.model.doc.DocumentationLink +import org.jetbrains.dokka.pages.ContentDRILink +import org.jetbrains.dokka.pages.ContentPage +import org.jetbrains.kotlin.utils.addToStdlib.safeAs +import org.jsoup.Jsoup +import org.junit.jupiter.api.Assertions.* import org.junit.jupiter.api.Test import java.nio.file.Paths -import org.junit.jupiter.api.Assertions.assertEquals +import utils.TestOutputWriterPlugin import java.lang.AssertionError class EnumValuesLinking : BaseAbstractTest() { @Test fun `check if enum values are correctly linked`() { + val writerPlugin = TestOutputWriterPlugin() val testDataDir = getTestDataDir("linking").toAbsolutePath() testFromData( dokkaConfiguration { @@ -21,7 +28,8 @@ class EnumValuesLinking : BaseAbstractTest() { name = "jvm" } } - } + }, + pluginOverrides = listOf(writerPlugin) ) { documentablesTransformationStage = { val classlikes = it.packages.single().children @@ -31,16 +39,16 @@ class EnumValuesLinking : BaseAbstractTest() { javaLinker.documentation.values.single().children.run { when (val kotlinLink = this[0].children[1].children[1]) { is DocumentationLink -> kotlinLink.dri.run { - assertEquals("KotlinEnum", this.classNames) - assertEquals("ON_CREATE", this.callable?.name) + assertEquals("KotlinEnum.ON_CREATE", this.classNames) + assertEquals(null, this.callable) } else -> throw AssertionError("Link node is not DocumentationLink type") } when (val javaLink = this[0].children[2].children[1]) { is DocumentationLink -> javaLink.dri.run { - assertEquals("JavaEnum", this.classNames) - assertEquals("ON_DECEIT", this.callable?.name) + assertEquals("JavaEnum.ON_DECEIT", this.classNames) + assertEquals(null, this.callable) } else -> throw AssertionError("Link node is not DocumentationLink type") } @@ -50,20 +58,53 @@ class EnumValuesLinking : BaseAbstractTest() { kotlinLinker.documentation.values.single().children.run { when (val kotlinLink = this[0].children[0].children[5]) { is DocumentationLink -> kotlinLink.dri.run { - assertEquals("KotlinEnum", this.classNames) - assertEquals("ON_CREATE", this.callable?.name) + assertEquals("KotlinEnum.ON_CREATE", this.classNames) + assertEquals(null, this.callable) } else -> throw AssertionError("Link node is not DocumentationLink type") } when (val javaLink = this[0].children[0].children[9]) { is DocumentationLink -> javaLink.dri.run { - assertEquals("JavaEnum", this.classNames) - assertEquals("ON_DECEIT", this.callable?.name) + assertEquals("JavaEnum.ON_DECEIT", this.classNames) + assertEquals(null, this.callable) } else -> throw AssertionError("Link node is not DocumentationLink type") } } + + assertEquals( + javaLinker.documentation.values.single().children[0].children[1].children[1].safeAs()?.dri, + kotlinLinker.documentation.values.single().children[0].children[0].children[5].safeAs()?.dri + ) + + assertEquals( + javaLinker.documentation.values.single().children[0].children[2].children[1].safeAs()?.dri, + kotlinLinker.documentation.values.single().children[0].children[0].children[9].safeAs()?.dri + ) + } + + renderingStage = { rootPageNode, _ -> + val classlikes = rootPageNode.children.single().children + assertEquals(4, classlikes.size) + + val javaLinker = classlikes.single { it.name == "JavaLinker" } + (javaLinker as ContentPage).run { + assertNotNull(content.dfs { it is ContentDRILink && it.address.classNames == "KotlinEnum.ON_CREATE" }) + assertNotNull(content.dfs { it is ContentDRILink && it.address.classNames == "JavaEnum.ON_DECEIT" }) + } + + val kotlinLinker = classlikes.single { it.name == "KotlinLinker" } + (kotlinLinker as ContentPage).run { + assertNotNull(content.dfs { it is ContentDRILink && it.address.classNames == "KotlinEnum.ON_CREATE" }) + assertNotNull(content.dfs { it is ContentDRILink && it.address.classNames == "JavaEnum.ON_DECEIT" }) + } + + // single method will throw an exception if there is no single element (0 or 2+) + Jsoup.parse(writerPlugin.writer.contents["root/linking.source/-java-linker/index.html"]).select("a[href=\"../-kotlin-enum/-o-n_-c-r-e-a-t-e/index.html\"]").single() + Jsoup.parse(writerPlugin.writer.contents["root/linking.source/-java-linker/index.html"]).select("a[href=\"../-java-enum/-o-n_-d-e-c-e-i-t/index.html\"]").single() + Jsoup.parse(writerPlugin.writer.contents["root/linking.source/-kotlin-linker/index.html"]).select("a[href=\"../-kotlin-enum/-o-n_-c-r-e-a-t-e/index.html\"]").single() + Jsoup.parse(writerPlugin.writer.contents["root/linking.source/-kotlin-linker/index.html"]).select("a[href=\"../-java-enum/-o-n_-d-e-c-e-i-t/index.html\"]").single() } } } diff --git a/plugins/base/src/test/kotlin/locationProvider/JavadocExternalLocationProviderTest.kt b/plugins/base/src/test/kotlin/locationProvider/JavadocExternalLocationProviderTest.kt index cb2b0331e3..95179e227b 100644 --- a/plugins/base/src/test/kotlin/locationProvider/JavadocExternalLocationProviderTest.kt +++ b/plugins/base/src/test/kotlin/locationProvider/JavadocExternalLocationProviderTest.kt @@ -45,8 +45,8 @@ class JavadocExternalLocationProviderTest : BaseAbstractTest() { ) val javaDri = DRI( "java.nio.file", - "StandardOpenOption", - Callable("CREATE", null, emptyList()), + "StandardOpenOption.CREATE", + null, PointingToDeclaration, DRIExtraContainer().also { it[EnumEntryDRIExtra] = EnumEntryDRIExtra }.encode() ) diff --git a/plugins/base/src/test/kotlin/model/JavaTest.kt b/plugins/base/src/test/kotlin/model/JavaTest.kt index 886aa0be46..aa132f6e2d 100644 --- a/plugins/base/src/test/kotlin/model/JavaTest.kt +++ b/plugins/base/src/test/kotlin/model/JavaTest.kt @@ -391,8 +391,8 @@ class JavaTest : AbstractModelTest("/src/main/kotlin/java/Test.java", "java") { "RUNTIME", DRI( "java.lang.annotation", - "RetentionPolicy", - DRICallable("RUNTIME", null, emptyList()), + "RetentionPolicy.RUNTIME", + null, PointingToDeclaration, DRIExtraContainer().also { it[EnumEntryDRIExtra] = EnumEntryDRIExtra }.encode() ) From dc377cca9491b9238eb19c80c3ecff8ca4dc6427 Mon Sep 17 00:00:00 2001 From: Andrzej Ratajczak Date: Mon, 17 Jan 2022 14:52:23 +0100 Subject: [PATCH 3/6] Updates EnumEntry extras in documentable translators --- .../main/kotlin/resolvers/local/DokkaLocationProvider.kt | 1 - .../DefaultDescriptorToDocumentableTranslator.kt | 2 +- .../translators/psi/DefaultPsiToDocumentableTranslator.kt | 8 ++++---- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/plugins/base/src/main/kotlin/resolvers/local/DokkaLocationProvider.kt b/plugins/base/src/main/kotlin/resolvers/local/DokkaLocationProvider.kt index 691ae26e69..c4c4633178 100644 --- a/plugins/base/src/main/kotlin/resolvers/local/DokkaLocationProvider.kt +++ b/plugins/base/src/main/kotlin/resolvers/local/DokkaLocationProvider.kt @@ -82,7 +82,6 @@ open class DokkaLocationProvider( val driWithSourceSets = DRIWithSourceSets(dri, setOfNotNull(sourceSet)) getLocalLocation(driWithSourceSets, context) ?: getLocalLocation(driWithSourceSets.copy(dri = dri.copy(target = PointingToDeclaration)), context) - ?: getLocalLocation(driWithSourceSets.copy(dri = dri.copy(target = PointingToDeclaration, extra = null)), context) // Not found in PageGraph, that means it's an external link ?: getExternalLocation(dri, sourceSets) ?: getExternalLocation(dri.copy(target = PointingToDeclaration), sourceSets) diff --git a/plugins/base/src/main/kotlin/translators/descriptors/DefaultDescriptorToDocumentableTranslator.kt b/plugins/base/src/main/kotlin/translators/descriptors/DefaultDescriptorToDocumentableTranslator.kt index 04716e1632..84fcd12db1 100644 --- a/plugins/base/src/main/kotlin/translators/descriptors/DefaultDescriptorToDocumentableTranslator.kt +++ b/plugins/base/src/main/kotlin/translators/descriptors/DefaultDescriptorToDocumentableTranslator.kt @@ -306,7 +306,7 @@ private class DokkaDescriptorVisitor( val classlikes = async { descriptorsWithKind.classlikes.visitClasslikes(driWithPlatform) } DEnumEntry( - dri = driWithPlatform.dri, + dri = driWithPlatform.dri.copy(extra = DRIExtraContainer().also { it[EnumEntryDRIExtra] = EnumEntryDRIExtra }.encode()), name = descriptor.name.asString(), documentation = descriptor.resolveDescriptorData(), functions = functions.await(), diff --git a/plugins/base/src/main/kotlin/translators/psi/DefaultPsiToDocumentableTranslator.kt b/plugins/base/src/main/kotlin/translators/psi/DefaultPsiToDocumentableTranslator.kt index e7028ef028..de10b54e24 100644 --- a/plugins/base/src/main/kotlin/translators/psi/DefaultPsiToDocumentableTranslator.kt +++ b/plugins/base/src/main/kotlin/translators/psi/DefaultPsiToDocumentableTranslator.kt @@ -21,11 +21,11 @@ import org.jetbrains.dokka.base.translators.isDirectlyAnException import org.jetbrains.dokka.base.translators.psi.parsers.JavaDocumentationParser import org.jetbrains.dokka.base.translators.psi.parsers.JavadocParser import org.jetbrains.dokka.base.translators.unquotedValue -import org.jetbrains.dokka.links.DRI -import org.jetbrains.dokka.links.nextTarget -import org.jetbrains.dokka.links.withClass +import org.jetbrains.dokka.links.* import org.jetbrains.dokka.model.* import org.jetbrains.dokka.model.AnnotationTarget +import org.jetbrains.dokka.model.Nullable +import org.jetbrains.dokka.model.TypeConstructor import org.jetbrains.dokka.model.doc.DocumentationNode import org.jetbrains.dokka.model.doc.Param import org.jetbrains.dokka.model.properties.PropertyContainer @@ -269,7 +269,7 @@ class DefaultPsiToDocumentableTranslator( name.orEmpty(), fields.filterIsInstance().map { entry -> DEnumEntry( - dri.withClass(entry.name), + dri.withClass(entry.name).copy(extra = DRIExtraContainer().also { it[EnumEntryDRIExtra] = EnumEntryDRIExtra }.encode()), entry.name, javadocParser.parseDocumentation(entry).toSourceSetDependent(), null, From a9c8e8db3d391a3ceee73a5eb1a620c3880886a1 Mon Sep 17 00:00:00 2001 From: Andrzej Ratajczak Date: Mon, 17 Jan 2022 16:08:17 +0100 Subject: [PATCH 4/6] Fix tests --- core/src/main/kotlin/links/DRI.kt | 8 +++++++- plugins/base/src/test/kotlin/enums/EnumsTest.kt | 4 ++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/core/src/main/kotlin/links/DRI.kt b/core/src/main/kotlin/links/DRI.kt index c646934ddf..f848d5ec52 100644 --- a/core/src/main/kotlin/links/DRI.kt +++ b/core/src/main/kotlin/links/DRI.kt @@ -53,7 +53,13 @@ fun DRI.withTargetToDeclaration() = copy(target = PointingToDeclaration) val DRI.parent: DRI get() = when { - extra != null -> copy(extra = null) + extra != null -> when { + DRIExtraContainer(extra)[EnumEntryDRIExtra] != null -> copy( + classNames = classNames?.substringBeforeLast(".", "")?.takeIf { it.isNotBlank() }, + extra = null + ) + else -> copy(extra = null) + } target != PointingToDeclaration -> copy(target = PointingToDeclaration) callable != null -> copy(callable = null) classNames != null -> copy(classNames = classNames.substringBeforeLast(".", "").takeIf { it.isNotBlank() }) diff --git a/plugins/base/src/test/kotlin/enums/EnumsTest.kt b/plugins/base/src/test/kotlin/enums/EnumsTest.kt index 59a4c6f2e8..bfdfa73b27 100644 --- a/plugins/base/src/test/kotlin/enums/EnumsTest.kt +++ b/plugins/base/src/test/kotlin/enums/EnumsTest.kt @@ -125,7 +125,7 @@ class EnumsTest : BaseAbstractTest() { pagesGenerationStage = { module -> val entryPage = module.dfs { it.name == "E1" } as ClasslikePageNode val signaturePart = (entryPage.content.dfs { - it is ContentGroup && it.dci.toString() == "[enums/Test.E1///PointingToDeclaration/][Symbol]" + it is ContentGroup && it.dci.toString() == "[enums/Test.E1///PointingToDeclaration/{\"org.jetbrains.dokka.links.EnumEntryDRIExtra\":{\"key\":\"org.jetbrains.dokka.links.EnumEntryDRIExtra\"}}][Symbol]" } as ContentGroup) assertEquals("(\"e1\", 1, true)", signaturePart.constructorSignature()) } @@ -202,7 +202,7 @@ class EnumsTest : BaseAbstractTest() { ) { pagesTransformationStage = { m -> val entryNode = m.children.first { it.name == "enums" }.children.first { it.name == "Test" }.children.firstIsInstance() - val signature = (entryNode.content as ContentGroup).dfs { it is ContentGroup && it.dci.toString() == "[enums/Test.E1///PointingToDeclaration/][Cover]" } as ContentGroup + val signature = (entryNode.content as ContentGroup).dfs { it is ContentGroup && it.dci.toString() == "[enums/Test.E1///PointingToDeclaration/{\"org.jetbrains.dokka.links.EnumEntryDRIExtra\":{\"key\":\"org.jetbrains.dokka.links.EnumEntryDRIExtra\"}}][Cover]" } as ContentGroup signature.assertNode { header(1) { +"E1" } From a3c9a6af9305b388affcf4f9066a1eae407adcdc Mon Sep 17 00:00:00 2001 From: Andrzej Ratajczak Date: Mon, 17 Jan 2022 16:31:42 +0100 Subject: [PATCH 5/6] Apply requested changes --- core/src/main/kotlin/utilities/Html.kt | 4 ++-- .../DefaultDescriptorToDocumentableTranslator.kt | 2 +- .../translators/psi/DefaultPsiToDocumentableTranslator.kt | 2 +- .../main/kotlin/translators/psi/parsers/JavadocParser.kt | 2 +- .../{EnumValuesLinking.kt => EnumValuesLinkingTest.kt} | 8 +++++++- .../dokka/javadoc/JavadocClasslikeTemplateMapTest.kt | 4 ++-- 6 files changed, 14 insertions(+), 8 deletions(-) rename plugins/base/src/test/kotlin/linking/{EnumValuesLinking.kt => EnumValuesLinkingTest.kt} (92%) diff --git a/core/src/main/kotlin/utilities/Html.kt b/core/src/main/kotlin/utilities/Html.kt index 3226ca9daa..874c9fb1f2 100644 --- a/core/src/main/kotlin/utilities/Html.kt +++ b/core/src/main/kotlin/utilities/Html.kt @@ -7,9 +7,9 @@ import java.net.URLEncoder * Replaces symbols reserved in HTML with their respective entities. * Replaces & with &, < with < and > with > */ -fun String.htmlEscape(): String = replace("&", "&").replace("<", "<").replace(">", ">") +fun String.htmlEscape(): String = replace("&", "&").replace("<", "<").replace(">", ">").replace("\"", """) fun String.urlEncoded(): String = URLEncoder.encode(this, "UTF-8") fun String.formatToEndWithHtml() = - if (endsWith(".html") || contains(Regex("\\.html#"))) this else "$this.html" \ No newline at end of file + if (endsWith(".html") || contains(Regex("\\.html#"))) this else "$this.html" diff --git a/plugins/base/src/main/kotlin/translators/descriptors/DefaultDescriptorToDocumentableTranslator.kt b/plugins/base/src/main/kotlin/translators/descriptors/DefaultDescriptorToDocumentableTranslator.kt index 84fcd12db1..4fe9a636fb 100644 --- a/plugins/base/src/main/kotlin/translators/descriptors/DefaultDescriptorToDocumentableTranslator.kt +++ b/plugins/base/src/main/kotlin/translators/descriptors/DefaultDescriptorToDocumentableTranslator.kt @@ -306,7 +306,7 @@ private class DokkaDescriptorVisitor( val classlikes = async { descriptorsWithKind.classlikes.visitClasslikes(driWithPlatform) } DEnumEntry( - dri = driWithPlatform.dri.copy(extra = DRIExtraContainer().also { it[EnumEntryDRIExtra] = EnumEntryDRIExtra }.encode()), + dri = driWithPlatform.dri.copy(extra = DRIExtraContainer(driWithPlatform.dri.extra).also { it[EnumEntryDRIExtra] = EnumEntryDRIExtra }.encode()), name = descriptor.name.asString(), documentation = descriptor.resolveDescriptorData(), functions = functions.await(), diff --git a/plugins/base/src/main/kotlin/translators/psi/DefaultPsiToDocumentableTranslator.kt b/plugins/base/src/main/kotlin/translators/psi/DefaultPsiToDocumentableTranslator.kt index de10b54e24..2e2c850aee 100644 --- a/plugins/base/src/main/kotlin/translators/psi/DefaultPsiToDocumentableTranslator.kt +++ b/plugins/base/src/main/kotlin/translators/psi/DefaultPsiToDocumentableTranslator.kt @@ -269,7 +269,7 @@ class DefaultPsiToDocumentableTranslator( name.orEmpty(), fields.filterIsInstance().map { entry -> DEnumEntry( - dri.withClass(entry.name).copy(extra = DRIExtraContainer().also { it[EnumEntryDRIExtra] = EnumEntryDRIExtra }.encode()), + dri.withClass(entry.name).copy(extra = DRIExtraContainer(dri.extra).also { it[EnumEntryDRIExtra] = EnumEntryDRIExtra }.encode()), entry.name, javadocParser.parseDocumentation(entry).toSourceSetDependent(), null, diff --git a/plugins/base/src/main/kotlin/translators/psi/parsers/JavadocParser.kt b/plugins/base/src/main/kotlin/translators/psi/parsers/JavadocParser.kt index a501ae55ca..fd8a49c89b 100644 --- a/plugins/base/src/main/kotlin/translators/psi/parsers/JavadocParser.kt +++ b/plugins/base/src/main/kotlin/translators/psi/parsers/JavadocParser.kt @@ -326,7 +326,7 @@ class JavadocParser( dri.toString() } ?: UNRESOLVED_PSI_ELEMENT - return """${label.ifBlank{ defaultLabel().text }}""" + return """${label.ifBlank{ defaultLabel().text }}""" } private fun convertInlineDocTag( diff --git a/plugins/base/src/test/kotlin/linking/EnumValuesLinking.kt b/plugins/base/src/test/kotlin/linking/EnumValuesLinkingTest.kt similarity index 92% rename from plugins/base/src/test/kotlin/linking/EnumValuesLinking.kt rename to plugins/base/src/test/kotlin/linking/EnumValuesLinkingTest.kt index 0ca0b93358..29e705fdd6 100644 --- a/plugins/base/src/test/kotlin/linking/EnumValuesLinking.kt +++ b/plugins/base/src/test/kotlin/linking/EnumValuesLinkingTest.kt @@ -1,6 +1,8 @@ package linking import org.jetbrains.dokka.base.testApi.testRunner.BaseAbstractTest +import org.jetbrains.dokka.links.DRIExtraContainer +import org.jetbrains.dokka.links.EnumEntryDRIExtra import org.jetbrains.dokka.model.dfs import org.jetbrains.dokka.model.doc.DocumentationLink import org.jetbrains.dokka.pages.ContentDRILink @@ -13,7 +15,7 @@ import java.nio.file.Paths import utils.TestOutputWriterPlugin import java.lang.AssertionError -class EnumValuesLinking : BaseAbstractTest() { +class EnumValuesLinkingTest : BaseAbstractTest() { @Test fun `check if enum values are correctly linked`() { @@ -41,6 +43,7 @@ class EnumValuesLinking : BaseAbstractTest() { is DocumentationLink -> kotlinLink.dri.run { assertEquals("KotlinEnum.ON_CREATE", this.classNames) assertEquals(null, this.callable) + assertNotNull(DRIExtraContainer(extra)[EnumEntryDRIExtra]) } else -> throw AssertionError("Link node is not DocumentationLink type") } @@ -49,6 +52,7 @@ class EnumValuesLinking : BaseAbstractTest() { is DocumentationLink -> javaLink.dri.run { assertEquals("JavaEnum.ON_DECEIT", this.classNames) assertEquals(null, this.callable) + assertNotNull(DRIExtraContainer(extra)[EnumEntryDRIExtra]) } else -> throw AssertionError("Link node is not DocumentationLink type") } @@ -60,6 +64,7 @@ class EnumValuesLinking : BaseAbstractTest() { is DocumentationLink -> kotlinLink.dri.run { assertEquals("KotlinEnum.ON_CREATE", this.classNames) assertEquals(null, this.callable) + assertNotNull(DRIExtraContainer(extra)[EnumEntryDRIExtra]) } else -> throw AssertionError("Link node is not DocumentationLink type") } @@ -68,6 +73,7 @@ class EnumValuesLinking : BaseAbstractTest() { is DocumentationLink -> javaLink.dri.run { assertEquals("JavaEnum.ON_DECEIT", this.classNames) assertEquals(null, this.callable) + assertNotNull(DRIExtraContainer(extra)[EnumEntryDRIExtra]) } else -> throw AssertionError("Link node is not DocumentationLink type") } diff --git a/plugins/javadoc/src/test/kotlin/org/jetbrains/dokka/javadoc/JavadocClasslikeTemplateMapTest.kt b/plugins/javadoc/src/test/kotlin/org/jetbrains/dokka/javadoc/JavadocClasslikeTemplateMapTest.kt index 19ef6ae7c0..10240a3f3b 100644 --- a/plugins/javadoc/src/test/kotlin/org/jetbrains/dokka/javadoc/JavadocClasslikeTemplateMapTest.kt +++ b/plugins/javadoc/src/test/kotlin/org/jetbrains/dokka/javadoc/JavadocClasslikeTemplateMapTest.kt @@ -149,13 +149,13 @@ internal class JavadocClasslikeTemplateMapTest : AbstractJavadocTemplateMapTest( val map = allPagesOfType().first { it.name == "TestClass" }.templateMap assertEquals("TestClass", map["name"]) val signature = assertIsInstance>(map["signature"]) - assertEquals("@Author(name = \"Benjamin Franklin\")", signature["annotations"]) + assertEquals("@Author(name = "Benjamin Franklin")", signature["annotations"]) val methods = assertIsInstance>(map["methods"]) val ownMethods = assertIsInstance>(methods["own"]) val method = assertIsInstance>(ownMethods.single()) val methodSignature = assertIsInstance>(method["signature"]) - assertEquals("@Author(name = \"Franklin D. Roosevelt\")", methodSignature["annotations"]) + assertEquals("@Author(name = "Franklin D. Roosevelt")", methodSignature["annotations"]) } } From 0b4adf7956021bbdd133fae4a5fc0b999e940426 Mon Sep 17 00:00:00 2001 From: Andrzej Ratajczak Date: Tue, 18 Jan 2022 18:56:40 +0100 Subject: [PATCH 6/6] Apply requested changes --- core/api/core.api | 1 + core/src/main/kotlin/links/DRI.kt | 4 ++++ .../kotlin/org/jetbrains/dokka/analysis/DRIFactory.kt | 10 +++++++--- .../DefaultDescriptorToDocumentableTranslator.kt | 2 +- .../psi/DefaultPsiToDocumentableTranslator.kt | 2 +- 5 files changed, 14 insertions(+), 5 deletions(-) diff --git a/core/api/core.api b/core/api/core.api index 471f63142a..b7e8e28abf 100644 --- a/core/api/core.api +++ b/core/api/core.api @@ -503,6 +503,7 @@ public final class org/jetbrains/dokka/links/DRIKt { public static final fun getSureClassNames (Lorg/jetbrains/dokka/links/DRI;)Ljava/lang/String; public static final fun nextTarget (Lorg/jetbrains/dokka/links/DriTarget;)Lorg/jetbrains/dokka/links/DriTarget; public static final fun withClass (Lorg/jetbrains/dokka/links/DRI;Ljava/lang/String;)Lorg/jetbrains/dokka/links/DRI; + public static final fun withEnumEntryExtra (Lorg/jetbrains/dokka/links/DRI;)Lorg/jetbrains/dokka/links/DRI; public static final fun withTargetToDeclaration (Lorg/jetbrains/dokka/links/DRI;)Lorg/jetbrains/dokka/links/DRI; } diff --git a/core/src/main/kotlin/links/DRI.kt b/core/src/main/kotlin/links/DRI.kt index f848d5ec52..7fb449474d 100644 --- a/core/src/main/kotlin/links/DRI.kt +++ b/core/src/main/kotlin/links/DRI.kt @@ -51,6 +51,10 @@ fun DRI.withClass(name: String) = copy(classNames = if (classNames.isNullOrBlank fun DRI.withTargetToDeclaration() = copy(target = PointingToDeclaration) +fun DRI.withEnumEntryExtra() = copy( + extra = DRIExtraContainer(this.extra).also { it[EnumEntryDRIExtra] = EnumEntryDRIExtra }.encode() +) + val DRI.parent: DRI get() = when { extra != null -> when { diff --git a/kotlin-analysis/src/main/kotlin/org/jetbrains/dokka/analysis/DRIFactory.kt b/kotlin-analysis/src/main/kotlin/org/jetbrains/dokka/analysis/DRIFactory.kt index 0aebad0024..33c9927578 100644 --- a/kotlin-analysis/src/main/kotlin/org/jetbrains/dokka/analysis/DRIFactory.kt +++ b/kotlin-analysis/src/main/kotlin/org/jetbrains/dokka/analysis/DRIFactory.kt @@ -32,11 +32,15 @@ fun DRI.Companion.from(psi: PsiElement) = psi.parentsWithSelf.run { val psiField = firstIsInstanceOrNull() val classes = filterIsInstance().filterNot { it is PsiTypeParameter } .toList() // We only want exact PsiClass types, not PsiTypeParameter subtype + val additionalClasses = if (psi is PsiEnumConstant) listOfNotNull(psiField?.name) else emptyList() DRI( packageName = classes.lastOrNull()?.qualifiedName?.substringBeforeLast('.', "") ?: "", - classNames = (if (psi is PsiEnumConstant) listOfNotNull(psiField?.name) + classes.toList().mapNotNull { it.name } else classes.toList().mapNotNull { it.name }) - .takeIf { it.isNotEmpty() }?.asReversed() - ?.joinToString("."), + classNames = (additionalClasses + classes.mapNotNull { it.name }).takeIf { it.isNotEmpty() } + ?.asReversed()?.joinToString("."), + // The fallback strategy test whether psi is not `PsiEnumConstant`. The reason behind this is that + // we need unified DRI for both Java and Kotlin enums, so we can link them properly and treat them alike. + // To achieve that, we append enum name to classNames list and leave the callable part set to null. For Kotlin enums + // it is by default, while for Java enums we have to explicitly test for that in this `takeUnless` condition. callable = psiMethod?.let { Callable.from(it) } ?: psiField?.takeUnless { psi is PsiEnumConstant }?.let { Callable.from(it) }, target = DriTarget.from(psi), extra = if (psi is PsiEnumConstant) diff --git a/plugins/base/src/main/kotlin/translators/descriptors/DefaultDescriptorToDocumentableTranslator.kt b/plugins/base/src/main/kotlin/translators/descriptors/DefaultDescriptorToDocumentableTranslator.kt index 4fe9a636fb..d336fac138 100644 --- a/plugins/base/src/main/kotlin/translators/descriptors/DefaultDescriptorToDocumentableTranslator.kt +++ b/plugins/base/src/main/kotlin/translators/descriptors/DefaultDescriptorToDocumentableTranslator.kt @@ -306,7 +306,7 @@ private class DokkaDescriptorVisitor( val classlikes = async { descriptorsWithKind.classlikes.visitClasslikes(driWithPlatform) } DEnumEntry( - dri = driWithPlatform.dri.copy(extra = DRIExtraContainer(driWithPlatform.dri.extra).also { it[EnumEntryDRIExtra] = EnumEntryDRIExtra }.encode()), + dri = driWithPlatform.dri.withEnumEntryExtra(), name = descriptor.name.asString(), documentation = descriptor.resolveDescriptorData(), functions = functions.await(), diff --git a/plugins/base/src/main/kotlin/translators/psi/DefaultPsiToDocumentableTranslator.kt b/plugins/base/src/main/kotlin/translators/psi/DefaultPsiToDocumentableTranslator.kt index 2e2c850aee..79b4798c69 100644 --- a/plugins/base/src/main/kotlin/translators/psi/DefaultPsiToDocumentableTranslator.kt +++ b/plugins/base/src/main/kotlin/translators/psi/DefaultPsiToDocumentableTranslator.kt @@ -269,7 +269,7 @@ class DefaultPsiToDocumentableTranslator( name.orEmpty(), fields.filterIsInstance().map { entry -> DEnumEntry( - dri.withClass(entry.name).copy(extra = DRIExtraContainer(dri.extra).also { it[EnumEntryDRIExtra] = EnumEntryDRIExtra }.encode()), + dri.withClass(entry.name).withEnumEntryExtra(), entry.name, javadocParser.parseDocumentation(entry).toSourceSetDependent(), null,