From 45e7e5900cd5d060a8019463217c1a2254799635 Mon Sep 17 00:00:00 2001 From: IgnatBeresnev Date: Fri, 13 Jan 2023 23:28:48 +0100 Subject: [PATCH] Do not leak implementation details in generated Javadoc links Fixes #2803 --- .../jetbrains/dokka/javadoc/pages/utils.kt | 28 +++++++++++-------- .../javadoc/location/JavadocLocationTest.kt | 28 +++++++++++++++++++ 2 files changed, 45 insertions(+), 11 deletions(-) diff --git a/plugins/javadoc/src/main/kotlin/org/jetbrains/dokka/javadoc/pages/utils.kt b/plugins/javadoc/src/main/kotlin/org/jetbrains/dokka/javadoc/pages/utils.kt index de6193a750..37810455ef 100644 --- a/plugins/javadoc/src/main/kotlin/org/jetbrains/dokka/javadoc/pages/utils.kt +++ b/plugins/javadoc/src/main/kotlin/org/jetbrains/dokka/javadoc/pages/utils.kt @@ -2,14 +2,20 @@ package org.jetbrains.dokka.javadoc.pages import org.jetbrains.dokka.model.* -internal fun JavadocFunctionNode.getAnchor(): String = - "$name(${parameters.joinToString(",") { - when (val bound = if (it.typeBound is Nullable) it.typeBound.inner else it.typeBound) { - is TypeConstructor -> listOf(bound.dri.packageName, bound.dri.classNames).joinToString(".") - is TypeParameter -> bound.name - is PrimitiveJavaType -> bound.name - is UnresolvedBound -> bound.name - is JavaObject -> "Object" - else -> bound.toString() - } - }})" \ No newline at end of file +internal fun JavadocFunctionNode.getAnchor(): String { + val parameters = parameters.joinToString(",") { it.typeBound.asString() } + return "$name($parameters)" +} + +private fun Bound.asString(): String = when (this) { + is Nullable -> this.inner.asString() + is DefinitelyNonNullable -> this.inner.asString() + is TypeConstructor -> listOf(this.dri.packageName, this.dri.classNames).joinToString(".") + is TypeParameter -> this.name + is PrimitiveJavaType -> this.name + is UnresolvedBound -> this.name + is TypeAliased -> this.typeAlias.asString() + is JavaObject -> "Object" + Dynamic -> "dynamic" + Void -> "void" +} \ No newline at end of file diff --git a/plugins/javadoc/src/test/kotlin/org/jetbrains/dokka/javadoc/location/JavadocLocationTest.kt b/plugins/javadoc/src/test/kotlin/org/jetbrains/dokka/javadoc/location/JavadocLocationTest.kt index fe94479472..88c01e18e6 100644 --- a/plugins/javadoc/src/test/kotlin/org/jetbrains/dokka/javadoc/location/JavadocLocationTest.kt +++ b/plugins/javadoc/src/test/kotlin/org/jetbrains/dokka/javadoc/location/JavadocLocationTest.kt @@ -47,6 +47,15 @@ class JavadocLocationTest : BaseAbstractTest() { | * Referencing element from another package: [javadoc.test.Test] | */ |class Referenced {} + | + |/jvmSrc/javadoc/test/FunctionParameters.kt + |package javadoc.test.functionparams + | + |typealias FunctionParamTypealias = String + | + |class FunctionParameters { + | fun foo(param: FunctionParamTypealias) {} + |} """.trimIndent(), config, cleanupOutput = false, @@ -151,6 +160,25 @@ class JavadocLocationTest : BaseAbstractTest() { } } + @Test + fun `should resolve typealias function parameter`() { + locationTestInline { rootPageNode, dokkaContext -> + val transformer = htmlTranslator(rootPageNode, dokkaContext) + val containingClass = rootPageNode + .firstChildOfType { it.name == "javadoc.test.functionparams" } + .firstChildOfType { it.name == "FunctionParameters" } + + val methodWithTypealiasParam = containingClass.methods.single { it.name == "foo" } + val methodSignatureHtml = transformer.htmlForContentNode(methodWithTypealiasParam.signature, null) + + val expectedSignatureHtml = "final Unit " + + "foo" + + "(String param)" + + assertEquals(expectedSignatureHtml, methodSignatureHtml) + } + } + private fun htmlTranslator(rootPageNode: RootPageNode, dokkaContext: DokkaContext): JavadocContentToHtmlTranslator { val locationProvider = dokkaContext.plugin().querySingle { locationProviderFactory } .getLocationProvider(rootPageNode) as JavadocLocationProvider