From c20a1f32fba7e3d4c37fd86fc5a26387f0fcec17 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Fri, 4 Aug 2023 19:13:26 +0200 Subject: [PATCH] Replace Iterable.sourceSetIDs with more straightforward Iterable.computeSourceSetIds() * Refactor all the usages, save some allocations * Start caching CompositeSourceSetID properties to avoid excessive allocations --- .../main/kotlin/model/CompositeSourceSetID.kt | 18 ++++++++---------- core/src/main/kotlin/model/DisplaySourceSet.kt | 5 +++++ .../test/kotlin/model/DisplaySourceSetTest.kt | 10 ++++------ .../resolvers/local/DokkaLocationProvider.kt | 9 +++------ .../sourcelinks/SourceLinksTransformer.kt | 8 +++----- .../dokka/javadoc/JavadocPageCreator.kt | 2 +- 6 files changed, 24 insertions(+), 28 deletions(-) diff --git a/core/src/main/kotlin/model/CompositeSourceSetID.kt b/core/src/main/kotlin/model/CompositeSourceSetID.kt index 3eaf64079da..f7e05ae9372 100644 --- a/core/src/main/kotlin/model/CompositeSourceSetID.kt +++ b/core/src/main/kotlin/model/CompositeSourceSetID.kt @@ -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 - 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 = setOf(merged, *children.toTypedArray()) operator fun contains(sourceSetId: DokkaSourceSetID): Boolean { return sourceSetId in all diff --git a/core/src/main/kotlin/model/DisplaySourceSet.kt b/core/src/main/kotlin/model/DisplaySourceSet.kt index 7b86575bff4..588e40dcf04 100644 --- a/core/src/main/kotlin/model/DisplaySourceSet.kt +++ b/core/src/main/kotlin/model/DisplaySourceSet.kt @@ -48,4 +48,9 @@ public fun Iterable.toDisplaySourceSets(): Set map { it.toDisplaySourceSet() }.toSet() @InternalDokkaApi +@Deprecated("Use computeSourceSetIds() and cache its results instead", replaceWith = ReplaceWith("computeSourceSetIds()")) public val Iterable.sourceSetIDs: List get() = this.flatMap { it.sourceSetIDs.all } + +@InternalDokkaApi +public fun Iterable.computeSourceSetIds(): Set = + fold(hashSetOf()) { acc, set -> acc.addAll(set.sourceSetIDs.all); acc } diff --git a/core/src/test/kotlin/model/DisplaySourceSetTest.kt b/core/src/test/kotlin/model/DisplaySourceSetTest.kt index adabdbdbdc5..04ad07d68cc 100644 --- a/core/src/test/kotlin/model/DisplaySourceSetTest.kt +++ b/core/src/test/kotlin/model/DisplaySourceSetTest.kt @@ -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 @@ -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" ) } diff --git a/plugins/base/src/main/kotlin/resolvers/local/DokkaLocationProvider.kt b/plugins/base/src/main/kotlin/resolvers/local/DokkaLocationProvider.kt index 4934e8f4870..1c7ffe144b6 100644 --- a/plugins/base/src/main/kotlin/resolvers/local/DokkaLocationProvider.kt +++ b/plugins/base/src/main/kotlin/resolvers/local/DokkaLocationProvider.kt @@ -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.* @@ -91,12 +88,12 @@ open class DokkaLocationProvider( val (dri, originalSourceSet) = driWithSourceSets val allSourceSets: List> = 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` but `setOf(someDisplaySourceSet) != someDisplaySourceSet` setOf(it) } } diff --git a/plugins/base/src/main/kotlin/transformers/pages/sourcelinks/SourceLinksTransformer.kt b/plugins/base/src/main/kotlin/transformers/pages/sourcelinks/SourceLinksTransformer.kt index f2c3d3f03a7..08439ff810e 100644 --- a/plugins/base/src/main/kotlin/transformers/pages/sourcelinks/SourceLinksTransformer.kt +++ b/plugins/base/src/main/kotlin/transformers/pages/sourcelinks/SourceLinksTransformer.kt @@ -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 @@ -87,9 +84,10 @@ class SourceLinksTransformer(val context: DokkaContext) : PageTransformer { contentNode: ContentNode, sources: Map>> ): 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 { diff --git a/plugins/javadoc/src/main/kotlin/org/jetbrains/dokka/javadoc/JavadocPageCreator.kt b/plugins/javadoc/src/main/kotlin/org/jetbrains/dokka/javadoc/JavadocPageCreator.kt index 616583c8088..f108b46a94d 100644 --- a/plugins/javadoc/src/main/kotlin/org/jetbrains/dokka/javadoc/JavadocPageCreator.kt +++ b/plugins/javadoc/src/main/kotlin/org/jetbrains/dokka/javadoc/JavadocPageCreator.kt @@ -206,7 +206,7 @@ open class JavadocPageCreator(context: DokkaContext) { } fun List.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 =