aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/src/main/kotlin/model/DisplaySourceSet.kt8
-rw-r--r--plugins/base/src/main/kotlin/resolvers/local/DokkaLocationProvider.kt27
-rw-r--r--plugins/base/src/test/kotlin/linkableContent/LinkableContentTest.kt47
3 files changed, 74 insertions, 8 deletions
diff --git a/core/src/main/kotlin/model/DisplaySourceSet.kt b/core/src/main/kotlin/model/DisplaySourceSet.kt
index 85904db6..5ea1ba3d 100644
--- a/core/src/main/kotlin/model/DisplaySourceSet.kt
+++ b/core/src/main/kotlin/model/DisplaySourceSet.kt
@@ -5,6 +5,14 @@ import org.jetbrains.dokka.DokkaSourceSetID
import org.jetbrains.dokka.Platform
import org.jetbrains.dokka.utilities.SelfRepresentingSingletonSet
+/**
+ * TODO: fix the example (asymmetric equivalence relation with [Set]):
+ * ```
+ * val ds = DokkaSourceSetImpl(sourceSetID = DokkaSourceSetID("", "")).toDisplaySourceSet()
+ * println(setOf(ds) == ds) // true
+ * println(ds == setOf(ds)) // false
+ * ```
+ */
data class DisplaySourceSet(
val sourceSetIDs: CompositeSourceSetID,
val name: String,
diff --git a/plugins/base/src/main/kotlin/resolvers/local/DokkaLocationProvider.kt b/plugins/base/src/main/kotlin/resolvers/local/DokkaLocationProvider.kt
index cae0ccaf..4934e8f4 100644
--- a/plugins/base/src/main/kotlin/resolvers/local/DokkaLocationProvider.kt
+++ b/plugins/base/src/main/kotlin/resolvers/local/DokkaLocationProvider.kt
@@ -89,24 +89,35 @@ open class DokkaLocationProvider(
private fun getLocalLocation(driWithSourceSets: DRIWithSourceSets, context: PageNode?): String? {
val (dri, originalSourceSet) = driWithSourceSets
- val allSourceSets =
+ val allSourceSets: List<Set<DisplaySourceSet>> =
listOf(originalSourceSet) + originalSourceSet.let { oss ->
dokkaContext.configuration.sourceSets.filter { it.sourceSetID in oss.sourceSetIDs }
.flatMap { it.dependentSourceSets }
.mapNotNull { ssid ->
dokkaContext.configuration.sourceSets.find { it.sourceSetID == ssid }?.toDisplaySourceSet()
+ }.map {
+ // be careful `data DisplaySourceSet: Set<DisplaySourceSet>` but `setOf(someDisplaySourceSet) != someDisplaySourceSet`
+ setOf(it)
}
}
- return allSourceSets.asSequence().mapNotNull { displaySourceSet ->
- pagesIndex[DRIWithSourceSets(dri, displaySourceSet)]?.let { page -> resolve(page, context) }
- ?: anchorsIndex[driWithSourceSets]?.let { (page, kind) ->
- val dci = DCI(setOf(dri), kind)
- resolve(page, context) + "#" + anchorForDCI(dci, displaySourceSet)
- }
- }.firstOrNull()
+ return getLocalPageLink(dri, allSourceSets, context)
+ ?: getLocalAnchor(dri, allSourceSets, context)
}
+ private fun getLocalPageLink(dri: DRI, allSourceSets: Iterable<Set<DisplaySourceSet>>, context: PageNode?) =
+ allSourceSets.mapNotNull { displaySourceSet ->
+ pagesIndex[DRIWithSourceSets(dri, displaySourceSet)]
+ }.firstOrNull()?.let { page -> resolve(page, context) }
+
+ private fun getLocalAnchor(dri: DRI, allSourceSets: Iterable<Set<DisplaySourceSet>>, context: PageNode?) =
+ allSourceSets.mapNotNull { displaySourceSet ->
+ anchorsIndex[DRIWithSourceSets(dri, displaySourceSet)]?.let { (page, kind) ->
+ val dci = DCI(setOf(dri), kind)
+ resolve(page, context) + "#" + anchorForDCI(dci, displaySourceSet)
+ }
+ }.firstOrNull()
+
override fun pathToRoot(from: PageNode): String =
pathTo(pageGraphRoot, from).removeSuffix(PAGE_WITH_CHILDREN_SUFFIX)
diff --git a/plugins/base/src/test/kotlin/linkableContent/LinkableContentTest.kt b/plugins/base/src/test/kotlin/linkableContent/LinkableContentTest.kt
index 7dfe1e1d..d7ac8b97 100644
--- a/plugins/base/src/test/kotlin/linkableContent/LinkableContentTest.kt
+++ b/plugins/base/src/test/kotlin/linkableContent/LinkableContentTest.kt
@@ -10,11 +10,14 @@ import org.jetbrains.dokka.model.doc.Text
import org.jetbrains.dokka.pages.*
import org.jetbrains.kotlin.utils.addToStdlib.cast
import org.jetbrains.kotlin.utils.addToStdlib.safeAs
+import org.jsoup.Jsoup
import org.junit.jupiter.api.Assertions
import org.junit.jupiter.api.Test
+import utils.TestOutputWriterPlugin
import utils.assertNotNull
import java.net.URL
import java.nio.file.Paths
+import kotlin.test.assertEquals
class LinkableContentTest : BaseAbstractTest() {
@@ -360,4 +363,48 @@ class LinkableContentTest : BaseAbstractTest() {
}
}
+
+ @Test
+ fun `should have a correct link to declaration from another source set`() {
+ val writerPlugin = TestOutputWriterPlugin()
+ val configuration = dokkaConfiguration {
+ sourceSets {
+ val common = sourceSet {
+ sourceRoots = listOf("src/commonMain")
+ analysisPlatform = "common"
+ name = "common"
+ displayName = "common"
+ }
+ sourceSet {
+ sourceRoots = listOf("src/jvmMain/")
+ analysisPlatform = "jvm"
+ name = "jvm"
+ displayName = "jvm"
+ dependentSourceSets = setOf(common.value.sourceSetID)
+ }
+ }
+ }
+
+ testInline(
+ """
+ /src/commonMain/main.kt
+ class A
+ /src/jvmMain/main.kt
+ /**
+ * link to [A]
+ */
+ class B
+ """.trimIndent()
+ ,
+ pluginOverrides = listOf(writerPlugin),
+ configuration = configuration
+ ) {
+ renderingStage = { _, _ ->
+ val page =
+ Jsoup.parse(writerPlugin.writer.contents.getValue("root/[root]/-b/index.html"))
+ val link = page.select(".paragraph a").single()
+ assertEquals("../-a/index.html", link.attr("href"))
+ }
+ }
+ }
}