Skip to content

Commit

Permalink
Fix unresolved link to declaration from another source set (#2878)
Browse files Browse the repository at this point in the history
  • Loading branch information
vmishenev committed Feb 28, 2023
1 parent 00c9142 commit 8e31355
Show file tree
Hide file tree
Showing 3 changed files with 74 additions and 8 deletions.
8 changes: 8 additions & 0 deletions core/src/main/kotlin/model/DisplaySourceSet.kt
Expand Up @@ -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,
Expand Down
Expand Up @@ -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)

Expand Down
Expand Up @@ -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() {

Expand Down Expand Up @@ -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"))
}
}
}
}

0 comments on commit 8e31355

Please sign in to comment.