Skip to content

Commit

Permalink
Replace Iterable<DisplaySourceSet>.sourceSetIDs with more straightfor…
Browse files Browse the repository at this point in the history
…ward Iterable<DisplaySourceSet>.computeSourceSetIds()

* Refactor all the usages, save some allocations
* Start caching CompositeSourceSetID properties to avoid excessive allocations
  • Loading branch information
qwwdfsad committed Aug 4, 2023
1 parent b349cc6 commit c20a1f3
Show file tree
Hide file tree
Showing 6 changed files with 24 additions and 28 deletions.
18 changes: 8 additions & 10 deletions core/src/main/kotlin/model/CompositeSourceSetID.kt
Original file line number Diff line number Diff line change
Expand Up @@ -13,16 +13,14 @@ data class CompositeSourceSetID(
require(children.isNotEmpty()) { "Expected at least one source set id" }
}

val merged: DokkaSourceSetID
get() = children.sortedBy { it.scopeId + it.sourceSetName }.let { sortedChildren ->
DokkaSourceSetID(
scopeId = sortedChildren.joinToString(separator = "+") { it.scopeId },
sourceSetName = sortedChildren.joinToString(separator = "+") { it.sourceSetName }
)
}

val all: Set<DokkaSourceSetID>
get() = setOf(merged, *children.toTypedArray())
val merged: DokkaSourceSetID = children.sortedBy { it.scopeId + it.sourceSetName }.let { sortedChildren ->
DokkaSourceSetID(
scopeId = sortedChildren.joinToString(separator = "+") { it.scopeId },
sourceSetName = sortedChildren.joinToString(separator = "+") { it.sourceSetName }
)
}

val all: Set<DokkaSourceSetID> = setOf(merged, *children.toTypedArray())

operator fun contains(sourceSetId: DokkaSourceSetID): Boolean {
return sourceSetId in all
Expand Down
5 changes: 5 additions & 0 deletions core/src/main/kotlin/model/DisplaySourceSet.kt
Original file line number Diff line number Diff line change
Expand Up @@ -48,4 +48,9 @@ public fun Iterable<DokkaSourceSet>.toDisplaySourceSets(): Set<DisplaySourceSet>
map { it.toDisplaySourceSet() }.toSet()

@InternalDokkaApi
@Deprecated("Use computeSourceSetIds() and cache its results instead", replaceWith = ReplaceWith("computeSourceSetIds()"))
public val Iterable<DisplaySourceSet>.sourceSetIDs: List<DokkaSourceSetID> get() = this.flatMap { it.sourceSetIDs.all }

@InternalDokkaApi
public fun Iterable<DisplaySourceSet>.computeSourceSetIds(): Set<DokkaSourceSetID> =
fold(hashSetOf()) { acc, set -> acc.addAll(set.sourceSetIDs.all); acc }
10 changes: 4 additions & 6 deletions core/src/test/kotlin/model/DisplaySourceSetTest.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,7 @@ package model

import org.jetbrains.dokka.DokkaSourceSetID
import org.jetbrains.dokka.Platform
import org.jetbrains.dokka.model.CompositeSourceSetID
import org.jetbrains.dokka.model.DisplaySourceSet
import org.jetbrains.dokka.model.sourceSetIDs
import org.jetbrains.dokka.model.*
import kotlin.test.Test
import kotlin.test.assertFalse
import kotlin.test.assertTrue
Expand Down Expand Up @@ -44,17 +42,17 @@ class DisplaySourceSetTest {
)

assertFalse(
DokkaSourceSetID("m3", "s3") in listOf(contentSourceSet).sourceSetIDs,
DokkaSourceSetID("m3", "s3") in listOf(contentSourceSet).computeSourceSetIds(),
"Expected source set id not being contained in content source set"
)

assertTrue(
DokkaSourceSetID("m1", "s1") in listOf(contentSourceSet).sourceSetIDs,
DokkaSourceSetID("m1", "s1") in listOf(contentSourceSet).computeSourceSetIds(),
"Expected source set id being contained in content source set"
)

assertTrue(
DokkaSourceSetID("m1+m2", "s1+s2") in listOf(contentSourceSet).sourceSetIDs,
DokkaSourceSetID("m1+m2", "s1+s2") in listOf(contentSourceSet).computeSourceSetIds(),
"Expected merged source set being contained in content source set"
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,7 @@ import org.jetbrains.dokka.base.renderers.sourceSets
import org.jetbrains.dokka.base.resolvers.anchors.SymbolAnchorHint
import org.jetbrains.dokka.links.DRI
import org.jetbrains.dokka.links.PointingToDeclaration
import org.jetbrains.dokka.model.DisplaySourceSet
import org.jetbrains.dokka.model.sourceSetIDs
import org.jetbrains.dokka.model.toDisplaySourceSet
import org.jetbrains.dokka.model.withDescendants
import org.jetbrains.dokka.model.*
import org.jetbrains.dokka.pages.*
import org.jetbrains.dokka.plugability.DokkaContext
import java.util.*
Expand Down Expand Up @@ -91,12 +88,12 @@ open class DokkaLocationProvider(
val (dri, originalSourceSet) = driWithSourceSets
val allSourceSets: List<Set<DisplaySourceSet>> =
listOf(originalSourceSet) + originalSourceSet.let { oss ->
dokkaContext.configuration.sourceSets.filter { it.sourceSetID in oss.sourceSetIDs }
val ossIds = oss.computeSourceSetIds()
dokkaContext.configuration.sourceSets.filter { it.sourceSetID in ossIds }
.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)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,7 @@ import org.jetbrains.dokka.DokkaConfiguration.DokkaSourceSet
import org.jetbrains.dokka.base.DokkaBase
import org.jetbrains.dokka.base.translators.documentables.PageContentBuilder
import org.jetbrains.dokka.links.DRI
import org.jetbrains.dokka.model.Documentable
import org.jetbrains.dokka.model.DocumentableSource
import org.jetbrains.dokka.model.WithSources
import org.jetbrains.dokka.model.sourceSetIDs
import org.jetbrains.dokka.model.*
import org.jetbrains.dokka.pages.*
import org.jetbrains.dokka.plugability.DokkaContext
import org.jetbrains.dokka.plugability.plugin
Expand Down Expand Up @@ -87,9 +84,10 @@ class SourceLinksTransformer(val context: DokkaContext) : PageTransformer {
contentNode: ContentNode, sources: Map<DRI, List<Pair<DokkaSourceSet, String>>>
): ContentNode =
contentNode.signatureGroupOrNull()?.let { sg ->
val sgIds = sg.sourceSets.computeSourceSetIds()
sources[sg.dci.dri.singleOrNull()]?.let { sourceLinks ->
sourceLinks
.filter { it.first.sourceSetID in sg.sourceSets.sourceSetIDs }
.filter { it.first.sourceSetID in sgIds }
.takeIf { it.isNotEmpty() }
?.let { filteredSourcesLinks ->
sg.copy(children = sg.children + filteredSourcesLinks.map {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -206,7 +206,7 @@ open class JavadocPageCreator(context: DokkaContext) {
}

fun List<ContentNode>.nodeForJvm(jvm: DokkaSourceSet): ContentNode =
firstOrNull { jvm.sourceSetID in it.sourceSets.sourceSetIDs }
firstOrNull { jvm.sourceSetID in it.sourceSets.computeSourceSetIds() }
?: throw IllegalStateException("No source set found for ${jvm.sourceSetID} ")

private fun Documentable.brief(sourceSet: DokkaSourceSet? = highestJvmSourceSet): List<ContentNode> =
Expand Down

0 comments on commit c20a1f3

Please sign in to comment.