diff options
| author | Błażej Kardyś <bkardys@virtuslab.com> | 2020-05-05 17:45:12 +0200 |
|---|---|---|
| committer | Paweł Marks <Kordyjan@users.noreply.github.com> | 2020-05-14 13:30:33 +0200 |
| commit | 3f2a790190da4f40ea6d8a976aa1929b2a1b002b (patch) | |
| tree | 752ee84451954e9ea5e6d4133e18e41aaee2f7b1 /plugins/base/src/main | |
| parent | a440f0cb8756019131a2c15389e747aea3c585e7 (diff) | |
| download | dokka-3f2a790190da4f40ea6d8a976aa1929b2a1b002b.tar.gz dokka-3f2a790190da4f40ea6d8a976aa1929b2a1b002b.tar.bz2 dokka-3f2a790190da4f40ea6d8a976aa1929b2a1b002b.zip | |
Changing approach from platform-driven to source-set-driven
Diffstat (limited to 'plugins/base/src/main')
21 files changed, 528 insertions, 574 deletions
diff --git a/plugins/base/src/main/kotlin/DokkaBase.kt b/plugins/base/src/main/kotlin/DokkaBase.kt index 2da3fbd4..ab7d089d 100644 --- a/plugins/base/src/main/kotlin/DokkaBase.kt +++ b/plugins/base/src/main/kotlin/DokkaBase.kt @@ -54,15 +54,15 @@ class DokkaBase : DokkaPlugin() { } val preMergeDocumentableTransformer by extending(isFallback = true) { - CoreExtensions.preMergeDocumentableTransformer with DocumentableVisibilityFilter + CoreExtensions.preMergeDocumentableTransformer providing ::DocumentableVisibilityFilter } val actualTypealiasAdder by extending { - CoreExtensions.preMergeDocumentableTransformer with ActualTypealiasAdder() + CoreExtensions.preMergeDocumentableTransformer providing ::ActualTypealiasAdder } val modulesAndPackagesDocumentation by extending(isFallback = true) { - CoreExtensions.preMergeDocumentableTransformer with ModuleAndPackageDocumentationTransformer + CoreExtensions.preMergeDocumentableTransformer providing ::ModuleAndPackageDocumentationTransformer } val kotlinSignatureProvider by extending(isFallback = true) { diff --git a/plugins/base/src/main/kotlin/renderers/DefaultRenderer.kt b/plugins/base/src/main/kotlin/renderers/DefaultRenderer.kt index 925767ce..1340529c 100644 --- a/plugins/base/src/main/kotlin/renderers/DefaultRenderer.kt +++ b/plugins/base/src/main/kotlin/renderers/DefaultRenderer.kt @@ -3,6 +3,7 @@ package org.jetbrains.dokka.base.renderers import kotlinx.coroutines.* import org.jetbrains.dokka.base.DokkaBase import org.jetbrains.dokka.base.resolvers.local.LocationProvider +import org.jetbrains.dokka.model.SourceSetData import org.jetbrains.dokka.pages.* import org.jetbrains.dokka.plugability.DokkaContext import org.jetbrains.dokka.plugability.plugin @@ -26,7 +27,7 @@ abstract class DefaultRenderer<T>( abstract fun T.buildList( node: ContentList, pageContext: ContentPage, - platformRestriction: PlatformData? = null + platformRestriction: SourceSetData? = null ) abstract fun T.buildNewLine() @@ -34,7 +35,7 @@ abstract class DefaultRenderer<T>( abstract fun T.buildTable( node: ContentTable, pageContext: ContentPage, - platformRestriction: PlatformData? = null + platformRestriction: SourceSetData? = null ) abstract fun T.buildText(textNode: ContentText) @@ -49,7 +50,7 @@ abstract class DefaultRenderer<T>( open fun T.buildGroup( node: ContentGroup, pageContext: ContentPage, - platformRestriction: PlatformData? = null + platformRestriction: SourceSetData? = null ) = wrapGroup(node, pageContext) { node.children.forEach { it.build(this, pageContext, platformRestriction) } } @@ -59,7 +60,7 @@ abstract class DefaultRenderer<T>( open fun T.buildLinkText( nodes: List<ContentNode>, pageContext: ContentPage, - platformRestriction: PlatformData? = null + platformRestriction: SourceSetData? = null ) { nodes.forEach { it.build(this, pageContext, platformRestriction) } } @@ -71,7 +72,7 @@ abstract class DefaultRenderer<T>( open fun T.buildHeader( node: ContentHeader, pageContext: ContentPage, - platformRestriction: PlatformData? = null + platformRestriction: SourceSetData? = null ) { buildHeader(node.level) { node.children.forEach { it.build(this, pageContext, platformRestriction) } } } @@ -79,22 +80,22 @@ abstract class DefaultRenderer<T>( open fun ContentNode.build( builder: T, pageContext: ContentPage, - platformRestriction: PlatformData? = null + platformRestriction: SourceSetData? = null ) = builder.buildContentNode(this, pageContext, platformRestriction) open fun T.buildContentNode( node: ContentNode, pageContext: ContentPage, - platformRestriction: PlatformData? = null + platformRestriction: SourceSetData? = null ) { - if (platformRestriction == null || platformRestriction in node.platforms) { + if (platformRestriction == null || platformRestriction in node.sourceSets) { when (node) { is ContentText -> buildText(node) is ContentHeader -> buildHeader(node, pageContext, platformRestriction) is ContentCode -> buildCode(node.children, node.language, pageContext) is ContentDRILink -> - buildLink(locationProvider.resolve(node.address, node.platforms.toList(), pageContext)) { + buildLink(locationProvider.resolve(node.address, node.sourceSets.toList(), pageContext)) { buildLinkText(node.children, pageContext, platformRestriction) } is ContentResolvedLink -> buildLink(node.address) { @@ -154,4 +155,4 @@ abstract class DefaultRenderer<T>( } } -fun ContentPage.platforms() = this.content.platforms.toList()
\ No newline at end of file +fun ContentPage.platforms() = this.content.sourceSets.toList()
\ No newline at end of file diff --git a/plugins/base/src/main/kotlin/renderers/html/HtmlRenderer.kt b/plugins/base/src/main/kotlin/renderers/html/HtmlRenderer.kt index c061cabf..caabcda7 100644 --- a/plugins/base/src/main/kotlin/renderers/html/HtmlRenderer.kt +++ b/plugins/base/src/main/kotlin/renderers/html/HtmlRenderer.kt @@ -7,6 +7,7 @@ import org.jetbrains.dokka.base.DokkaBase import org.jetbrains.dokka.base.renderers.DefaultRenderer import org.jetbrains.dokka.links.DRI import org.jetbrains.dokka.model.DFunction +import org.jetbrains.dokka.model.SourceSetData import org.jetbrains.dokka.pages.* import org.jetbrains.dokka.plugability.DokkaContext import org.jetbrains.dokka.plugability.plugin @@ -42,10 +43,10 @@ open class HtmlRenderer( override fun FlowContent.buildPlatformDependent(content: PlatformHintedContent, pageContext: ContentPage) { div("platform-hinted") { attributes["data-platform-hinted"] = "data-platform-hinted" - val contents = content.platforms.mapIndexed { index, platform -> + val contents = content.sourceSets.mapIndexed { index, platform -> platform to createHTML(prettyPrint = false).div(classes = "content") { if (index == 0) attributes["data-active"] = "" - attributes["data-togglable"] = platform.targets.joinToString("-") + attributes["data-togglable"] = platform.sourceSetName buildContentNode(content.inner, pageContext, platform) } } @@ -56,8 +57,8 @@ open class HtmlRenderer( contents.forEachIndexed { index, pair -> button(classes = "platform-bookmark") { if (index == 0) attributes["data-active"] = "" - attributes["data-toggle"] = pair.first.targets.joinToString("-") - text(pair.first.targets.joinToString(", ")); + attributes["data-toggle"] = pair.first.sourceSetName + text(pair.first.sourceSetName) } } } @@ -71,27 +72,27 @@ open class HtmlRenderer( override fun FlowContent.buildList( node: ContentList, pageContext: ContentPage, - platformRestriction: PlatformData? - ) = if (node.ordered) ol { buildListItems(node.children, pageContext, platformRestriction) } - else ul { buildListItems(node.children, pageContext, platformRestriction) } + sourceSetRestriction: SourceSetData? + ) = if (node.ordered) ol { buildListItems(node.children, pageContext, sourceSetRestriction) } + else ul { buildListItems(node.children, pageContext, sourceSetRestriction) } open fun OL.buildListItems( items: List<ContentNode>, pageContext: ContentPage, - platformRestriction: PlatformData? = null + sourceSetRestriction: SourceSetData? = null ) { items.forEach { if (it is ContentList) buildList(it, pageContext) else - li { it.build(this, pageContext, platformRestriction) } + li { it.build(this, pageContext, sourceSetRestriction) } } } open fun UL.buildListItems( items: List<ContentNode>, pageContext: ContentPage, - platformRestriction: PlatformData? = null + sourceSetRestriction: SourceSetData? = null ) { items.forEach { if (it is ContentList) @@ -118,64 +119,63 @@ open class HtmlRenderer( private fun FlowContent.buildRow( node: ContentGroup, pageContext: ContentPage, - platformRestriction: PlatformData? + sourceSetRestriction: SourceSetData? ) { node.children .filter { - platformRestriction == null || platformRestriction in it.platforms + sourceSetRestriction == null || sourceSetRestriction in it.sourceSets } .takeIf { it.isNotEmpty() } ?.let { div(classes = "table-row") { it.filter { it.dci.kind != ContentKind.Symbol }.takeIf { it.isNotEmpty() }?.let { div("main-subrow ${node.style.joinToString { it.toString().decapitalize() }}") { - it.filter { platformRestriction == null || platformRestriction in it.platforms } + it.filter { sourceSetRestriction == null || sourceSetRestriction in it.sourceSets } .forEach { when(it.dci.kind){ - ContentKind.PlatformDependantHint -> { + ContentKind.SourceSetDependantHint -> { div("platform-dependant-row keyValue"){ div() div("title"){ - it.build(this, pageContext, platformRestriction) + it.build(this, pageContext, sourceSetRestriction) } } } ContentKind.Main -> { div("title-row"){ - it.build(this, pageContext, platformRestriction) + it.build(this, pageContext, sourceSetRestriction) div() - if (ContentKind.shouldBePlatformTagged(node.dci.kind) && node.platforms.size == 1) { + if (ContentKind.shouldBePlatformTagged(node.dci.kind) && node.sourceSets.size == 1) { createPlatformTags(node) } else { div() } } } - else -> div { it.build(this, pageContext, platformRestriction) } + else -> div { it.build(this, pageContext, sourceSetRestriction) } } } } } it.filter { it.dci.kind == ContentKind.Symbol }.takeIf { it.isNotEmpty() }?.let { div("signature-subrow") { - div("signatures"){ + div("signatures") { it.forEach { - it.build(this, pageContext, platformRestriction) + it.build(this, pageContext, sourceSetRestriction) } } } } } - } + } } - private fun FlowContent.createPlatformTags( node: ContentNode ) { + private fun FlowContent.createPlatformTags(node: ContentNode) { div("platform-tags") { - node.platforms.forEach { + node.sourceSets.forEach { div("platform-tag") { - val targets = it.targets.joinToString(", ") - if( targets.equals("common", ignoreCase = true) ) classes = classes + "common" - text(it.targets.joinToString(", ")) + if (it.sourceSetName.equals("common", ignoreCase = true)) classes = classes + "common" + text(it.sourceSetName) } } } @@ -184,11 +184,11 @@ open class HtmlRenderer( override fun FlowContent.buildTable( node: ContentTable, pageContext: ContentPage, - platformRestriction: PlatformData? + sourceSetRestriction: SourceSetData? ) { div(classes = "table") { node.children.forEach { - buildRow(it, pageContext, platformRestriction) + buildRow(it, pageContext, sourceSetRestriction) } } } @@ -221,7 +221,7 @@ open class HtmlRenderer( fun FlowContent.buildLink( to: DRI, - platforms: List<PlatformData>, + platforms: List<SourceSetData>, from: PageNode? = null, block: FlowContent.() -> Unit ) = buildLink(locationProvider.resolve(to, platforms, from), block) diff --git a/plugins/base/src/main/kotlin/renderers/html/NavigationPage.kt b/plugins/base/src/main/kotlin/renderers/html/NavigationPage.kt index 4b90cc8a..4048c11e 100644 --- a/plugins/base/src/main/kotlin/renderers/html/NavigationPage.kt +++ b/plugins/base/src/main/kotlin/renderers/html/NavigationPage.kt @@ -3,8 +3,8 @@ package org.jetbrains.dokka.base.renderers.html import kotlinx.html.* import kotlinx.html.stream.createHTML import org.jetbrains.dokka.links.DRI +import org.jetbrains.dokka.model.SourceSetData import org.jetbrains.dokka.pages.PageNode -import org.jetbrains.dokka.pages.PlatformData import org.jetbrains.dokka.pages.RendererSpecificPage import org.jetbrains.dokka.pages.RenderingStrategy @@ -41,7 +41,7 @@ class NavigationPage(val root: NavigationNode) : RendererSpecificPage { class NavigationNode( val name: String, val dri: DRI, - val platforms: List<PlatformData>, + val platforms: List<SourceSetData>, val children: List<NavigationNode> ) diff --git a/plugins/base/src/main/kotlin/resolvers/local/DefaultLocationProvider.kt b/plugins/base/src/main/kotlin/resolvers/local/DefaultLocationProvider.kt index 29c4a425..322f4927 100644 --- a/plugins/base/src/main/kotlin/resolvers/local/DefaultLocationProvider.kt +++ b/plugins/base/src/main/kotlin/resolvers/local/DefaultLocationProvider.kt @@ -4,6 +4,8 @@ import org.jetbrains.dokka.DokkaConfiguration import org.jetbrains.dokka.base.DokkaBase import org.jetbrains.dokka.base.resolvers.external.ExternalLocationProvider import org.jetbrains.dokka.links.DRI +import org.jetbrains.dokka.model.SourceSetData +import org.jetbrains.dokka.model.sourceSet import org.jetbrains.dokka.pages.* import org.jetbrains.dokka.plugability.DokkaContext import org.jetbrains.dokka.plugability.plugin @@ -46,15 +48,14 @@ open class DefaultLocationProvider( override fun resolve(node: PageNode, context: PageNode?, skipExtension: Boolean): String = pathTo(node, context) + if (!skipExtension) extension else "" - override fun resolve(dri: DRI, platforms: List<PlatformData>, context: PageNode?): String = + override fun resolve(dri: DRI, sourceSets: List<SourceSetData>, context: PageNode?): String = pagesIndex[dri]?.let { resolve(it, context) } ?: // Not found in PageGraph, that means it's an external link getLocation(dri, this.dokkaContext.configuration.passesConfigurations .filter { passConfig -> - platforms.toSet() - .contains(PlatformData(passConfig.moduleName, passConfig.analysisPlatform, passConfig.targets)) - } // TODO: change targets to something better? + sourceSets.toSet().contains(dokkaContext.sourceSet(passConfig)) + } .groupBy({ it.jdkVersion }, { it.externalDocumentationLinks }) .map { it.key to it.value.flatten().distinct() }.toMap() ) diff --git a/plugins/base/src/main/kotlin/resolvers/local/LocationProvider.kt b/plugins/base/src/main/kotlin/resolvers/local/LocationProvider.kt index 0814cb3e..c6c48d63 100644 --- a/plugins/base/src/main/kotlin/resolvers/local/LocationProvider.kt +++ b/plugins/base/src/main/kotlin/resolvers/local/LocationProvider.kt @@ -1,12 +1,12 @@ package org.jetbrains.dokka.base.resolvers.local import org.jetbrains.dokka.links.DRI +import org.jetbrains.dokka.model.SourceSetData import org.jetbrains.dokka.pages.PageNode -import org.jetbrains.dokka.pages.PlatformData import org.jetbrains.dokka.pages.RootPageNode interface LocationProvider { - fun resolve(dri: DRI, platforms: List<PlatformData>, context: PageNode? = null): String + fun resolve(dri: DRI, sourceSets: List<SourceSetData>, context: PageNode? = null): String fun resolve(node: PageNode, context: PageNode? = null, skipExtension: Boolean = false): String fun resolveRoot(node: PageNode): String fun ancestors(node: PageNode): List<PageNode> diff --git a/plugins/base/src/main/kotlin/signatures/KotlinSignatureProvider.kt b/plugins/base/src/main/kotlin/signatures/KotlinSignatureProvider.kt index 313973bf..241103bf 100644 --- a/plugins/base/src/main/kotlin/signatures/KotlinSignatureProvider.kt +++ b/plugins/base/src/main/kotlin/signatures/KotlinSignatureProvider.kt @@ -10,7 +10,6 @@ import org.jetbrains.dokka.model.* import org.jetbrains.dokka.model.properties.WithExtraProperties import org.jetbrains.dokka.pages.ContentKind import org.jetbrains.dokka.pages.ContentNode -import org.jetbrains.dokka.pages.PlatformData import org.jetbrains.dokka.pages.TextStyle import org.jetbrains.dokka.utilities.DokkaLogger @@ -35,7 +34,7 @@ class KotlinSignatureProvider(ctcc: CommentsToContentConverter, logger: DokkaLog link(e.name, e.dri) } - private fun actualTypealiasedSignature(dri: DRI, name: String, aliasedTypes: PlatformDependent<Bound>) = + private fun actualTypealiasedSignature(dri: DRI, name: String, aliasedTypes: SourceSetDependent<Bound>) = aliasedTypes.entries.groupBy({ it.value }, { it.key }).map { (bound, platforms) -> contentBuilder.contentFor(dri, platforms.toSet(), ContentKind.Symbol, setOf(TextStyle.Monospace)) { text("actual typealias ") @@ -49,17 +48,17 @@ class KotlinSignatureProvider(ctcc: CommentsToContentConverter, logger: DokkaLog (c as? WithExtraProperties<out DClasslike>)?.let { c.extra[ActualTypealias]?.let { contentBuilder.contentFor(c) { - +regularSignature(c, platformData = c.platformData.toSet() - it.underlyingType.keys) + +regularSignature(c, sourceSets = c.sourceSets.toSet() - it.underlyingType.keys) +actualTypealiasedSignature(c.dri, c.name.orEmpty(), it.underlyingType) } } ?: regularSignature(c) } ?: regularSignature(c) - private fun regularSignature(c: DClasslike, platformData: Set<PlatformData> = c.platformData.toSet()) = - contentBuilder.contentFor(c, ContentKind.Symbol, setOf(TextStyle.Monospace), platformData = platformData) { - platformText(c.visibility, platformData) { (it.takeIf { it !in ignoredVisibilities }?.name ?: "") + " " } + private fun regularSignature(c: DClasslike, sourceSets: Set<SourceSetData> = c.sourceSets.toSet()) = + contentBuilder.contentFor(c, ContentKind.Symbol, setOf(TextStyle.Monospace), sourceSets = sourceSets) { + platformText(c.visibility, sourceSets) { (it.takeIf { it !in ignoredVisibilities }?.name ?: "") + " " } if (c is DClass) { - platformText(c.modifier, platformData) { + platformText(c.modifier, sourceSets) { if (c.extra[AdditionalModifiers]?.content?.contains(ExtraModifiers.DATA) == true && it.name == "final") "data " else it.name + " " } @@ -74,23 +73,23 @@ class KotlinSignatureProvider(ctcc: CommentsToContentConverter, logger: DokkaLog link(c.name!!, c.dri) if (c is DClass) { val pConstructor = c.constructors.singleOrNull { it.extra[PrimaryConstructorExtra] != null } - list(pConstructor?.parameters.orEmpty(), "(", ")", ",", pConstructor?.platformData.orEmpty().toSet()) { + list(pConstructor?.parameters.orEmpty(), "(", ")", ",", pConstructor?.sourceSets.orEmpty().toSet()) { text(it.name ?: "", styles = mainStyles.plus(TextStyle.Bold).plus(TextStyle.Indented)) text(": ") signatureForProjection(it.type) } } if (c is WithSupertypes) { - c.supertypes.filter { it.key in platformData }.map { (p, dris) -> - list(dris, prefix = " : ", platformData = setOf(p)) { - link(it.sureClassNames, it, platformData = setOf(p)) + c.supertypes.filter { it.key in sourceSets }.map { (p, dris) -> + list(dris, prefix = " : ", sourceSets = setOf(p)) { + link(it.sureClassNames, it, sourceSets = setOf(p)) } } } } - private fun propertySignature(p: DProperty, platformData: Set<PlatformData> = p.platformData.toSet()) = - contentBuilder.contentFor(p, ContentKind.Symbol, setOf(TextStyle.Monospace), platformData = platformData) { + private fun propertySignature(p: DProperty, sourceSets: Set<SourceSetData> = p.sourceSets.toSet()) = + contentBuilder.contentFor(p, ContentKind.Symbol, setOf(TextStyle.Monospace), sourceSets = sourceSets) { platformText(p.visibility) { (it.takeIf { it !in ignoredVisibilities }?.name ?: "") + " " } platformText(p.modifier){ it.name + " "} p.setter?.let { text("var ") } ?: text("val ") @@ -106,8 +105,8 @@ class KotlinSignatureProvider(ctcc: CommentsToContentConverter, logger: DokkaLog signatureForProjection(p.type) } - private fun functionSignature(f: DFunction, platformData: Set<PlatformData> = f.platformData.toSet()) = - contentBuilder.contentFor(f, ContentKind.Symbol, setOf(TextStyle.Monospace), platformData = platformData) { + private fun functionSignature(f: DFunction, sourceSets: Set<SourceSetData> = f.sourceSets.toSet()) = + contentBuilder.contentFor(f, ContentKind.Symbol, setOf(TextStyle.Monospace), sourceSets = sourceSets) { platformText(f.visibility) { (it.takeIf { it !in ignoredVisibilities }?.name ?: "") + " " } platformText(f.modifier) { it.name + " " } text("fun ") @@ -147,7 +146,7 @@ class KotlinSignatureProvider(ctcc: CommentsToContentConverter, logger: DokkaLog t, ContentKind.Symbol, setOf(TextStyle.Monospace), - platformData = platforms.toSet() + sourceSets = platforms.toSet() ) { platformText(t.visibility) { (it.takeIf { it !in ignoredVisibilities }?.name ?: "") + " " } text("typealias ") @@ -196,8 +195,8 @@ class KotlinSignatureProvider(ctcc: CommentsToContentConverter, logger: DokkaLog is PrimitiveJavaType -> signatureForProjection(p.translateToKotlin()) } - private fun funType(dri: DRI, platformData: Set<PlatformData>, type: TypeConstructor) = - contentBuilder.contentFor(dri, platformData, ContentKind.Symbol, setOf(TextStyle.Monospace)) { + private fun funType(dri: DRI, sourceSets: Set<SourceSetData>, type: TypeConstructor) = + contentBuilder.contentFor(dri, sourceSets, ContentKind.Symbol, setOf(TextStyle.Monospace)) { if (type.extension) { signatureForProjection(type.projections.first()) text(".") diff --git a/plugins/base/src/main/kotlin/transformers/documentables/ActualTypealiasAdder.kt b/plugins/base/src/main/kotlin/transformers/documentables/ActualTypealiasAdder.kt index 35f27a94..cab4a9d2 100644 --- a/plugins/base/src/main/kotlin/transformers/documentables/ActualTypealiasAdder.kt +++ b/plugins/base/src/main/kotlin/transformers/documentables/ActualTypealiasAdder.kt @@ -6,8 +6,8 @@ import org.jetbrains.dokka.model.properties.WithExtraProperties import org.jetbrains.dokka.plugability.DokkaContext import org.jetbrains.dokka.transformers.documentation.PreMergeDocumentableTransformer -class ActualTypealiasAdder : PreMergeDocumentableTransformer { - override fun invoke(modules: List<DModule>, context: DokkaContext) = modules.map { it.mergeTypealiases() } +class ActualTypealiasAdder(val context: DokkaContext) : PreMergeDocumentableTransformer { + override fun invoke(modules: List<DModule>) = modules.map { it.mergeTypealiases() } private fun DModule.mergeTypealiases(): DModule = copy(packages = packages.map { pkg -> if (pkg.typealiases.isEmpty()) { @@ -64,11 +64,11 @@ class ActualTypealiasAdder : PreMergeDocumentableTransformer { typealiases: Map<DRI, DTypeAlias> ): List<T> where T : DClasslike, T : WithExtraProperties<T>, T : WithExpectActual = elements.map { element -> - if (element.sources.expect != null) { + if (element.expectPresentInSet != null) { typealiases[element.dri]?.let { ta -> element.withNewExtras( element.extra + ActualTypealias( - PlatformDependent.from(ta.platformData.single(), ta.underlyingType.values.single()) + mapOf(ta.sourceSets.single() to ta.underlyingType.values.single()) ) ) } ?: element diff --git a/plugins/base/src/main/kotlin/transformers/documentables/DefaultDocumentableMerger.kt b/plugins/base/src/main/kotlin/transformers/documentables/DefaultDocumentableMerger.kt index f871cdec..862f9240 100644 --- a/plugins/base/src/main/kotlin/transformers/documentables/DefaultDocumentableMerger.kt +++ b/plugins/base/src/main/kotlin/transformers/documentables/DefaultDocumentableMerger.kt @@ -2,7 +2,6 @@ package org.jetbrains.dokka.base.transformers.documentables import org.jetbrains.dokka.model.* import org.jetbrains.dokka.model.properties.mergeExtras -import org.jetbrains.dokka.pages.PlatformData import org.jetbrains.dokka.plugability.DokkaContext import org.jetbrains.dokka.transformers.documentation.DocumentableMerger import org.jetbrains.kotlin.utils.addToStdlib.firstNotNullResult @@ -24,8 +23,9 @@ internal object DefaultDocumentableMerger : DocumentableMerger { list.flatMap { it.packages }, DPackage::mergeWith ), - documentation = list.platformDependentFor { documentation }, - platformData = list.flatMap { it.platformData }.distinct() + documentation = list.map { it.documentation }.flatMap { it.entries }.associate { (k,v) -> k to v }, + expectPresentInSet = list.firstNotNullResult { it.expectPresentInSet }, + sourceSets = list.flatMap { it.sourceSets } ).mergeExtras(left, right) } } @@ -36,115 +36,51 @@ private fun <T : Documentable> merge(elements: List<T>, reducer: (T, T) -> T): L .reduce { _, left, right -> reducer(left, right) } .values.toList() -private fun <T : Any, D : Documentable> Iterable<D>.platformDependentFor( - selector: D.() -> PlatformDependent<T> -): PlatformDependent<T> { - val actuals = map { it.selector().map } - .flatMap { it.entries } - .associate { (k, v) -> k to v } - - val expected = firstNotNullResult { it.selector().expect } - - return PlatformDependent(actuals, expected) -} - -private fun <T : Any> PlatformDependent<T>.mergeWith(other: PlatformDependent<T>) = PlatformDependent( - map = this + other, - expect = expect ?: other.expect -) - private fun <T> mergeExpectActual( elements: List<T>, - reducer: (T, T) -> T, - platformSetter: T.(List<PlatformData>) -> T + reducer: (T, T) -> T ): List<T> where T : Documentable, T : WithExpectActual { - fun findExpect(actual: T, expects: List<T>): Expect<T> = - expects.find { it.platformData.flatMap { it.targets }.containsAll(actual.platformData.flatMap { it.targets }) } - .let { Expect.from(it) } - - fun reduceExpectActual(entry: Map.Entry<Expect<T>, List<T>>): List<T> = when (val expect = entry.key) { - Expect.NotFound -> entry.value - is Expect.Found -> entry.value.plus(expect.expect).reduce(reducer).let(::listOf) - } - - fun analyzeExpectActual(sameDriElements: List<T>): List<T> { - val pathGrouped: Collection<T> = mutableMapOf<Set<String>, T>().apply { - sameDriElements.forEach { documentable -> - val paths = documentable.sources.allValues.map { it.path }.toSet() - val key = keys.find { it.containsAll(paths) } - if (key == null) { - put(paths, documentable) - } else { - computeIfPresent(key) { _, old -> reducer(old, documentable) } - } - } - }.values - val (expect, actual) = pathGrouped.partition { it.sources.expect != null } - val mergedExpect = expect.groupBy { it.sources.expect?.path }.values.map { e -> - e.first().platformSetter(e.flatMap { it.platformData }.distinct()) - } - val groupExpectActual = actual.groupBy { findExpect(it, mergedExpect) } - val pathsToExpects: Set<String> = - groupExpectActual.keys.filterIsInstance<Expect.Found<T>>() - .mapNotNull { it.expect.sources.expect?.path }.toSet() + fun analyzeExpectActual(sameDriElements: List<T>) = sameDriElements.reduce(reducer) - return groupExpectActual.flatMap { reduceExpectActual(it) } + expect.filterNot { it.sources.expect?.path in pathsToExpects } - } - - return elements.groupBy { it.dri }.values.flatMap(::analyzeExpectActual) -} - -private sealed class Expect<out T : Any> { - object NotFound : Expect<Nothing>() - data class Found<T : Any>(val expect: T) : Expect<T>() - - companion object { - fun <T : Any> from(t: T?) = t?.let(::Found) ?: NotFound - } + return elements.groupBy { it.dri }.values.map(::analyzeExpectActual) } fun DPackage.mergeWith(other: DPackage): DPackage = copy( - functions = mergeExpectActual(functions + other.functions, DFunction::mergeWith) { copy(platformData = it) }, - properties = mergeExpectActual(properties + other.properties, DProperty::mergeWith) { copy(platformData = it) }, - classlikes = mergeExpectActual(classlikes |
