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/kotlin | |
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/kotlin')
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 + other.classlikes, DClasslike::mergeWith, DClasslike::setPlatformData), - documentation = documentation.mergeWith(other.documentation), + functions = mergeExpectActual(functions + other.functions, DFunction::mergeWith), + properties = mergeExpectActual(properties + other.properties, DProperty::mergeWith), + classlikes = mergeExpectActual(classlikes + other.classlikes, DClasslike::mergeWith), + documentation = documentation + other.documentation, + expectPresentInSet = expectPresentInSet ?: other.expectPresentInSet, typealiases = merge(typealiases + other.typealiases, DTypeAlias::mergeWith), - platformData = (platformData + other.platformData).distinct() + sourceSets = sourceSets + other.sourceSets ).mergeExtras(this, other) fun DFunction.mergeWith(other: DFunction): DFunction = copy( parameters = merge(this.parameters + other.parameters, DParameter::mergeWith), receiver = receiver?.let { r -> other.receiver?.let { r.mergeWith(it) } ?: r } ?: other.receiver, - documentation = documentation.mergeWith(other.documentation), - sources = sources.mergeWith(other.sources), - visibility = visibility.mergeWith(other.visibility), - modifier = modifier.mergeWith(other.modifier), - platformData = (platformData + other.platformData).distinct(), + documentation = documentation + other.documentation, + expectPresentInSet = expectPresentInSet ?: other.expectPresentInSet, + sources = sources+ other.sources, + visibility = visibility + other.visibility, + modifier = modifier + other.modifier, + sourceSets = sourceSets + other.sourceSets, generics = merge(generics + other.generics, DTypeParameter::mergeWith) ).mergeExtras(this, other) fun DProperty.mergeWith(other: DProperty): DProperty = copy( receiver = receiver?.let { r -> other.receiver?.let { r.mergeWith(it) } ?: r } ?: other.receiver, - documentation = documentation.mergeWith(other.documentation), - sources = sources.mergeWith(other.sources), - visibility = visibility.mergeWith(other.visibility), - modifier = modifier.mergeWith(other.modifier), - platformData = (platformData + other.platformData).distinct(), + documentation = documentation + other.documentation, + expectPresentInSet = expectPresentInSet ?: other.expectPresentInSet, + sources = sources+ other.sources, + visibility = visibility + other.visibility, + modifier = modifier + other.modifier, + sourceSets = sourceSets + other.sourceSets, getter = getter?.let { g -> other.getter?.let { g.mergeWith(it) } ?: g } ?: other.getter, setter = setter?.let { s -> other.setter?.let { s.mergeWith(it) } ?: s } ?: other.setter, generics = merge(generics + other.generics, DTypeParameter::mergeWith) ).mergeExtras(this, other) -fun DClasslike.setPlatformData(platformData: List<PlatformData>): DClasslike = when (this) { - is DClass -> copy(platformData = platformData) - is DEnum -> copy(platformData = platformData) - is DInterface -> copy(platformData = platformData) - is DObject -> copy(platformData = platformData) - is DAnnotation -> copy(platformData = platformData) - else -> throw IllegalStateException("${this::class.qualifiedName} ${this.name} cannot have platform set") -} - fun DClasslike.mergeWith(other: DClasslike): DClasslike = when { this is DClass && other is DClass -> mergeWith(other) this is DEnum && other is DEnum -> mergeWith(other) @@ -158,18 +94,19 @@ fun DClass.mergeWith(other: DClass): DClass = copy( constructors = mergeExpectActual( constructors + other.constructors, DFunction::mergeWith - ) { copy(platformData = it) }, - functions = mergeExpectActual(functions + other.functions, DFunction::mergeWith) { copy(platformData = it) }, - properties = mergeExpectActual(properties + other.properties, DProperty::mergeWith) { copy(platformData = it) }, - classlikes = mergeExpectActual(classlikes + other.classlikes, DClasslike::mergeWith, DClasslike::setPlatformData), + ), + functions = mergeExpectActual(functions + other.functions, DFunction::mergeWith), + properties = mergeExpectActual(properties + other.properties, DProperty::mergeWith), + classlikes = mergeExpectActual(classlikes + other.classlikes, DClasslike::mergeWith), companion = companion?.let { c -> other.companion?.let { c.mergeWith(it) } ?: c } ?: other.companion, generics = merge(generics + other.generics, DTypeParameter::mergeWith), - modifier = modifier.mergeWith(other.modifier), - supertypes = supertypes.mergeWith(other.supertypes), - documentation = documentation.mergeWith(other.documentation), - sources = sources.mergeWith(other.sources), - visibility = visibility.mergeWith(other.visibility), - platformData = (platformData + other.platformData).distinct() + modifier = modifier + other.modifier, + supertypes = supertypes + other.supertypes, + documentation = documentation + other.documentation, + expectPresentInSet = expectPresentInSet ?: other.expectPresentInSet, + sources = sources+ other.sources, + visibility = visibility + other.visibility, + sourceSets = sourceSets + other.sourceSets ).mergeExtras(this, other) fun DEnum.mergeWith(other: DEnum): DEnum = copy( @@ -177,78 +114,86 @@ fun DEnum.mergeWith(other: DEnum): DEnum = copy( constructors = mergeExpectActual( constructors + other.constructors, DFunction::mergeWith - ) { copy(platformData = it) }, - functions = mergeExpectActual(functions + other.functions, DFunction::mergeWith) { copy(platformData = it) }, - properties = mergeExpectActual(properties + other.properties, DProperty::mergeWith) { copy(platformData = it) }, - classlikes = mergeExpectActual(classlikes + other.classlikes, DClasslike::mergeWith, DClasslike::setPlatformData), + ), + functions = mergeExpectActual(functions + other.functions, DFunction::mergeWith), + properties = mergeExpectActual(properties + other.properties, DProperty::mergeWith), + classlikes = mergeExpectActual(classlikes + other.classlikes, DClasslike::mergeWith), companion = companion?.let { c -> other.companion?.let { c.mergeWith(it) } ?: c } ?: other.companion, - supertypes = supertypes.mergeWith(other.supertypes), - documentation = documentation.mergeWith(other.documentation), - sources = sources.mergeWith(other.sources), - visibility = visibility.mergeWith(other.visibility), - platformData = (platformData + other.platformData).distinct() + supertypes = supertypes + other.supertypes, + documentation = documentation + other.documentation, + expectPresentInSet = expectPresentInSet ?: other.expectPresentInSet, + sources = sources+ other.sources, + visibility = visibility + other.visibility, + sourceSets = sourceSets + other.sourceSets ).mergeExtras(this, other) fun DEnumEntry.mergeWith(other: DEnumEntry): DEnumEntry = copy( - functions = mergeExpectActual(functions + other.functions, DFunction::mergeWith) { copy(platformData = it) }, - properties = mergeExpectActual(properties + other.properties, DProperty::mergeWith) { copy(platformData = it) }, - classlikes = mergeExpectActual(classlikes + other.classlikes, DClasslike::mergeWith, DClasslike::setPlatformData), - documentation = documentation.mergeWith(other.documentation), - platformData = (platformData + other.platformData).distinct() + functions = mergeExpectActual(functions + other.functions, DFunction::mergeWith), + properties = mergeExpectActual(properties + other.properties, DProperty::mergeWith), + classlikes = mergeExpectActual(classlikes + other.classlikes, DClasslike::mergeWith), + documentation = documentation + other.documentation, + expectPresentInSet = expectPresentInSet ?: other.expectPresentInSet, + sourceSets = sourceSets + other.sourceSets ).mergeExtras(this, other) fun DObject.mergeWith(other: DObject): DObject = copy( - functions = mergeExpectActual(functions + other.functions, DFunction::mergeWith) { copy(platformData = it) }, - properties = mergeExpectActual(properties + other.properties, DProperty::mergeWith) { copy(platformData = it) }, - classlikes = mergeExpectActual(classlikes + other.classlikes, DClasslike::mergeWith, DClasslike::setPlatformData), - supertypes = supertypes.mergeWith(other.supertypes), - documentation = documentation.mergeWith(other.documentation), - sources = sources.mergeWith(other.sources), - visibility = visibility.mergeWith(other.visibility), - platformData = (platformData + other.platformData).distinct() + functions = mergeExpectActual(functions + other.functions, DFunction::mergeWith), + properties = mergeExpectActual(properties + other.properties, DProperty::mergeWith), + classlikes = mergeExpectActual(classlikes + other.classlikes, DClasslike::mergeWith), + supertypes = supertypes + other.supertypes, + documentation = documentation + other.documentation, + expectPresentInSet = expectPresentInSet ?: other.expectPresentInSet, + sources = sources+ other.sources, + visibility = visibility + other.visibility, + sourceSets = sourceSets + other.sourceSets ).mergeExtras(this, other) fun DInterface.mergeWith(other: DInterface): DInterface = copy( - functions = mergeExpectActual(functions + other.functions, DFunction::mergeWith) { copy(platformData = it) }, - properties = mergeExpectActual(properties + other.properties, DProperty::mergeWith) { copy(platformData = it) }, - classlikes = mergeExpectActual(classlikes + other.classlikes, DClasslike::mergeWith, DClasslike::setPlatformData), + functions = mergeExpectActual(functions + other.functions, DFunction::mergeWith), + properties = mergeExpectActual(properties + other.properties, DProperty::mergeWith), + classlikes = mergeExpectActual(classlikes + other.classlikes, DClasslike::mergeWith), companion = companion?.let { c -> other.companion?.let { c.mergeWith(it) } ?: c } ?: other.companion, generics = merge(generics + other.generics, DTypeParameter::mergeWith), - supertypes = supertypes.mergeWith(other.supertypes), - documentation = documentation.mergeWith(other.documentation), - sources = sources.mergeWith(other.sources), - visibility = visibility.mergeWith(other.visibility), - platformData = (platformData + other.platformData).distinct() + supertypes = supertypes + other.supertypes, + documentation = documentation + other.documentation, + expectPresentInSet = expectPresentInSet ?: other.expectPresentInSet, + sources = sources+ other.sources, + visibility = visibility + other.visibility, + sourceSets = sourceSets + other.sourceSets ).mergeExtras(this, other) fun DAnnotation.mergeWith(other: DAnnotation): DAnnotation = copy( constructors = mergeExpectActual( constructors + other.constructors, DFunction::mergeWith - ) { copy(platformData = it) }, - functions = mergeExpectActual(functions + other.functions, DFunction::mergeWith) { copy(platformData = it) }, - properties = mergeExpectActual(properties + other.properties, DProperty::mergeWith) { copy(platformData = it) }, - classlikes = mergeExpectActual(classlikes + other.classlikes, DClasslike::mergeWith, DClasslike::setPlatformData), + ), + functions = mergeExpectActual(functions + other.functions, DFunction::mergeWith), + properties = mergeExpectActual(properties + other.properties, DProperty::mergeWith), + classlikes = mergeExpectActual(classlikes + other.classlikes, DClasslike::mergeWith), companion = companion?.let { c -> other.companion?.let { c.mergeWith(it) } ?: c } ?: other.companion, - documentation = documentation.mergeWith(other.documentation), - sources = sources.mergeWith(other.sources), - visibility = visibility.mergeWith(other.visibility), - platformData = (platformData + other.platformData).distinct() + documentation = documentation + other.documentation, + expectPresentInSet = expectPresentInSet ?: other.expectPresentInSet, + sources = sources+ other.sources, + visibility = visibility + other.visibility, + sourceSets = sourceSets + other.sourceSets ).mergeExtras(this, other) fun DParameter.mergeWith(other: DParameter): DParameter = copy( - documentation = documentation.mergeWith(other.documentation), - platformData = (platformData + other.platformData).distinct() + documentation = documentation + other.documentation, + expectPresentInSet = expectPresentInSet ?: other.expectPresentInSet, + sourceSets = sourceSets + other.sourceSets ).mergeExtras(this, other) fun DTypeParameter.mergeWith(other: DTypeParameter): DTypeParameter = copy( - documentation = documentation.mergeWith(other.documentation), - platformData = (platformData + other.platformData).distinct() + documentation = documentation + other.documentation, + expectPresentInSet = expectPresentInSet ?: other.expectPresentInSet, + sourceSets = sourceSets + other.sourceSets ).mergeExtras(this, other) fun DTypeAlias.mergeWith(other: DTypeAlias): DTypeAlias = copy( - documentation = documentation.mergeWith(other.documentation), - underlyingType = underlyingType.mergeWith(other.underlyingType), - visibility = visibility.mergeWith(other.visibility), - platformData = (platformData + other.platformData).distinct() + documentation = documentation + other.documentation, + expectPresentInSet = expectPresentInSet ?: other.expectPresentInSet, + underlyingType = underlyingType + other.underlyingType, + visibility = visibility + other.visibility, + sourceSets = sourceSets + other.sourceSets ).mergeExtras(this, other)
\ No newline at end of file diff --git a/plugins/base/src/main/kotlin/transformers/documentables/DocumentableVisibilityFilter.kt b/plugins/base/src/main/kotlin/transformers/documentables/DocumentableVisibilityFilter.kt index c261d2dc..6fdce3a8 100644 --- a/plugins/base/src/main/kotlin/transformers/documentables/DocumentableVisibilityFilter.kt +++ b/plugins/base/src/main/kotlin/transformers/documentables/DocumentableVisibilityFilter.kt @@ -5,15 +5,14 @@ import org.jetbrains.dokka.model.* import org.jetbrains.dokka.model.DAnnotation import org.jetbrains.dokka.model.DEnum import org.jetbrains.dokka.model.DFunction -import org.jetbrains.dokka.pages.PlatformData import org.jetbrains.dokka.plugability.DokkaContext import org.jetbrains.dokka.transformers.documentation.PreMergeDocumentableTransformer -internal object DocumentableVisibilityFilter : PreMergeDocumentableTransformer { +internal class DocumentableVisibilityFilter(val context: DokkaContext) : PreMergeDocumentableTransformer { - override fun invoke(modules: List<DModule>, context: DokkaContext): List<DModule> = modules.map { original -> + override fun invoke(modules: List<DModule>): List<DModule> = modules.map { original -> val packageOptions = - context.configuration.passesConfigurations.first { original.platformData.contains(it.platformData) } + context.configuration.passesConfigurations.first { original.sourceSets.contains(context.sourceSet(it)) } .perPackageOptions DocumentableFilter(packageOptions).processModule(original) @@ -36,7 +35,7 @@ internal object DocumentableVisibilityFilter : PreMergeDocumentableTransformer { original.name, packages = packages, documentation = original.documentation, - platformData = original.platformData, + sourceSets = original.sourceSets, extra = original.extra ) } @@ -69,7 +68,8 @@ internal object DocumentableVisibilityFilter : PreMergeDocumentableTransformer { classlikes, it.typealiases, it.documentation, - it.platformData, + it.expectPresentInSet, + it.sourceSets, it.extra ) } @@ -78,26 +78,25 @@ internal object DocumentableVisibilityFilter : PreMergeDocumentableTransformer { return Pair(packagesListChanged, filteredPackages) } - private fun <T : WithVisibility> alwaysTrue(a: T, p: PlatformData) = true - private fun <T : WithVisibility> alwaysFalse(a: T, p: PlatformData) = false + private fun <T : WithVisibility> alwaysTrue(a: T, p: SourceSetData) = true + private fun <T : WithVisibility> alwaysFalse(a: T, p: SourceSetData) = false - private fun WithVisibility.visibilityForPlatform(data: PlatformData): Visibility? = - visibility[data] ?: visibility.expect + private fun WithVisibility.visibilityForPlatform(data: SourceSetData): Visibility? = visibility[data] private fun <T> T.filterPlatforms( - additionalCondition: (T, PlatformData) -> Boolean = ::alwaysTrue, - alternativeCondition: (T, PlatformData) -> Boolean = ::alwaysFalse + additionalCondition: (T, SourceSetData) -> Boolean = ::alwaysTrue, + alternativeCondition: (T, SourceSetData) -> Boolean = ::alwaysFalse ) where T : Documentable, T : WithVisibility = - platformData.filter { d -> + sourceSets.filter { d -> visibilityForPlatform(d)?.isAllowedInPackage(dri.packageName) == true && additionalCondition(this, d) || alternativeCondition(this, d) } private fun <T> List<T>.transform( - additionalCondition: (T, PlatformData) -> Boolean = ::alwaysTrue, - alternativeCondition: (T, PlatformData) -> Boolean = ::alwaysFalse, - recreate: (T, List<PlatformData>) -> T + additionalCondition: (T, SourceSetData) -> Boolean = ::alwaysTrue, + alternativeCondition: (T, SourceSetData) -> Boolean = ::alwaysFalse, + recreate: (T, List<SourceSetData>) -> T ): Pair<Boolean, List<T>> where T : Documentable, T : WithVisibility { var changed = false val values = mapNotNull { t -> @@ -119,7 +118,7 @@ internal object DocumentableVisibilityFilter : PreMergeDocumentableTransformer { private fun filterFunctions( functions: List<DFunction>, - additionalCondition: (DFunction, PlatformData) -> Boolean = ::alwaysTrue + additionalCondition: (DFunction, SourceSetData) -> Boolean = ::alwaysTrue ) = functions.transform(additionalCondition) { original, filteredPlatforms -> with(original) { @@ -129,6 +128,7 @@ internal object DocumentableVisibilityFilter : PreMergeDocumentableTransformer { isConstructor, parameters, documentation.filtered(filteredPlatforms), + expectPresentInSet.filtered(filteredPlatforms), sources.filtered(filteredPlatforms), visibility.filtered(filteredPlatforms), type, @@ -141,13 +141,13 @@ internal object DocumentableVisibilityFilter : PreMergeDocumentableTransformer { } } - private fun hasVisibleAccessorsForPlatform(property: DProperty, data: PlatformData) = + private fun hasVisibleAccessorsForPlatform(property: DProperty, data: SourceSetData) = property.getter?.visibilityForPlatform(data)?.isAllowedInPackage(property.dri.packageName) == true || property.setter?.visibilityForPlatform(data)?.isAllowedInPackage(property.dri.packageName) == true private fun filterProperties( properties: List<DProperty>, - additionalCondition: (DProperty, PlatformData) -> Boolean = ::alwaysTrue + additionalCondition: (DProperty, SourceSetData) -> Boolean = ::alwaysTrue ): Pair<Boolean, List<DProperty>> = properties.transform(additionalCondition, ::hasVisibleAccessorsForPlatform) { original, filteredPlatforms -> with(original) { @@ -155,6 +155,7 @@ internal object DocumentableVisibilityFilter : PreMergeDocumentableTransformer { dri, name, documentation.filtered(filteredPlatforms), + expectPresentInSet.filtered(filteredPlatforms), sources.filtered(filteredPlatforms), visibility.filtered(filteredPlatforms), type, @@ -169,16 +170,17 @@ internal object DocumentableVisibilityFilter : PreMergeDocumentableTransformer { } } - private fun filterEnumEntries(entries: List<DEnumEntry>, filteredPlatforms: List<PlatformData>) = + private fun filterEnumEntries(entries: List<DEnumEntry>, filteredPlatforms: List<SourceSetData>) = entries.mapNotNull { entry -> - if (filteredPlatforms.containsAll(entry.platformData)) entry + if (filteredPlatforms.containsAll(entry.sourceSets)) entry else { - val intersection = filteredPlatforms.intersect(entry.platformData).toList() + val intersection = filteredPlatforms.intersect(entry.sourceSets).toList() if (intersection.isEmpty()) null else DEnumEntry( entry.dri, entry.name, entry.documentation.filtered(intersection), + entry.expectPresentInSet.filtered(filteredPlatforms), filterFunctions(entry.functions) { _, data -> data in intersection }.second, filterProperties(entry.properties) { _, data -> data in intersection }.second, filterClasslikes(entry.classlikes) { _, data -> data in intersection }.second, @@ -190,7 +192,7 @@ internal object DocumentableVisibilityFilter : PreMergeDocumentableTransformer { private fun filterClasslikes( classlikeList: List<DClasslike>, - additionalCondition: (DClasslike, PlatformData) -> Boolean = ::alwaysTrue + additionalCondition: (DClasslike, SourceSetData) -> Boolean = ::alwaysTrue ): Pair<Boolean, List<DClasslike>> { var classlikesListChanged = false val filteredClasslikes: List<DClasslike> = classlikeList.mapNotNull { @@ -200,7 +202,7 @@ internal object DocumentableVisibilityFilter : PreMergeDocumentableTransformer { classlikesListChanged = true null } else { - var modified = platformData.size != filteredPlatforms.size + var modified = sourceSets.size != filteredPlatforms.size val functions = filterFunctions(functions) { _, data -> data in filteredPlatforms }.let { (listModified, list) -> modified = modified || listModified @@ -246,6 +248,7 @@ internal object DocumentableVisibilityFilter : PreMergeDocumentableTransformer { generics, supertypes.filtered(filteredPlatforms), documentation.filtered(filteredPlatforms), + expectPresentInSet.filtered(filteredPlatforms), modifier, filteredPlatforms, extra @@ -254,6 +257,7 @@ internal object DocumentableVisibilityFilter : PreMergeDocumentableTransformer { name, dri, documentation.filtered(filteredPlatforms), + expectPresentInSet.filtered(filteredPlatforms), sources.filtered(filteredPlatforms), functions, properties, @@ -269,6 +273,7 @@ internal object DocumentableVisibilityFilter : PreMergeDocumentableTransformer { name, enumEntries, documentation.filtered(filteredPlatforms), + expectPresentInSet.filtered(filteredPlatforms), sources.filtered(filteredPlatforms), functions, properties, @@ -284,6 +289,7 @@ internal object DocumentableVisibilityFilter : PreMergeDocumentableTransformer { dri, name, documentation.filtered(filteredPlatforms), + expectPresentInSet.filtered(filteredPlatforms), sources.filtered(filteredPlatforms), functions, properties, @@ -299,6 +305,7 @@ internal object DocumentableVisibilityFilter : PreMergeDocumentableTransformer { name, dri, documentation.filtered(filteredPlatforms), + expectPresentInSet.filtered(filteredPlatforms), sources.filtered(filteredPlatforms), functions, properties, diff --git a/plugins/base/src/main/kotlin/transformers/documentables/InheritorsExtractorTransformer.kt b/plugins/base/src/main/kotlin/transformers/documentables/InheritorsExtractorTransformer.kt index 9cc09d89..15ffc08a 100644 --- a/plugins/base/src/main/kotlin/transformers/documentables/InheritorsExtractorTransformer.kt +++ b/plugins/base/src/main/kotlin/transformers/documentables/InheritorsExtractorTransformer.kt @@ -4,7 +4,6 @@ import org.jetbrains.dokka.links.DRI import org.jetbrains.dokka.model.* import org.jetbrains.dokka.model.properties.ExtraProperty import org.jetbrains.dokka.model.properties.MergeStrategy -import org.jetbrains.dokka.pages.PlatformData import org.jetbrains.dokka.plugability.DokkaContext import org.jetbrains.dokka.transformers.documentation.DocumentableTransformer @@ -12,8 +11,8 @@ class InheritorsExtractorTransformer : DocumentableTransformer { override fun invoke(original: DModule, context: DokkaContext): DModule = original.generateInheritanceMap().let { inheritanceMap -> original.appendInheritors(inheritanceMap) as DModule } - private fun <T : Documentable> T.appendInheritors(inheritanceMap: Map<PlatformData, Map<DRI, List<DRI>>>): Documentable = - InheritorsInfo(PlatformDependent(inheritanceMap.getForDRI(dri))).let { info -> + private fun <T : Documentable> T.appendInheritors(inheritanceMap: Map<SourceSetData, Map<DRI, List<DRI>>>): Documentable = + InheritorsInfo(inheritanceMap.getForDRI(dri)).let { info -> when (this) { is DModule -> copy(packages = packages.map { it.appendInheritors(inheritanceMap) as DPackage }) is DPackage -> copy(classlikes = classlikes.map { it.appendInheritors(inheritanceMap) as DClasslike }) @@ -44,12 +43,12 @@ class InheritorsExtractorTransformer : DocumentableTransformer { } } - private fun InheritorsInfo.isNotEmpty() = this.value.allValues.fold(0) { acc, list -> acc + list.size } > 0 + private fun InheritorsInfo.isNotEmpty() = this.value.values.fold(0) { acc, list -> acc + list.size } > 0 - private fun Map<PlatformData, Map<DRI, List<DRI>>>.getForDRI(dri: DRI) = - PlatformDependent(map { (v, k) -> + private fun Map<SourceSetData, Map<DRI, List<DRI>>>.getForDRI(dri: DRI) = + map { (v, k) -> v to k[dri] - }.map { (k, v) -> k to v.orEmpty() }.toMap()) + }.map { (k, v) -> k to v.orEmpty() }.toMap() private fun DModule.generateInheritanceMap() = getInheritanceEntriesRec().filterNot { it.second.isEmpty() }.groupBy({ it.first }) { it.second } @@ -58,26 +57,24 @@ class InheritorsExtractorTransformer : DocumentableTransformer { .groupBy({ it.first }) { it.second }.map { (k2, v2) -> k2 to v2.flatten() }.toMap() }.filter { it.second.values.isNotEmpty() }.toMap() - private fun <T : Documentable> T.getInheritanceEntriesRec(): List<Pair<PlatformData, List<Pair<DRI, DRI>>>> = + private fun <T : Documentable> T.getInheritanceEntriesRec(): List<Pair<SourceSetData, List<Pair<DRI, DRI>>>> = this.toInheritanceEntries() + children.flatMap { it.getInheritanceEntriesRec() } private fun <T : Documentable> T.toInheritanceEntries() = (this as? WithSupertypes)?.let { - it.supertypes.map.map { (k, v) -> k to v.map { it to dri } } + it.supertypes.map { (k, v) -> k to v.map { it to dri } } }.orEmpty() } -class InheritorsInfo(val value: PlatformDependent<List<DRI>>) : ExtraProperty<Documentable> { +class InheritorsInfo(val value: SourceSetDependent<List<DRI>>) : ExtraProperty<Documentable> { companion object : ExtraProperty.Key<Documentable, InheritorsInfo> { override fun mergeStrategyFor(left: InheritorsInfo, right: InheritorsInfo): MergeStrategy<Documentable> = MergeStrategy.Replace( InheritorsInfo( - PlatformDependent( - (left.value.map.entries.toList() + right.value.map.entries.toList()) + (left.value.entries.toList() + right.value.entries.toList()) .groupBy({ it.key }) { it.value } .map { (k, v) -> k to v.flatten() }.toMap() - ) ) ) } diff --git a/plugins/base/src/main/kotlin/transformers/documentables/ModuleAndPackageDocumentationTransformer.kt b/plugins/base/src/main/kotlin/transformers/documentables/ModuleAndPackageDocumentationTransformer.kt index b69c43d3..a886494e 100644 --- a/plugins/base/src/main/kotlin/transformers/documentables/ModuleAndPackageDocumentationTransformer.kt +++ b/plugins/base/src/main/kotlin/transformers/documentables/ModuleAndPackageDocumentationTransformer.kt @@ -1,9 +1,9 @@ package org.jetbrains.dokka.base.transformers.documentables import org.jetbrains.dokka.model.DModule -import org.jetbrains.dokka.model.PlatformDependent +import org.jetbrains.dokka.model.SourceSetData import org.jetbrains.dokka.model.doc.DocumentationNode -import org.jetbrains.dokka.pages.PlatformData +import org.jetbrains.dokka.model.sourceSet import org.jetbrains.dokka.parsers.MarkdownParser import org.jetbrains.dokka.plugability.DokkaContext import org.jetbrains.dokka.transformers.documentation.PreMergeDocumentableTransformer @@ -12,14 +12,14 @@ import java.nio.file.Files import java.nio.file.Paths -internal object ModuleAndPackageDocumentationTransformer : PreMergeDocumentableTransformer { +internal class ModuleAndPackageDocumentationTransformer(val context: DokkaContext) : PreMergeDocumentableTransformer { - override fun invoke(original: List<DModule>, context: DokkaContext): List<DModule> { + override fun invoke(original: List<DModule>): List<DModule> { val modulesAndPackagesDocumentation = context.configuration.passesConfigurations .map { - Pair(it.moduleName, it.platformData) to + Pair(it.moduleName, context.sourceSet(it)) to it.includes.map { Paths.get(it) } .also { it.forEach { @@ -50,10 +50,10 @@ internal object ModuleAndPackageDocumentationTransformer : PreMergeDocumentableT return original.map { module -> val moduleDocumentation = - module.platformData.mapNotNull { pd -> + module.sourceSets.mapNotNull { pd -> val doc = modulesAndPackagesDocumentation[Pair(module.name, pd)] val facade = context.platforms[pd]?.facade - ?: return@mapNotNull null.also { context.logger.warn("Could not find platform data for ${pd.name}") } + ?: return@mapNotNull null.also { context.logger.warn("Could not find platform data for ${pd.moduleName}/${pd.sourceSetName}") } try { doc?.get("Module")?.get(module.name)?.run { pd to MarkdownParser( @@ -68,15 +68,15 @@ internal object ModuleAndPackageDocumentationTransformer : PreMergeDocumentableT } }.toMap() - val packagesDocumentation = module.packages.map { dPackage -> - dPackage.name to dPackage.platformData.mapNotNull { platformData -> - val doc = modulesAndPackagesDocumentation[Pair(module.name, platformData)] - val facade = context.platforms[platformData]?.facade - ?: return@mapNotNull null.also { context.logger.warn("Could not find platform data for ${platformData.name}") } - val descriptor = facade.resolveSession.getPackageFragment(FqName(dPackage.name)) - ?: return@mapNotNull null.also { context.logger.warn("Could not find descriptor for ${dPackage.name}") } - doc?.get("Package")?.get(dPackage.name)?.run { - platformData to MarkdownParser( + val packagesDocumentation = module.packages.map { + it.name to it.sourceSets.mapNotNull { pd -> + val doc = modulesAndPackagesDocumentation[Pair(module.name, pd)] + val facade = context.platforms[pd]?.facade + ?: return@mapNotNull null.also { context.logger.warn("Could not find platform data for ${pd.moduleName}/${pd.sourceSetName}") } + val descriptor = facade.resolveSession.getPackageFragment(FqName(it.name)) + ?: return@mapNotNull null.also { context.logger.warn("Could not find descriptor for $") } + doc?.get("Package")?.get(it.name)?.run { + pd to MarkdownParser( facade, descriptor, context.logger @@ -86,13 +86,11 @@ internal object ModuleAndPackageDocumentationTransformer : PreMergeDocumentableT }.toMap() module.copy( - documentation = module.documentation.let { mergeDocumentation(it.map, moduleDocumentation) }, + documentation = mergeDocumentation(module.documentation, moduleDocumentation), packages = module.packages.map { val packageDocumentation = packagesDocumentation[it.name] if (packageDocumentation != null && packageDocumentation.isNotEmpty()) - it.copy(documentation = it.documentation.let { value -> - mergeDocumentation(value.map, packageDocumentation) - }) + it.copy(documentation = mergeDocumentation(it.documentation, packageDocumentation)) else it } @@ -100,10 +98,10 @@ internal object ModuleAndPackageDocumentationTransformer : PreMergeDocumentableT } } - private fun mergeDocumentation(origin: Map<PlatformData, DocumentationNode>, new: Map<PlatformData, DocumentationNode>) = PlatformDependent( + private fun mergeDocumentation(origin: Map<SourceSetData, DocumentationNode>, new: Map<SourceSetData, DocumentationNode>) = (origin.asSequence() + new.asSequence()) .distinct() .groupBy({ it.key }, { it.value }) .mapValues { (_, values) -> DocumentationNode(values.flatMap { it.children }) } - ) + } diff --git a/plugins/base/src/main/kotlin/transformers/pages/comments/CommentsToContentConverter.kt b/plugins/base/src/main/kotlin/transformers/pages/comments/CommentsToContentConverter.kt index 778e0498..cb74441e 100644 --- a/plugins/base/src/main/kotlin/transformers/pages/comments/CommentsToContentConverter.kt +++ b/plugins/base/src/main/kotlin/transformers/pages/comments/CommentsToContentConverter.kt @@ -1,5 +1,6 @@ package org.jetbrains.dokka.base.transformers.pages.comments +import org.jetbrains.dokka.model.SourceSetData import org.jetbrains.dokka.model.doc.DocTag import org.jetbrains.dokka.model.properties.PropertyContainer import org.jetbrains.dokka.pages.* @@ -8,7 +9,7 @@ interface CommentsToContentConverter { fun buildContent( docTag: DocTag, dci: DCI, - platforms: Set<PlatformData>, + platforms: Set<SourceSetData>, styles: Set<Style> = emptySet(), extras: PropertyContainer<ContentNode> = PropertyContainer.empty() ): List<ContentNode> diff --git a/plugins/base/src/main/kotlin/transformers/pages/comments/DocTagToContentConverter.kt b/plugins/base/src/main/kotlin/transformers/pages/comments/DocTagToContentConverter.kt index 4e65bae9..85391549 100644 --- a/plugins/base/src/main/kotlin/transformers/pages/comments/DocTagToContentConverter.kt +++ b/plugins/base/src/main/kotlin/transformers/pages/comments/DocTagToContentConverter.kt @@ -1,5 +1,6 @@ package org.jetbrains.dokka.base.transformers.pages.comments +import org.jetbrains.dokka.model.SourceSetData import org.jetbrains.dokka.model.doc.* import org.jetbrains.dokka.model.properties.PropertyContainer import org.jetbrains.dokka.pages.* @@ -8,19 +9,19 @@ object DocTagToContentConverter : CommentsToContentConverter { override fun buildContent( docTag: DocTag, dci: DCI, - platforms: Set<PlatformData>, + sourceSets: Set<SourceSetData>, styles: Set<Style>, extra: PropertyContainer<ContentNode> ): List<ContentNode> { fun buildChildren(docTag: DocTag, newStyles: Set<Style> = emptySet(), newExtras: SimpleAttr? = null) = docTag.children.flatMap { - buildContent(it, dci, platforms, styles + newStyles, newExtras?.let { extra + it } ?: extra) + buildContent(it, dci, sourceSets, styles + newStyles, newExtras?.let { extra + it } ?: extra) } fun buildTableRows(rows: List<DocTag>, newStyle: Style): List<ContentGroup> = rows.flatMap { - buildContent(it, dci, platforms, styles + newStyle, extra) as List<ContentGroup> + buildContent(it, dci, sourceSets, styles + newStyle, extra) as List<ContentGroup> } fun buildHeader(level: Int) = @@ -29,7 +30,7 @@ object DocTagToContentConverter : CommentsToContentConverter { buildChildren(docTag), level, dci, - platforms, + sourceSets, styles ) ) @@ -40,7 +41,7 @@ object DocTagToContentConverter : CommentsToContentConverter { buildChildren(docTag), ordered, dci, - platforms, + sourceSets, styles, ((PropertyContainer.empty<ContentNode>()) + SimpleAttr("start", start.toString())) ) @@ -48,7 +49,7 @@ object DocTagToContentConverter : CommentsToContentConverter { fun buildNewLine() = listOf( ContentBreakLine( - platforms + sourceSets ) ) @@ -71,7 +72,7 @@ object DocTagToContentConverter : CommentsToContentConverter { buildChildren(docTag), docTag.params.get("href")!!, dci, - platforms, + sourceSets, styles ) ) @@ -83,7 +84,7 @@ object DocTagToContentConverter : CommentsToContentConverter { setOf(docTag.dri), ContentKind.Symbol ), - platforms, + sourceSets, styles ) ) @@ -92,7 +93,7 @@ object DocTagToContentConverter : CommentsToContentConverter { buildChildren(docTag), "", dci, - platforms, + sourceSets, styles ) ) @@ -101,7 +102,7 @@ object DocTagToContentConverter : CommentsToContentConverter { buildChildren(docTag), "", dci, - platforms, + sourceSets, styles ) ) @@ -110,7 +111,7 @@ object DocTagToContentConverter : CommentsToContentConverter { address = docTag.params["href"]!!, altText = docTag.params["alt"], dci = dci, - platforms = platforms, + sourceSets = sourceSets, style = styles, extra = extra ) @@ -119,7 +120,7 @@ object DocTagToContentConverter : CommentsToContentConverter { ContentText( "", dci, - platforms, + sourceSets, setOf() ) ) @@ -127,7 +128,7 @@ object DocTagToContentConverter : CommentsToContentConverter { ContentText( docTag.body, dci, - platforms, + sourceSets, styles ) ) @@ -137,7 +138,7 @@ object DocTagToContentConverter : CommentsToContentConverter { buildTableRows(docTag.children.filterIsInstance<Th>(), CommentTable), buildTableRows(docTag.children.filterIsInstance<Tr>(), CommentTable), dci, - platforms, + sourceSets, styles + CommentTable ) ) @@ -145,10 +146,10 @@ object DocTagToContentConverter : CommentsToContentConverter { is Tr -> listOf( ContentGroup( docTag.children.map { - ContentGroup(buildChildren(it), dci, platforms, styles, extra) + ContentGroup(buildChildren(it), dci, sourceSets, styles, extra) }, dci, - platforms, + sourceSets, styles ) ) diff --git a/plugins/base/src/main/kotlin/transformers/pages/merger/SameMethodNamePageMergerStrategy.kt b/plugins/base/src/main/kotlin/transformers/pages/merger/SameMethodNamePageMergerStrategy.kt index fb904f47..31e79555 100644 --- a/plugins/base/src/main/kotlin/transformers/pages/merger/SameMethodNamePageMergerStrategy.kt +++ b/plugins/base/src/main/kotlin/transformers/pages/merger/SameMethodNamePageMergerStrategy.kt @@ -32,6 +32,6 @@ object SameMethodNamePageMergerStrategy : PageMergerStrategy { } fun asGroup(dci: DCI, nodes: List<ContentNode>): ContentGroup = - nodes.first().let { ContentGroup(nodes, dci, it.platforms, it.style, it.extra) } + nodes.first().let { ContentGroup(nodes, dci, it.sourceSets, it.style, it.extra) } }
\ No newline at end of file diff --git a/plugins/base/src/main/kotlin/transformers/pages/samples/SamplesTransformer.kt b/plugins/base/src/main/kotlin/transformers/pages/samples/SamplesTransformer.kt index 78fc4d33..9b04af40 100644 --- a/plugins/base/src/main/kotlin/transformers/pages/samples/SamplesTransformer.kt +++ b/plugins/base/src/main/kotlin/transformers/pages/samples/SamplesTransformer.kt @@ -8,8 +8,10 @@ import org.jetbrains.dokka.analysis.AnalysisEnvironment import org.jetbrains.dokka.analysis.DokkaResolutionFacade import org.jetbrains.dokka.base.renderers.platforms import org.jetbrains.dokka.links.DRI +import org.jetbrains.dokka.model.SourceSetData import org.jetbrains.dokka.model.doc.Sample import org.jetbrains.dokka.model.properties.PropertyContainer +import org.jetbrains.dokka.model.sourceSet import org.jetbrains.dokka.pages.* import org.jetbrains.dokka.plugability.DokkaContext import org.jetbrains.dokka.transformers.pages.PageTransformer @@ -31,16 +33,16 @@ abstract class SamplesTransformer(val context: DokkaContext) : PageTransformer { val analysis = setUpAnalysis(context) return input.transformContentPagesTree { page -> - page.documentable?.documentation?.allEntries?.fold(page) { acc, entry -> - entry.second.children.filterIsInstance<Sample>().fold(acc) { acc, sample -> - acc.modified(content = acc.content.addSample(page, entry.first, sample.name, analysis)) + page.documentable?.documentation?.entries?.fold(page) { acc, entry -> + entry.value.children.filterIsInstance<Sample>().fold(acc) { acc, sample -> + acc.modified(content = acc.content.addSample(page, entry.key, sample.name, analysis)) } } ?: page } } private fun setUpAnalysis(context: DokkaContext) = context.configuration.passesConfigurations.map { - it.platformData to AnalysisEnvironment(DokkaGenerator.DokkaMessageCollector(context.logger), it.analysisPlatform).run { + context.sourceSet(it) to AnalysisEnvironment(DokkaGenerator.DokkaMessageCollector(context.logger), it.analysisPlatform).run { if (analysisPlatform == Platform.jvm) { addClasspath(PathUtil.getJdkClassesRootsFromCurrentJre()) } @@ -56,12 +58,9 @@ abstract class SamplesTransformer(val context: DokkaContext) : PageTransformer { } }.toMap() - private fun ContentNode.addSample(contentPage: ContentPage, platform: PlatformData?, fqName: String, analysis: Map<PlatformData, EnvironmentAndFacade>): ContentNode { - val facade = if(platform == null) { - analysis.entries.find { it.key.platformType.name == "common" }?.value - } else { - analysis[platform] - }?.facade ?: return this.also { context.logger.warn("Cannot resolve facade for platform ${platform?.name ?: "expect"}") } + private fun ContentNode.addSample(contentPage: ContentPage, platform: SourceSetData, fqName: String, analysis: Map<SourceSetData, EnvironmentAndFacade>): ContentNode { + val facade = analysis[platform]?.facade ?: + return this.also { context.logger.warn("Cannot resolve facade for platform ${platform.moduleName}")} val psiElement = fqNameToPsiElement(facade, fqName) ?: return this.also { context.logger.warn("Cannot find PsiElement corresponding to $fqName") } val imports = processImports(psiElement) // TODO: Process somehow imports. Maybe just attach them at the top of each body @@ -96,13 +95,13 @@ abstract class SamplesTransformer(val context: DokkaContext) : PageTransformer { return DescriptorToSourceUtils.descriptorToDeclaration(symbol) } - private fun contentCode(platforms: List<PlatformData>, dri: Set<DRI>, content: String, language: String) = + private fun contentCode(sourceSets: List<SourceSetData>, dri: Set<DRI>, content: String, language: String) = ContentCode( children = listOf( ContentText( text = content, dci = DCI(dri, ContentKind.BriefComment), - platforms = platforms.toSet(), + sourceSets = sourceSets.toSet(), style = emptySet(), extra = PropertyContainer.empty() ) @@ -110,7 +109,7 @@ abstract class SamplesTransformer(val context: DokkaContext) : PageTransformer { language = language, extra = PropertyContainer.empty(), dci = DCI(dri, ContentKind.Source), - platforms = platforms.toSet(), + sourceSets = sourceSets.toSet(), style = emptySet() ) }
\ No newline at end of file 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 fa73e757..876326d1 100644 --- a/plugins/base/src/main/kotlin/transformers/pages/sourcelinks/SourceLinksTransformer.kt +++ b/plugins/base/src/main/kotlin/transformers/pages/sourcelinks/SourceLinksTransformer.kt @@ -5,9 +5,12 @@ import com.intellij.psi.PsiDocumentManager import org.jetbrains.dokka.DokkaConfiguration import org.jetbrains.dokka.base.translators.documentables.PageContentBuilder import org.jetbrains.dokka.model.DescriptorDocumentableSource +import org.jetbrains.dokka.model.SourceSetData import org.jetbrains.dokka.model.DocumentableSource import org.jetbrains.dokka.model.PsiDocumentableSource import org.jetbrains.dokka.model.WithExpectActual +import org.jetbrains.dokka.model.properties.PropertyContainer +import org.jetbrains.dokka.model.sourceSet import org.jetbrains.dokka.pages.* import org.jetbrains.dokka.plugability.DokkaContext import org.jetbrains.dokka.transformers.pages.PageTransformer @@ -30,11 +33,11 @@ class SourceLinksTransformer(val context: DokkaContext, val builder: PageContent } private fun getSourceLinks() = context.configuration.passesConfigurations - .flatMap { it.sourceLinks.map { sl -> SourceLink(sl, it.platformData) } } + .flatMap { it.sourceLinks.map { sl -> SourceLink(sl, context.sourceSetCache.getSourceSet(it)) } } private fun resolveSources(documentable: WithExpectActual) = documentable.sources .mapNotNull { entry -> - getSourceLinks().find { entry.value.path.contains(it.path) && it.platformData == entry.key }?.let { + getSourceLinks().find { entry.value.path.contains(it.path) && it.sourceSetData == entry.key }?.let { Pair( entry.key, entry.value.toLink(it) @@ -42,7 +45,7 @@ class SourceLinksTransformer(val context: DokkaContext, val builder: PageContent } } - private fun ContentPage.addSourcesContent(sources: List<Pair<PlatformData, String>>) = builder + private fun ContentPage.addSourcesContent(sources: List<Pair<SourceSetData, String>>) = builder .buildSourcesContent(this, sources) .let { this.modified( @@ -52,10 +55,10 @@ class SourceLinksTransformer(val context: DokkaContext, val builder: PageContent private fun PageContentBuilder.buildSourcesContent( node: ContentPage, - sources: List<Pair<PlatformData, String>> + sources: List<Pair<SourceSetData, String>> ) = contentFor( node.dri.first(), - node.documentable!!.platformData.toSet() + node.documentable!!.sourceSets.toSet() ) { header(2) { text("Sources") } +ContentTable( @@ -66,7 +69,7 @@ class SourceLinksTransformer(val context: DokkaContext, val builder: PageContent } }, DCI(node.dri, ContentKind.Source), - node.documentable!!.platformData.toSet(), + node.documentable!!.sourceSets.toSet(), style = emptySet() ) } @@ -94,7 +97,7 @@ class SourceLinksTransformer(val context: DokkaContext, val builder: PageContent else -> ContentGroup( children = listOf(this, table), extra = this.extra, - platforms = this.platforms, + sourceSets = this.sourceSets, dci = this.dci, style = this.style ) @@ -107,8 +110,8 @@ class SourceLinksTransformer(val context: DokkaContext, val builder: PageContent } } -data class SourceLink(val path: String, val url: String, val lineSuffix: String?, val platformData: PlatformData) { - constructor(sourceLinkDefinition: DokkaConfiguration.SourceLinkDefinition, platformData: PlatformData) : this( - sourceLinkDefinition.path, sourceLinkDefinition.url, sourceLinkDefinition.lineSuffix, platformData +data class SourceLink(val path: String, val url: String, val lineSuffix: String?, val sourceSetData: SourceSetData) { + constructor(sourceLinkDefinition: DokkaConfiguration.SourceLinkDefinition, sourceSetData: SourceSetData) : this( + sourceLinkDefinition.path, sourceLinkDefinition.url, sourceLinkDefinition.lineSuffix, sourceSetData ) }
\ No newline at end of file diff --git a/plugins/base/src/main/kotlin/translators/descriptors/DefaultDescriptorToDocumentableTranslator.kt b/plugins/base/src/main/kotlin/translators/descriptors/DefaultDescriptorToDocumentableTranslator.kt index 128b9bd4..7cc96a24 100644 --- a/plugins/base/src/main/kotlin/translators/descriptors/DefaultDescriptorToDocumentableTranslator.kt +++ b/plugins/base/src/main/kotlin/translators/descriptors/DefaultDescriptorToDocumentableTranslator.kt @@ -7,7 +7,6 @@ import org.jetbrains.dokka.links.withClass import org.jetbrains.dokka.model.* import org.jetbrains.dokka.model.doc.* import org.jetbrains.dokka.model.properties.PropertyContainer -import org.jetbrains.dokka.pages.PlatformData import org.jetbrains.dokka.parsers.MarkdownParser import org.jetbrains.dokka.plugability.DokkaContext import org.jetbrains.dokka.utilities.DokkaLogger @@ -20,6 +19,7 @@ import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.descriptors.Visibility import org.jetbrains.kotlin.descriptors.impl.DeclarationDescriptorVisitorEmptyBodies import org.jetbrains.kotlin.idea.kdoc.findKDoc +import org.jetbrains.kotlin.load.kotlin.toSourceElement import org.jetbrains.kotlin.psi.KtExpression import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.calls.components.isVararg @@ -37,35 +37,35 @@ import org.jetbrains.kotlin.utils.addToStdlib.safeAs object DefaultDescriptorToDocumentableTranslator : SourceToDocumentableTranslator { - override fun invoke(platformData: PlatformData, context: DokkaContext): DModule { + override fun invoke(sourceSet: SourceSetData, context: DokkaContext): DModule { - val (environment, facade) = context.platforms.getValue(platformData) + val (environment, facade) = context.platforms.getValue(sourceSet) val packageFragments = environment.getSourceFiles().asSequence() .map { it.packageFqName } .distinct() .mapNotNull { facade.resolveSession.getPackageFragment(it) } .toList() - return DokkaDescriptorVisitor(platformData, context.platforms.getValue(platformData).facade, context.logger).run { + return DokkaDescriptorVisitor(sourceSet, context.platforms.getValue(sourceSet).facade, context.logger).run { packageFragments.mapNotNull { it.safeAs<PackageFragmentDescriptor>() }.map { visitPackageFragmentDescriptor( it, - DRIWithPlatformInfo(DRI.topLevel, PlatformDependent.empty()) + DRIWithPlatformInfo(DRI.topLevel, emptyMap()) ) } - }.let { DModule(platformData.name, it, PlatformDependent.empty(), listOf(platformData)) } + }.let { DModule(sourceSet.moduleName, it, emptyMap(), null, listOf(sourceSet)) } } } data class DRIWithPlatformInfo( val dri: DRI, - val actual: PlatformDependent<DocumentableSource> + val actual: SourceSetDependent<DocumentableSource> ) -fun DRI.withEmptyInfo() = DRIWithPlatformInfo(this, PlatformDependent.empty()) +fun DRI.withEmptyInfo() = DRIWithPlatformInfo(this, emptyMap()) private class DokkaDescriptorVisitor( - private val platformData: PlatformData, + private val sourceSet: SourceSetData, private val resolutionFacade: DokkaResolutionFacade, private val logger: DokkaLogger ) : DeclarationDescriptorVisitorEmptyBodies<Documentable, DRIWithPlatformInfo>() { @@ -73,23 +73,30 @@ private class DokkaDescriptorVisitor( throw IllegalStateException("${javaClass.simpleName} should never enter ${descriptor.javaClass.simpleName}") } + private fun Collection<DeclarationDescriptor>.filterDescriptorsInSourceSet() = filter { + val path = it.toSourceElement.containingFile.toString() + path.isNotBlank() && sourceSet.sourceRoots.any { root -> path.startsWith(root.path) } + } + + private fun <T> T.toSourceSetDependent() = mapOf(sourceSet to this) + override fun visitPackageFragmentDescriptor( descriptor: PackageFragmentDescriptor, parent: DRIWithPlatformInfo ): DPackage { - val name = descriptor.fqName.asString().takeUnless { it.isBlank() } - ?: "[" + platformData.targets.joinToString(" ") + " root]"// TODO: error-prone, find a better way to do it + val name = descriptor.fqName.asString().takeUnless { it.isBlank() } ?: + "[${sourceSet.sourceSetName} root]"// TODO: error-prone, find a better way to do it val driWithPlatform = DRI(packageName = name).withEmptyInfo() val scope = descriptor.getMemberScope() return DPackage( dri = driWithPlatform.dri, - functions = scope.functions(driWithPlatform), - properties = scope.properties(driWithPlatform), - classlikes = scope.classlikes(driWithPlatform), - typealiases = scope.typealiases(driWithPlatform), - documentation = descriptor.resolveDescriptorData(platformData), - platformData = listOf(platformData) + functions = scope.functions(driWithPlatform, true), + properties = scope.properties(driWithPlatform, true), + classlikes = scope.classlikes(driWithPlatform, true), + typealiases = scope.typealiases(driWithPlatform, true), + documentation = descriptor.resolveDescriptorData(), + sourceSets = listOf(sourceSet) ) } @@ -106,7 +113,7 @@ private class DokkaDescriptorVisitor( val driWithPlatform = parent.dri.withClass(descriptor.name.asString()).withEmptyInfo() val scope = descriptor.unsubstitutedMemberScope val isExpect = descriptor.isExpect - val info = descriptor.resolveClassDescriptionData(if (!isExpect) platformData else null) + val info = descriptor.resolveClassDescriptionData() return DInterface( @@ -116,14 +123,13 @@ private class DokkaDescriptorVisitor( properties = scope.properties(driWithPlatform), classlikes = scope.classlikes(driWithPlatform), sources = descriptor.createSources(), - visibility = if (isExpect) PlatformDependent.expectFrom(descriptor.visibility.toDokkaVisibility()) - else PlatformDependent.from(platformData, descriptor.visibility.toDokkaVisibility()), - supertypes = if (isExpect) PlatformDependent.expectFrom(info.supertypes) - else PlatformDependent.from(platformData, info.supertypes), + expectPresentInSet = sourceSet.takeIf { isExpect }, + visibility = descriptor.visibility.toDokkaVisibility().toSourceSetDependent(), + supertypes = info.supertypes.toSourceSetDependent(), documentation = info.docs, generics = descriptor.typeConstructor.parameters.map { it.toTypeParameter() }, companion = descriptor.companion(driWithPlatform), - platformData = listOf(platformData), + sourceSets = listOf(sourceSet), extra = PropertyContainer.withAll(descriptor.additionalExtras(), descriptor.getAnnotations()) ) } @@ -132,7 +138,7 @@ private class DokkaDescriptorVisitor( val driWithPlatform = parent.dri.withClass(descriptor.name.asString()).withEmptyInfo() val scope = descriptor.unsubstitutedMemberScope val isExpect = descriptor.isExpect - val info = descriptor.resolveClassDescriptionData(if (!isExpect) platformData else null) + val info = descriptor.resolveClassDescriptionData() return DObject( @@ -142,12 +148,11 @@ private class DokkaDescriptorVisitor( properties = scope.properties(driWithPlatform), classlikes = scope.classlikes(driWithPlatform), sources = descriptor.createSources(), - visibility = if (isExpect) PlatformDependent.expectFrom(descriptor.visibility.toDokkaVisibility()) - else PlatformDependent.from(platformData, descriptor.visibility.toDokkaVisibility()), - supertypes = if (isExpect) PlatformDependent.expectFrom(info.supertypes) - else PlatformDependent.from(platformData, info.supertypes), + expectPresentInSet = sourceSet.takeIf { isExpect }, + visibility = descriptor.visibility.toDokkaVisibility().toSourceSetDependent(), + supertypes = info.supertypes.toSourceSetDependent(), documentation = info.docs, - platformData = listOf(platformData), + sourceSets = listOf(sourceSet), extra = PropertyContainer.withAll(descriptor.additionalExtras(), descriptor.getAnnotations()) ) } @@ -156,7 +161,7 @@ private class DokkaDescriptorVisitor( val driWithPlatform = parent.dri.withClass(descriptor.name.asString()).withEmptyInfo() val scope = descriptor.unsubstitutedMemberScope val isExpect = descriptor.isExpect - val info = descriptor.resolveClassDescriptionData(if (!isExpect) platformData else null) + val info = descriptor.resolveClassDescriptionData() return DEnum( dri = driWithPlatform.dri, @@ -167,13 +172,12 @@ private class DokkaDescriptorVisitor( properties = scope.properties(driWithPlatform), classlikes = scope.classlikes(driWithPlatform), sources = descriptor.createSources(), - visibility = if (isExpect) PlatformDependent.expectFrom(descriptor.visibility.toDokkaVisibility()) - else PlatformDependent.from(platformData, descriptor.visibility.toDokkaVisibility()), - supertypes = if (isExpect) PlatformDependent.expectFrom(info.supertypes) - else PlatformDependent.from(platformData, info.supertypes), + expectPresentInSet = sourceSet.takeIf { isExpect }, + visibility = descriptor.visibility.toDokkaVisibility().toSourceSetDependent(), + supertypes = info.supertypes.toSourceSetDependent(), documentation = info.docs, companion = descriptor.companion(driWithPlatform), - platformData = listOf(platformData), + sourceSets = listOf(sourceSet), extra = PropertyContainer.withAll(descriptor.additionalExtras(), descriptor.getAnnotations()) ) } @@ -186,11 +190,12 @@ private class DokkaDescriptorVisitor( return DEnumEntry( dri = driWithPlatform.dri, name = descriptor.name.asString(), - documentation = descriptor.resolveDescriptorData(if (!isExpect) platformData else null), + documentation = descriptor.resolveDescriptorData(), classlikes = scope.classlikes(driWithPlatform), functions = scope.functions(driWithPlatform), properties = scope.properties(driWithPlatform), - platformData = listOf(platformData), + sourceSets = listOf(sourceSet), + expectPresentInSet = sourceSet.takeIf { isExpect }, extra = PropertyContainer.withAll(descriptor.additionalExtras(), descriptor.getAnnotations()) ) } @@ -202,14 +207,15 @@ private class DokkaDescriptorVisitor( return DAnnotation( dri = driWithPlatform.dri, name = descriptor.name.asString(), - documentation = descriptor.resolveDescriptorData(platformData), + documentation = descriptor.resolveDescriptorData(), classlikes = scope.classlikes(driWithPlatform), functions = scope.functions(driWithPlatform), properties = scope.properties(driWithPlatform), - platformData = listOf(platformData), + expectPresentInSet = null, + sourceSets = listOf(sourceSet), extra = PropertyContainer.withAll(descriptor.additionalExtras(), descriptor.getAnnotations()), companion = descriptor.companionObjectDescriptor?.let { objectDescriptor(it, driWithPlatform) }, - visibility = PlatformDependent(mapOf(platformData to descriptor.visibility.toDokkaVisibility())), + visibility = descriptor.visibility.toDokkaVisibility().toSourceSetDependent(), constructors = descriptor.constructors.map { visitConstructorDescriptor(it, driWithPlatform) }, sources = descriptor.createSources() ) @@ -219,7 +225,7 @@ private class DokkaDescriptorVisitor( val driWithPlatform = parent.dri.withClass(descriptor.name.asString()).withEmptyInfo() val scope = descriptor.unsubstitutedMemberScope val isExpect = descriptor.isExpect - val info = descriptor.resolveClassDescriptionData(if (!isExpect) platformData else null) + val info = descriptor.resolveClassDescriptionData() val actual = descriptor.createSources() return DClass( @@ -229,23 +235,21 @@ private class DokkaDescriptorVisitor( visitConstructorDescriptor( it, if (it.isPrimary) DRIWithPlatformInfo(driWithPlatform.dri, actual) - else DRIWithPlatformInfo(driWithPlatform.dri, PlatformDependent.empty()) + else DRIWithPlatformInfo(driWithPlatform.dri, emptyMap()) ) }, functions = scope.functions(driWithPlatform), properties = scope.properties(driWithPlatform), classlikes = scope.classlikes(driWithPlatform), sources = actual, - visibility = if (isExpect) PlatformDependent.expectFrom(descriptor.visibility.toDokkaVisibility()) - else PlatformDependent.from(platformData, descriptor.visibility.toDokkaVisibility()), - supertypes = if (isExpect) PlatformDependent.expectFrom(info.supertypes) - else PlatformDependent.from(platformData, info.supertypes), + expectPresentInSet = sourceSet.takeIf { isExpect }, + visibility = descriptor.visibility.toDokkaVisibility().toSourceSetDependent(), + supertypes = info.supertypes.toSourceSetDependent(), generics = descriptor.typeConstructor.parameters.map { it.toTypeParameter() }, documentation = info.docs, - modifier = if (isExpect) PlatformDependent.expectFrom(descriptor.modifier()) - else PlatformDependent.from(platformData, descriptor.modifier()), + modifier = descriptor.modifier().toSourceSetDependent(), companion = descriptor.companion(driWithPlatform), - platformData = listOf(platformData), + sourceSets = listOf(sourceSet), extra = PropertyContainer.withAll(descriptor.additionalExtras(), descriptor.getAnnotations()) ) } @@ -268,13 +272,12 @@ private class DokkaDescriptorVisitor( setter = descriptor.accessors.filterIsInstance<PropertySetterDescriptor>().singleOrNull()?.let { visitPropertyAccessorDescriptor(it, descriptor, dri) }, - visibility = if (isExpect) PlatformDependent.expectFrom(descriptor.visibility.toDokkaVisibility()) - else PlatformDependent.from(platformData, descriptor.visibility.toDokkaVisibility()), - documentation = descriptor.resolveDescriptorData(if (!isExpect) platformData else null), - modifier = if (isExpect) PlatformDependent.expectFrom(descriptor.modifier()) - else PlatformDependent.from(platformData, descriptor.modifier()), + visibility = descriptor.visibility.toDokkaVisibility().toSourceSetDependent(), + documentation = descriptor.resolveDescriptorData(), + modifier = descriptor.modifier().toSourceSetDependent(), type = descriptor.returnType!!.toBound(), - platformData = listOf(platformData), + expectPresentInSet = sourceSet.takeIf { isExpect }, + sourceSets = listOf(sourceSet), generics = descriptor.typeParameters.map { it.toTypeParameter() }, extra = PropertyContainer.withAll(descriptor.additionalExtras(), descriptor.getAnnotations()) ) @@ -301,15 +304,14 @@ private class DokkaDescriptorVisitor( parameters = descriptor.valueParameters.mapIndexed { index, desc -> parameter(index, desc, DRIWithPlatformInfo(dri, actual)) }, + expectPresentInSet = sourceSet.takeIf { isExpect }, sources = actual, - visibility = if (isExpect) PlatformDependent.expectFrom(descriptor.visibility.toDokkaVisibility()) - else PlatformDependent.from(platformData, descriptor.visibility.toDokkaVisibility()), + visibility = descriptor.visibility.toDokkaVisibility().toSourceSetDependent(), generics = descriptor.typeParameters.map { it.toTypeParameter() }, - documentation = descriptor.resolveDescriptorData(if (!isExpect) platformData else null), - modifier = if (isExpect) PlatformDependent.expectFrom(descriptor.modifier()) - else PlatformDependent.from(platformData, descriptor.modifier()), + documentation = descriptor.resolveDescriptorData(), + modifier = descriptor.modifier().toSourceSetDependent(), type = descriptor.returnType!!.toBound(), - platformData = listOf(platformData), + sourceSets = listOf(sourceSet), extra = PropertyContainer.withAll( InheritedFunction(isInherited), descriptor.additionalExtras(), descriptor.getAnnotations() @@ -333,41 +335,27 @@ private class DokkaDescriptorVisitor( parameter(index, desc, DRIWithPlatformInfo(dri, actual)) }, sources = actual, - visibility = if (isExpect) PlatformDependent.expectFrom(descriptor.visibility.toDokkaVisibility()) - else PlatformDependent.from(platformData, descriptor.visibility.toDokkaVisibility()), - documentation = descriptor.resolveDescriptorData(if (!isExpect) platformData else null).let { + expectPresentInSet = sourceSet.takeIf { isExpect }, + visibility = descriptor.visibility.toDokkaVisibility().toSourceSetDependent(), + documentation = descriptor.resolveDescriptorData().let { sourceSetDependent -> if (descriptor.isPrimary) { - it.copy( - map = PlatformDependent.from(it.map.map { - Pair( - it.key, - it.value.copy(children = (it.value.children.find { it is Constructor }?.root?.let { constructor -> - listOf( - Description(constructor) - ) - } ?: emptyList<TagWrapper>()) + it.value.children.filterIsInstance<Param>()) - ) - }), - expect = it.expect?.copy(children = (it.expect?.children?.find { it is Constructor }?.root?.let { constructor -> - listOf( - Description(constructor) - ) - } ?: emptyList<TagWrapper>()) + it.expect!!.children.filterIsInstance<Param>()) - ) + sourceSetDependent.map { entry -> + Pair(entry.key, entry.value.copy(children = (entry.value.children.find { it is Constructor }?.root?.let { constructor -> + listOf( Description(constructor) ) + } ?: emptyList<TagWrapper>()) + entry.value.children.filterIsInstance<Param>())) + }.toMap() } else { - it + sourceSetDependent } }, type = descriptor.returnType.toBound(), - modifier = if (isExpect) PlatformDependent.expectFrom(descriptor.modifier()) - else PlatformDependent.from(platformData, descriptor.modifier()), + modifier = descriptor.modifier().toSourceSetDependent(), generics = descriptor.typeParameters.map { it.toTypeParameter() }, - platformData = listOf(platformData), + sourceSets = listOf(sourceSet), extra = PropertyContainer.withAll<DFunction>(descriptor.additionalExtras(), descriptor.getAnnotations()) .let { - if (descriptor.isPrimary) { - it + PrimaryConstructorExtra - } else it + if(descriptor.isPrimary) { it + PrimaryConstructorExtra } + else it } ) } @@ -379,8 +367,9 @@ private class DokkaDescriptorVisitor( dri = parent.dri.copy(target = 0), name = null, type = descriptor.type.toBound(), - documentation = descriptor.resolveDescriptorData(platformData), - platformData = listOf(platformData) + expectPresentInSet = null, + documentation = descriptor.resolveDescriptorData(), + sourceSets = listOf(sourceSet) ) private fun visitPropertyAccessorDescriptor( @@ -397,8 +386,9 @@ private class DokkaDescriptorVisitor( parent.copy(target = 1), this.name.asString(), type = this.type.toBound(), - documentation = descriptor.resolveDescriptorData(if (!isExpect) platformData else null), - platformData = listOf(platformData), + expectPresentInSet = sourceSet.takeIf { isExpect }, + documentation = descriptor.resolveDescriptorData(), + sourceSets = listOf(sourceSet), extra = PropertyContainer.withAll(descriptor.additionalExtras(), descriptor.getAnnotations()) ) @@ -420,13 +410,12 @@ private class DokkaDescriptorVisitor( name, isConstructor = false, parameters = parameters, - visibility = if (isExpect) PlatformDependent.expectFrom(descriptor.visibility.toDokkaVisibility()) - else PlatformDependent.from(platformData, descriptor.visibility.toDokkaVisibility()), - documentation = descriptor.resolveDescriptorData(if (!isExpect) platformData else null), + visibility = descriptor.visibility.toDokkaVisibility().toSourceSetDependent(), + documentation = descriptor.resolveDescriptorData(), type = descriptor.returnType!!.toBound(), generics = descriptor.typeParameters.map { it.toTypeParameter() }, - modifier = if (isExpect) PlatformDependent.expectFrom(descriptor.modifier()) - else PlatformDependent.from(platformData, descriptor.modifier()), + modifier = descriptor.modifier().toSourceSetDependent(), + expectPresentInSet = sourceSet.takeIf { isExpect }, receiver = descriptor.extensionReceiverParameter?.let { visitReceiverParameterDescriptor( it, @@ -434,7 +423,7 @@ private class DokkaDescriptorVisitor( ) }, sources = descriptor.createSources(), - platformData = listOf(platformData), + sourceSets = listOf(sourceSet), extra = PropertyContainer.withAll(descriptor.additionalExtras(), descriptor.getAnnotations()) ) } @@ -445,11 +434,11 @@ private class DokkaDescriptorVisitor( dri = DRI.from(this), name = name.asString(), type = defaultType.toBound(), - underlyingType = PlatformDependent.from(platformData, underlyingType.toBound()), - visibility = if (isExpect) PlatformDependent.expectFrom(visibility.toDokkaVisibility()) - else PlatformDependent.from(platformData, visibility.toDokkaVisibility()), - documentation = resolveDescriptorData(platformData), - platformData = listOf(platformData) + expectPresentInSet = null, + underlyingType = underlyingType.toBound().toSourceSetDependent(), + visibility = visibility.toDokkaVisibility().toSourceSetDependent(), + documentation = resolveDescriptorData(), + sourceSets = listOf(sourceSet) ) } @@ -458,8 +447,9 @@ private class DokkaDescriptorVisitor( dri = parent.dri.copy(target = index + 1), name = descriptor.name.asString(), type = descriptor.type.toBound(), - documentation = descriptor.resolveDescriptorData(platformData), - platformData = listOf(platformData), + expectPresentInSet = null, + documentation = descriptor.resolveDescriptorData(), + sourceSets = listOf(sourceSet), extra = PropertyContainer.withAll( listOfNotNull( descriptor.additionalExtras(), @@ -468,18 +458,23 @@ private class DokkaDescriptorVisitor( ) ) - private fun MemberScope.functions(parent: DRIWithPlatformInfo): List<DFunction> = - getContributedDescriptors(DescriptorKindFilter.FUNCTIONS) { true } + private fun MemberScope.getContributedDescriptors(kindFilter: DescriptorKindFilter, shouldFilter: Boolean) = + getContributedDescriptors(kindFilter) { true }.let { + if (shouldFilter) it.filterDescriptorsInSourceSet() else it + } + + private fun MemberScope.functions(parent: DRIWithPlatformInfo, packageLevel: Boolean = false): List<DFunction> = + getContributedDescriptors(DescriptorKindFilter.FUNCTIONS, packageLevel) .filterIsInstance<FunctionDescriptor>() .map { visitFunctionDescriptor(it, parent) } - private fun MemberScope.properties(parent: DRIWithPlatformInfo): List<DProperty> = - getContributedDescriptors(DescriptorKindFilter.VALUES) { true } + private fun MemberScope.properties(parent: DRIWithPlatformInfo, packageLevel: Boolean = false): List<DProperty> = + getContributedDescriptors(DescriptorKindFilter.VALUES, packageLevel) .filterIsInstance<PropertyDescriptor>() .map { visitPropertyDescriptor(it, parent) } - private fun MemberScope.classlikes(parent: DRIWithPlatformInfo): List<DClasslike> = - getContributedDescriptors(DescriptorKindFilter.CLASSIFIERS) { true } + private fun MemberScope.classlikes(parent: DRIWithPlatformInfo, packageLevel: Boolean = false): List<DClasslike> = + getContributedDescriptors(DescriptorKindFilter.CLASSIFIERS, packageLevel) .filter { it is ClassDescriptor && it.kind != ClassKind.ENUM_ENTRY } .map { visitClassDescriptor(it as ClassDescriptor, parent) } .mapNotNull { it as? DClasslike } @@ -489,8 +484,8 @@ private class DokkaDescriptorVisitor( .filterIsInstance<PackageFragmentDescriptor>() .map { visitPackageFragmentDescriptor(it, parent) } - private fun MemberScope.typealiases(parent: DRIWithPlatformInfo): List<DTypeAlias> = - getContributedDescriptors(DescriptorKindFilter.TYPE_ALIASES) { true } + private fun MemberScope.typealiases(parent: DRIWithPlatformInfo, packageLevel: Boolean = false): List<DTypeAlias> = + getContributedDescriptors(DescriptorKindFilter.TYPE_ALIASES, packageLevel) .filterIsInstance<TypeAliasDescriptor>() .map { visitTypeAliasDescriptor(it, parent) } @@ -500,19 +495,14 @@ private class DokkaDescriptorVisitor( .filter { it.kind == ClassKind.ENUM_ENTRY } .map { enumEntryDescriptor(it, parent) } - private fun DeclarationDescriptor.resolveDescriptorData(platformData: PlatformData?): PlatformDependent<DocumentationNode> = getDocumentation().let { - if (it.children.isEmpty()) - PlatformDependent.empty() - else if (platformData != null) - PlatformDependent.from(platformData, it) - else - PlatformDependent.expectFrom(it) - } - private fun ClassDescriptor.resolveClassDescriptionData(platformData: PlatformData?): ClassInfo { + private fun DeclarationDescriptor.resolveDescriptorData(): SourceSetDependent<DocumentationNode> = + getDocumentation()?.toSourceSetDependent() ?: emptyMap() + + private fun ClassDescriptor.resolveClassDescriptionData(): ClassInfo { return ClassInfo( (getSuperInterfaces() + getAllSuperclassesWithoutAny()).map { DRI.from(it) }, - resolveDescriptorData(platformData) + resolveDescriptorData() ) } @@ -520,9 +510,10 @@ private class DokkaDescriptorVisitor( DTypeParameter( DRI.from(this), name.identifier, - PlatformDependent.from(platformData, getDocumentation()), + resolveDescriptorData(), + null, upperBounds.map { it.toBound() }, - listOf(platformData), + listOf(sourceSet), extra = PropertyContainer.withAll(additionalExtras()) ) @@ -555,7 +546,7 @@ private class DokkaDescriptorVisitor( private fun DeclarationDescriptor.getDocumentation() = findKDoc().let { MarkdownParser(resolutionFacade, this, logger).parseFromKDocTag(it) - } + }.takeIf { it.children.isNotEmpty() } private fun ClassDescriptor.companion(dri: DRIWithPlatformInfo): DObject? = companionObjectDescriptor?.let { objectDescriptor(it, dri) @@ -569,11 +560,8 @@ private class DokkaDescriptorVisitor( else -> KotlinModifier.Empty } - private fun MemberDescriptor.createSources(): PlatformDependent<DocumentableSource> = if (isExpect()) { - PlatformDependent(emptyMap(), DescriptorDocumentableSource(this)) - } else { - PlatformDependent(mapOf(platformData to DescriptorDocumentableSource(this))) - } + private fun MemberDescriptor.createSources(): SourceSetDependent<DocumentableSource> = + DescriptorDocumentableSource(this).toSourceSetDependent() private fun FunctionDescriptor.additionalExtras() = listOfNotNull( ExtraModifiers.DYNAMIC.takeIf { isDynamic() }, @@ -634,7 +622,7 @@ private class DokkaDescriptorVisitor( private fun ValueParameterDescriptor.getDefaultValue(): String? = (source as? KotlinSourceElement)?.psi?.children?.find { it is KtExpression }?.text - private data class ClassInfo(val supertypes: List<DRI>, val docs: PlatformDependent<DocumentationNode>) + private data class ClassInfo(val supertypes: List<DRI>, val docs: SourceSetDependent<DocumentationNode>) private fun Visibility.toDokkaVisibility(): org.jetbrains.dokka.model.Visibility = when (this) { Visibilities.PUBLIC -> KotlinVisibility.Public diff --git a/plugins/base/src/main/kotlin/translators/documentables/DefaultPageCreator.kt b/plugins/base/src/main/kotlin/translators/documentables/DefaultPageCreator.kt index 439da560..232f6721 100644 --- a/plugins/base/src/main/kotlin/translators/documentables/DefaultPageCreator.kt +++ b/plugins/base/src/main/kotlin/translators/documentables/DefaultPageCreator.kt @@ -14,7 +14,7 @@ import org.jetbrains.kotlin.utils.addToStdlib.safeAs import kotlin.reflect.KClass import kotlin.reflect.full.isSubclassOf -private typealias GroupedTags = Map<KClass<out TagWrapper>, List<Pair<PlatformData?, TagWrapper>>> +private typealias GroupedTags = Map<KClass<out TagWrapper>, List<Pair<SourceSetData?, TagWrapper>>> private val specialTags: Set<KClass<out TagWrapper>> = setOf(Property::class, Description::class, Constructor::class, Receiver::class, Param::class, See::class) @@ -68,8 +68,8 @@ open class DefaultPageCreator( header(1) { text(m.name) } } +contentForComments(m) - block("Packages", 2, ContentKind.Packages, m.packages, m.platformData.toSet()) { - link(it.name, it.dri, kind = ContentKind.Main) + block("Packages", 2, ContentKind.Packages, m.packages, m.sourceSets.toSet()) { + link(it.name, it.dri) } // text("Index\n") TODO // text("Link to allpage here") @@ -80,10 +80,10 @@ open class DefaultPageCreator( header(1) { text("Package ${p.name}") } } +contentForComments(p) - +contentForScope(p, p.dri, p.platformData) - block("Type aliases", 2, ContentKind.TypeAliases, p.typealiases, p.platformData.toSet()) { + +contentForScope(p, p.dri, p.sourceSets) + block("Type aliases", 2, ContentKind.TypeAliases, p.typealiases, p.sourceSets.toSet()) { link(it.name, it.dri, kind = ContentKind.Main) - platformDependentHint(it.dri, it.platformData.toSet(), kind = ContentKind.PlatformDependantHint) { + sourceSetDependentHint(it.dri, it.sourceSets.toSet(), kind = ContentKind.SourceSetDependantHint) { +buildSignature(it) contentForBrief(it) } @@ -93,47 +93,47 @@ open class DefaultPageCreator( protected open fun contentForScope( s: WithScope, dri: DRI, - platformData: List<PlatformData> + sourceSets: List<SourceSetData> ) = contentBuilder.contentFor(s as Documentable) { - block("Types", 2, ContentKind.Classlikes, s.classlikes, platformData.toSet()) { + block("Types", 2, ContentKind.Classlikes, s.classlikes, sourceSets.toSet()) { link(it.name ?: "", it.dri, kind = ContentKind.Main) - platformDependentHint(it.dri, it.platformData.toSet(), kind = ContentKind.PlatformDependantHint) { + sourceSetDependentHint(it.dri, it.sourceSets.toSet(), kind = ContentKind.SourceSetDependantHint) { +buildSignature(it) contentForBrief(it) } } - block("Functions", 2, ContentKind.Functions, s.functions, platformData.toSet()) { + block("Functions", 2, ContentKind.Functions, s.functions, sourceSets.toSet()) { link(it.name, it.dri, kind = ContentKind.Main) - platformDependentHint(it.dri, it.platformData.toSet(), kind = ContentKind.PlatformDependantHint) { + sourceSetDependentHint(it.dri, it.sourceSets.toSet(), kind = ContentKind.SourceSetDependantHint) { +buildSignature(it) contentForBrief(it) } } - block("Properties", 2, ContentKind.Properties, s.properties, platformData.toSet()) { + block("Properties", 2, ContentKind.Properties, s.properties, sourceSets.toSet()) { link(it.name, it.dri, kind = ContentKind.Main) - platformDependentHint(it.dri, it.platformData.toSet(), kind = ContentKind.PlatformDependantHint) { + sourceSetDependentHint(it.dri, it.sourceSets.toSet(), kind = ContentKind.SourceSetDependantHint) { +buildSignature(it) contentForBrief(it) } } s.safeAs<WithExtraProperties<Documentable>>()?.let { it.extra[InheritorsInfo] }?.let { inheritors -> - val map = inheritors.value.map.filter { it.value.isNotEmpty() } + val map = inheritors.value.filter { it.value.isNotEmpty() } if (map.values.any()) { header(2) { text("Inheritors") } +ContentTable( emptyList(), map.entries.flatMap { entry -> entry.value.map { Pair(entry.key, it) } } .groupBy({ it.second }, { it.first }).map { (classlike, platforms) -> - buildGroup(dri, platforms.toSet(), ContentKind.Inheritors) { - link( - classlike.classNames?.substringBeforeLast(".") ?: classlike.toString() - .also { logger.warn("No class name found for DRI $classlike") }, classlike - ) - } - }, + buildGroup(dri, platforms.toSet(), ContentKind.Inheritors) { + link( + classlike.classNames?.substringBeforeLast(".") ?: classlike.toString() + .also { logger.warn("No class name found for DRI $classlike") }, classlike + ) + } + }, DCI(setOf(dri), ContentKind.Inheritors), - platformData.toSet(), + sourceSets.toSet(), style = emptySet() ) } @@ -146,13 +146,13 @@ open class DefaultPageCreator( +buildSignature(e) } +contentForComments(e) - +contentForScope(e, e.dri, e.platformData) + +contentForScope(e, e.dri, e.sourceSets) } protected open fun contentForClasslike(c: DClasslike) = contentBuilder.contentFor(c) { group(kind = ContentKind.Cover) { header(1) { text(c.name.orEmpty()) } - platformDependentHint(c.dri, c.platformData.toSet()) { + sourceSetDependentHint(c.dri, c.sourceSets.toSet()) { +buildSignature(c) } } @@ -164,58 +164,57 @@ open class DefaultPageCreator( 2, ContentKind.Constructors, c.constructors.filter { it.extra[PrimaryConstructorExtra] == null }, - c.platformData.toSet() + c.sourceSets.toSet() ) { link(it.name, it.dri, kind = ContentKind.Main) - platformDependentHint(it.dri, it.platformData.toSet(), kind = ContentKind.PlatformDependantHint) { + sourceSetDependentHint(it.dri, it.sourceSets.toSet(), kind = ContentKind.SourceSetDependantHint) { +buildSignature(it) contentForBrief(it) } } } if (c is DEnum) { - block("Entries", 2, ContentKind.Classlikes, c.entries, c.platformData.toSet()) { + block("Entries", 2, ContentKind.Classlikes, c.entries, c.sourceSets.toSet()) { link(it.name, it.dri, kind = ContentKind.Main) - platformDependentHint(it.dri, it.platformData.toSet(), kind = ContentKind.PlatformDependantHint) { + sourceSetDependentHint(it.dri, it.sourceSets.toSet(), kind = ContentKind.SourceSetDependantHint) { +buildSignature(it) contentForBrief(it) } } } - +contentForScope(c, c.dri, c.platformData) + +contentForScope(c, c.dri, c.sourceSets) } @Suppress("UNCHECKED_CAST") - private inline fun <reified T : TagWrapper> GroupedTags.withTypeUnnamed(): PlatformDependent<T> = - (this[T::class] as List<Pair<PlatformData, T>>?) - ?.let { PlatformDependent.from(it) }.orEmpty() + private inline fun <reified T : TagWrapper> GroupedTags.withTypeUnnamed(): SourceSetDependent<T> = + (this[T::class] as List<Pair<SourceSetData, T>>?)?.toMap().orEmpty() @Suppress("UNCHECKED_CAST") - private inline fun <reified T : NamedTagWrapper> GroupedTags.withTypeNamed(): Map<String, PlatformDependent<T>> = - (this[T::class] as List<Pair<PlatformData, T>>?) + private inline fun <reified T : NamedTagWrapper> GroupedTags.withTypeNamed(): Map<String, SourceSetDependent<T>> = + (this[T::class] as List<Pair<SourceSetData, T>>?) ?.groupBy { it.second.name } - ?.mapValues { (_, v) -> PlatformDependent.from(v) } + ?.mapValues { (_, v) -> v.toMap() } .orEmpty() private inline fun <reified T : TagWrapper> GroupedTags.isNotEmptyForTag(): Boolean = - this[T::class]?.isNotEmpty() ?: false + this[T::class]?.isNotEmpty() ?: false protected open fun contentForComments( d: Documentable ): List<ContentNode> { - val tags: GroupedTags = d.documentation.allEntries.flatMap { (pd, doc) -> - doc.children.asSequence().map { pd to it } + val tags: GroupedTags = d.documentation.flatMap { (pd, doc) -> + doc.children.asSequence().map { pd to it }.toList() }.groupBy { it.second::class } - val platforms = d.platformData + val platforms = d.sourceSets fun DocumentableContentBuilder.contentForDescription() { val description = tags.withTypeUnnamed<Description>() if (description.any { it.value.root.children.isNotEmpty() }) { platforms.forEach { platform -> - description.getOrExpect(platform)?.also { - group(platformData = setOf(platform)) { + description[platform]?.also { + group(sourceSets = setOf(platform)) { comment(it.root) } } @@ -232,16 +231,16 @@ open class DefaultPageCreator( } table(kind = ContentKind.Parameters) { platforms.flatMap { platform -> - val receiverRow = receiver.getOrExpect(platform)?.let { - buildGroup(platformData = setOf(platform), kind = ContentKind.Parameters, styles = mainStyles + ContentStyle.KeyValue) { + val receiverRow = receiver[platform]?.let { + buildGroup(sourceSets = setOf(platform), kind = ContentKind.Parameters, styles = mainStyles + ContentStyle.KeyValue) { text("<receiver>") comment(it.root) } } val paramRows = params.mapNotNull { (_, param) -> - param.getOrExpect(platform)?.let { - buildGroup(platformData = setOf(platform), kind = ContentKind.Parameters, styles = mainStyles + ContentStyle.KeyValue) { + param[platform]?.let { + buildGroup(sourceSets = setOf(platform), kind = ContentKind.Parameters, styles = mainStyles + ContentStyle.KeyValue) { text(it.name, kind = ContentKind.Parameters) comment(it.root) } @@ -263,8 +262,8 @@ open class DefaultPageCreator( table(kind = ContentKind.Sample) { platforms.flatMap { platform -> seeAlsoTags.mapNotNull { (_, see) -> - see.getOrExpect(platform)?.let { - buildGroup(platformData = setOf(platform), kind = ContentKind.Comment, styles = mainStyles + ContentStyle.KeyValue) { + see[platform]?.let { + buildGroup(sourceSets = setOf(platform), kind = ContentKind.Comment, styles = mainStyles + ContentStyle.KeyValue) { if (it.address != null) link(it.name, it.address!!, kind = ContentKind.Comment) else text(it.name, kind = ContentKind.Comment) comment(it.root) @@ -282,7 +281,7 @@ open class DefaultPageCreator( platforms.forEach { platformData -> val content = samples.filter { it.value.isEmpty() || platformData in it.value } if (content.isNotEmpty()) { - group(platformData = setOf(platformData)) { + group(sourceSets = setOf(platformData)) { header(4, kind = ContentKind.Comment) { text("Samples") } content.forEach { comment(Text(it.key)) @@ -294,13 +293,13 @@ open class DefaultPageCreator( } fun DocumentableContentBuilder.contentForUnnamedTags() { - val unnamedTags: List<PlatformDependent<TagWrapper>> = + val unnamedTags: List<SourceSetDependent<TagWrapper>> = tags.filterNot { (k, _) -> k.isSubclassOf(NamedTagWrapper::class) || k in specialTags } - .map { (_, v) -> PlatformDependent.from(v) } + .map { (_, v) -> v.mapNotNull { (k,v) -> k?.let { it to v } }.toMap() } platforms.forEach { platform -> unnamedTags.forEach { pdTag -> - pdTag.getOrExpect(platform)?.also { tag -> - group(platformData = setOf(platform)) { + pdTag[platform]?.also { tag -> + group(sourceSets = setOf(platform)) { header(4) { text(tag.toHeaderString()) } comment(tag.root) } @@ -312,7 +311,7 @@ open class DefaultPageCreator( return contentBuilder.contentFor(d) { if (tags.isNotEmpty()) { header(3) { text("Description") } - platformDependentHint(platformData = platforms.toSet()) { + sourceSetDependentHint(sourceSets = platforms.toSet()) { contentForDescription() contentForSamples() contentForParams() @@ -324,11 +323,11 @@ open class DefaultPageCreator( } protected open fun DocumentableContentBuilder.contentForBrief(content: Documentable) { - content.platformData.forEach { platform -> + content.sourceSets.forEach { platform -> val root = content.documentation[platform]?.children?.firstOrNull()?.root root?.let { - group(platformData = setOf(platform), kind = ContentKind.BriefComment) { + group(sourceSets = setOf(platform), kind = ContentKind.BriefComment) { text(it.docTagSummary(), kind = ContentKind.Comment) } } @@ -338,7 +337,7 @@ open class DefaultPageCreator( protected open fun contentForFunction(f: DFunction) = contentBuilder.contentFor(f) { group(kind = ContentKind.Cover) { header(1) { text(f.name) } - platformDependentHint(f.dri, f.platformData.toSet()) { + sourceSetDependentHint(f.dri, f.sourceSets.toSet()) { +buildSignature(f) } } diff --git a/plugins/base/src/main/kotlin/translators/documentables/PageContentBuilder.kt b/plugins/base/src/main/kotlin/translators/documentables/PageContentBuilder.kt index 6cb47b7f..3ed19afa 100644 --- a/plugins/base/src/main/kotlin/translators/documentables/PageContentBuilder.kt +++ b/plugins/base/src/main/kotlin/translators/documentables/PageContentBuilder.kt @@ -19,46 +19,46 @@ open class PageContentBuilder( ) { fun contentFor( dri: DRI, - platformData: Set<PlatformData>, + sourceSets: Set<SourceSetData>, kind: Kind = ContentKind.Main, styles: Set<Style> = emptySet(), extra: PropertyContainer<ContentNode> = PropertyContainer.empty(), block: DocumentableContentBuilder.() -> Unit ): ContentGroup = - DocumentableContentBuilder(dri, platformData, styles, extra) + DocumentableContentBuilder(dri, sourceSets, styles, extra) .apply(block) - .build(platformData, kind, styles, extra) + .build(sourceSets, kind, styles, extra) fun contentFor( d: Documentable, kind: Kind = ContentKind.Main, styles: Set<Style> = emptySet(), extra: PropertyContainer<ContentNode> = PropertyContainer.empty(), - platformData: Set<PlatformData> = d.platformData.toSet(), + sourceSets: Set<SourceSetData> = d.sourceSets.toSet(), block: DocumentableContentBuilder.() -> Unit = {} ): ContentGroup = - DocumentableContentBuilder(d.dri, platformData, styles, extra) + DocumentableContentBuilder(d.dri, sourceSets, styles, extra) .apply(block) - .build(platformData, kind, styles, extra) + .build(sourceSets, kind, styles, extra) @ContentBuilderMarker open inner class DocumentableContentBuilder( val mainDRI: DRI, - val mainPlatformData: Set<PlatformData>, + val mainPlatformData: Set<SourceSetData>, val mainStyles: Set<Style>, val mainExtra: PropertyContainer<ContentNode> ) { protected val contents = mutableListOf<ContentNode>() fun build( - platformData: Set<PlatformData>, + sourceSets: Set<SourceSetData>, kind: Kind, styles: Set<Style>, extra: PropertyContainer<ContentNode> ) = ContentGroup( contents.toList(), DCI(setOf(mainDRI), kind), - platformData, + sourceSets, styles, extra ) @@ -74,7 +74,7 @@ open class PageContentBuilder( fun header( level: Int, kind: Kind = ContentKind.Main, - platformData: Set<PlatformData> = mainPlatformData, + platformData: Set<SourceSetData> = mainPlatformData, styles: Set<Style> = mainStyles, extra: PropertyContainer<ContentNode> = mainExtra, block: DocumentableContentBuilder.() -> Unit @@ -88,11 +88,11 @@ open class PageContentBuilder( fun text( text: String, kind: Kind = ContentKind.Main, - platformData: Set<PlatformData> = mainPlatformData, + sourceSets: Set<SourceSetData> = mainPlatformData, styles: Set<Style> = mainStyles, extra: PropertyContainer<ContentNode> = mainExtra ) { - contents += createText(text, kind, platformData, styles, extra) + contents += createText(text, kind, sourceSets, styles, extra) } fun buildSignature(d: Documentable) = signatureProvider.signature(d) @@ -100,26 +100,26 @@ open class PageContentBuilder( fun linkTable( elements: List<DRI>, kind: Kind = ContentKind.Main, - platformData: Set<PlatformData> = mainPlatformData, + sourceSets: Set<SourceSetData> = mainPlatformData, styles: Set<Style> = mainStyles, extra: PropertyContainer<ContentNode> = mainExtra ) { contents += ContentTable( emptyList(), elements.map { - contentFor(it, platformData, kind, styles, extra) { + contentFor(it, sourceSets, kind, styles, extra) { link(it.classNames ?: "", it) } }, DCI(setOf(mainDRI), kind), - platformData, styles, extra + sourceSets, styles, extra ) } fun table( dri: DRI = mainDRI, kind: Kind = ContentKind.Main, - platformData: Set<PlatformData> = mainPlatformData, + sourceSets: Set<SourceSetData> = mainPlatformData, styles: Set<Style> = mainStyles, extra: PropertyContainer<ContentNode> = mainExtra, operation: DocumentableContentBuilder.() -> List<ContentGroup> @@ -128,7 +128,7 @@ open class PageContentBuilder( emptyList(), operation(), DCI(setOf(mainDRI), kind), - platformData, styles, extra + sourceSets, styles, extra ) } @@ -137,7 +137,7 @@ open class PageContentBuilder( level: Int, kind: Kind = ContentKind.Main, elements: Iterable<T>, - platformData: Set<PlatformData> = mainPlatformData, + sourceSets: Set<SourceSetData> = mainPlatformData, styles: Set<Style> = mainStyles, extra: PropertyContainer<ContentNode> = mainExtra, renderWhenEmpty: Boolean = false, @@ -148,12 +148,12 @@ open class PageContentBuilder( contents += ContentTable( emptyList(), elements.map { - buildGroup(it.dri, it.platformData.toSet(), kind, styles, extra) { + buildGroup(it.dri, it.sourceSets.toSet(), kind, styles, extra) { operation(it) } }, DCI(setOf(mainDRI), kind), - platformData, styles, extra + sourceSets, styles, extra ) } } @@ -163,17 +163,17 @@ open class PageContentBuilder( prefix: String = "", suffix: String = "", separator: String = ", ", - platformData: Set<PlatformData> = mainPlatformData, // TODO: children should be aware of this platform data + sourceSets: Set<SourceSetData> = mainPlatformData, // TODO: children should be aware of this platform data operation: DocumentableContentBuilder.(T) -> Unit ) { if (elements.isNotEmpty()) { - if (prefix.isNotEmpty()) text(prefix, platformData = platformData) + if (prefix.isNotEmpty()) text(prefix, sourceSets = sourceSets) elements.dropLast(1).forEach { operation(it) - text(separator, platformData = platformData) + text(separator, sourceSets = sourceSets) } operation(elements.last()) - if (suffix.isNotEmpty()) text(suffix, platformData = platformData) + if (suffix.isNotEmpty()) text(suffix, sourceSets = sourceSets) } } @@ -181,15 +181,15 @@ open class PageContentBuilder( text: String, address: DRI, kind: Kind = ContentKind.Main, - platformData: Set<PlatformData> = mainPlatformData, + sourceSets: Set<SourceSetData> = mainPlatformData, styles: Set<Style> = mainStyles, extra: PropertyContainer<ContentNode> = mainExtra ) { contents += ContentDRILink( - listOf(createText(text, kind, platformData, styles, extra)), + listOf(createText(text, kind, sourceSets, styles, extra)), address, DCI(setOf(mainDRI), kind), - platformData + sourceSets ) } @@ -197,99 +197,99 @@ open class PageContentBuilder( text: String, address: String, kind: Kind = ContentKind.Main, - platformData: Set<PlatformData> = mainPlatformData, + sourceSets: Set<SourceSetData> = mainPlatformData, styles: Set<Style> = mainStyles, extra: PropertyContainer<ContentNode> = mainExtra ) = ContentResolvedLink( - children = listOf(createText(text, kind, platformData, styles, extra)), + children = listOf(createText(text, kind, sourceSets, styles, extra)), address = address, extra = PropertyContainer.empty(), dci = DCI(setOf(mainDRI), kind), - platforms = platformData, + sourceSets = sourceSets, style = emptySet() ) fun link( address: DRI, kind: Kind = ContentKind.Main, - platformData: Set<PlatformData> = mainPlatformData, + sourceSets: Set<SourceSetData> = mainPlatformData, styles: Set<Style> = mainStyles, extra: PropertyContainer<ContentNode> = mainExtra, block: DocumentableContentBuilder.() -> Unit ) { contents += ContentDRILink( - contentFor(mainDRI, platformData, kind, styles, extra, block).children, + contentFor(mainDRI, sourceSets, kind, styles, extra, block).children, address, DCI(setOf(mainDRI), kind), - platformData + sourceSets ) } fun comment( docTag: DocTag, kind: Kind = ContentKind.Comment, - platformData: Set<PlatformData> = mainPlatformData, + sourceSets: Set<SourceSetData> = mainPlatformData, styles: Set<Style> = mainStyles, extra: PropertyContainer<ContentNode> = mainExtra ) { val content = commentsConverter.buildContent( docTag, DCI(setOf(mainDRI), kind), - platformData + sourceSets ) - contents += ContentGroup(content, DCI(setOf(mainDRI), kind), platformData, styles, extra) + contents += ContentGroup(content, DCI(setOf(mainDRI), kind), sourceSets, styles, extra) } fun group( dri: DRI = mainDRI, - platformData: Set<PlatformData> = mainPlatformData, + sourceSets: Set<SourceSetData> = mainPlatformData, kind: Kind = ContentKind.Main, styles: Set<Style> = mainStyles, extra: PropertyContainer<ContentNode> = mainExtra, block: DocumentableContentBuilder.() -> Unit ) { - contents += buildGroup(dri, platformData, kind, styles, extra, block) + contents += buildGroup(dri, sourceSets, kind, styles, extra, block) } fun buildGroup( dri: DRI = mainDRI, - platformData: Set<PlatformData> = mainPlatformData, + sourceSets: Set<SourceSetData> = mainPlatformData, kind: Kind = ContentKind.Main, styles: Set<Style> = mainStyles, extra: PropertyContainer<ContentNode> = mainExtra, block: DocumentableContentBuilder.() -> Unit - ): ContentGroup = contentFor(dri, platformData, kind, styles, extra, block) + ): ContentGroup = contentFor(dri, sourceSets, kind, styles, extra, block) - fun platformDependentHint( + fun sourceSetDependentHint( dri: DRI = mainDRI, - platformData: Set<PlatformData> = mainPlatformData, + sourceSets: Set<SourceSetData> = mainPlatformData, kind: Kind = ContentKind.Main, styles: Set<Style> = mainStyles, extra: PropertyContainer<ContentNode> = mainExtra, block: DocumentableContentBuilder.() -> Unit ) { contents += PlatformHintedContent( - buildGroup(dri, platformData, kind, styles, extra, block), - platformData + buildGroup(dri, sourceSets, kind, styles, extra, block), + sourceSets ) } protected fun createText( text: String, kind: Kind, - platformData: Set<PlatformData>, + sourceSets: Set<SourceSetData>, styles: Set<Style>, extra: PropertyContainer<ContentNode> ) = - ContentText(text, DCI(setOf(mainDRI), kind), platformData, styles, extra) + ContentText(text, DCI(setOf(mainDRI), kind), sourceSets, styles, extra) fun <T> platformText( - value: PlatformDependent<T>, - platforms: Set<PlatformData> = value.keys, + value: SourceSetDependent<T>, + platforms: Set<SourceSetData> = value.keys, transform: (T) -> String ) = value.entries.filter { it.key in platforms }.forEach { (p, v) -> - transform(v).takeIf { it.isNotBlank() }?.also { text(it, platformData = setOf(p)) } + transform(v).takeIf { it.isNotBlank() }?.also { text(it, sourceSets = setOf(p)) } } } }
\ No newline at end of file diff --git a/plugins/base/src/main/kotlin/translators/psi/DefaultPsiToDocumentableTranslator.kt b/plugins/base/src/main/kotlin/translators/psi/DefaultPsiToDocumentableTranslator.kt index e5fa4bfc..ca8055c8 100644 --- a/plugins/base/src/main/kotlin/translators/psi/DefaultPsiToDocumentableTranslator.kt +++ b/plugins/base/src/main/kotlin/translators/psi/DefaultPsiToDocumentableTranslator.kt @@ -9,7 +9,6 @@ import org.jetbrains.dokka.links.DRI import org.jetbrains.dokka.links.withClass import org.jetbrains.dokka.model.* import org.jetbrains.dokka.model.properties.PropertyContainer -import org.jetbrains.dokka.pages.PlatformData import org.jetbrains.dokka.plugability.DokkaContext import org.jetbrains.dokka.transformers.sources.SourceToDocumentableTranslator import org.jetbrains.dokka.utilities.DokkaLogger @@ -23,16 +22,21 @@ import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.psi.psiUtil.getChildOfType import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.utils.addToStdlib.safeAs +import java.io.File object DefaultPsiToDocumentableTranslator : SourceToDocumentableTranslator { - override fun invoke(platformData: PlatformData, context: DokkaContext): DModule { + override fun invoke(sourceSetData: SourceSetData, context: DokkaContext): DModule { - val (environment, _) = context.platforms.getValue(platformData) + fun isFileInSourceRoots(file: File) : Boolean { + return sourceSetData.sourceRoots.any { root -> file.path.startsWith(File(root.path).absolutePath) } + } + + val (environment, _) = context.platforms.getValue(sourceSetData) val sourceRoots = environment.configuration.get(CLIConfigurationKeys.CONTENT_ROOTS) ?.filterIsInstance<JavaSourceRoot>() - ?.map { it.file } + ?.mapNotNull { it.file.takeIf(::isFileInSourceRoots) } ?: listOf() val localFileSystem = VirtualFileManager.getInstance().getFileSystem("file") @@ -46,11 +50,11 @@ object DefaultPsiToDocumentableTranslator : SourceToDocumentableTranslator { val docParser = DokkaPsiParser( - platformData, + sourceSetData, context.logger ) return DModule( - platformData.name, + sourceSetData.moduleName, psiFiles.mapNotNull { it.safeAs<PsiJavaFile>() }.groupBy { it.packageName }.map { (packageName, psiFiles) -> val dri = DRI(packageName = packageName) DPackage( @@ -61,17 +65,19 @@ object DefaultPsiToDocumentableTranslator : SourceToDocumentableTranslator { psiFile.classes.map { docParser.parseClasslike(it, dri) } }, emptyList(), - PlatformDependent.empty(), - listOf(platformData) + emptyMap(), + null, + listOf(sourceSetData) ) }, - PlatformDependent.empty(), - listOf(platformData) + emptyMap(), + null, + listOf(sourceSetData) ) } class DokkaPsiParser( - private val platformData: PlatformData, + private val sourceSetData: SourceSetData, private val logger: DokkaLogger ) { @@ -104,7 +110,7 @@ object DefaultPsiToDocumentableTranslator : SourceToDocumentableTranslator { } private fun <T> T.toPlatformDependant() = - PlatformDependent(mapOf(platformData to this)) + mapOf(sourceSetData to this) fun parseClasslike(psi: PsiClass, parent: DRI): DClasslike = with(psi) { val dri = parent.withClass(name.toString()) @@ -145,6 +151,7 @@ object DefaultPsiToDocumentableTranslator : SourceToDocumentableTranslator { name.orEmpty(), dri, documentation, + null, source, allFunctions, fields.mapNotNull { parseField(it, accessors[it].orEmpty()) }, @@ -152,7 +159,7 @@ object DefaultPsiToDocumentableTranslator : SourceToDocumentableTranslator { visibility, null, constructors.map { parseFunction(it, true) }, - listOf(platformData), + listOf(sourceSetData), PropertyContainer.empty<DAnnotation>() + annotations.toList().toExtra() ) isEnum -> DEnum( @@ -163,14 +170,16 @@ object DefaultPsiToDocumentableTranslator : SourceToDocumentableTranslator { dri.withClass("$name.${entry.name}"), entry.name.orEmpty(), javadocParser.parseDocumentation(entry).toPlatformDependant(), + null, emptyList(), emptyList(), emptyList(), - listOf(platformData), + listOf(sourceSetData), PropertyContainer.empty<DEnumEntry>() + entry.annotations.toList().toExtra() ) }, documentation, + null, source, allFunctions, fields.filter { it !is PsiEnumConstant }.map { parseField(it, accessors[it].orEmpty()) }, @@ -179,13 +188,14 @@ object DefaultPsiToDocumentableTranslator : SourceToDocumentableTranslator { null, constructors.map { parseFunction(it, true) }, ancestors, - listOf(platformData), + listOf(sourceSetData), PropertyContainer.empty<DEnum>() + annotations.toList().toExtra() ) isInterface -> DInterface( dri, name.orEmpty(), documentation, + null, source, allFunctions, fields.mapNotNull { parseField(it, accessors[it].orEmpty()) }, @@ -194,7 +204,7 @@ object DefaultPsiToDocumentableTranslator : SourceToDocumentableTranslator { null, mapTypeParameters(dri), ancestors, - listOf(platformData), + listOf(sourceSetData), PropertyContainer.empty<DInterface>() + annotations.toList().toExtra() ) else -> DClass( @@ -210,8 +220,9 @@ object DefaultPsiToDocumentableTranslator : SourceToDocumentableTranslator { mapTypeParameters(dri), ancestors, documentation, + null, modifiers, - listOf(platformData), + listOf(sourceSetData), PropertyContainer.empty<DClass>() + annotations.toList().toExtra() ) } @@ -232,18 +243,20 @@ object DefaultPsiToDocumentableTranslator : SourceToDocumentableTranslator { dri.copy(target = index + 1), psiParameter.name, javadocParser.parseDocumentation(psiParameter).toPlatformDependant(), + null, getBound(psiParameter.type), - listOf(platformData) + listOf(sourceSetData) ) }, javadocParser.parseDocumentation(psi).toPlatformDependant(), + null, PsiDocumentableSource(psi).toPlatformDependant(), psi.getVisibility().toPlatformDependant(), psi.returnType?.let { getBound(type = it) } ?: Void, psi.mapTypeParameters(dri), null, psi.getModifier().toPlatformDependant(), - listOf(platformData), + listOf(sourceSetData), PropertyContainer.withAll( InheritedFunction(isInherited), psi.annotations.toList().toExtra(), @@ -313,8 +326,9 @@ object DefaultPsiToDocumentableTranslator : SourceToDocumentableTranslator { dri.copy(genericTarget = index), type.name.orEmpty(), javadocParser.parseDocumentation(type).toPlatformDependant(), + null, mapBounds(type.bounds), - listOf(platformData) + listOf(sourceSetData) ) } } @@ -349,6 +363,7 @@ object DefaultPsiToDocumentableTranslator : SourceToDocumentableTranslator { dri, psi.name!!, // TODO: Investigate if this is indeed nullable javadocParser.parseDocumentation(psi).toPlatformDependant(), + null, PsiDocumentableSource(psi).toPlatformDependant(), psi.getVisibility().toPlatformDependant(), getBound(psi.type), @@ -356,7 +371,7 @@ object DefaultPsiToDocumentableTranslator : SourceToDocumentableTranslator { accessors.firstOrNull { it.hasParameters() }?.let { parseFunction(it) }, accessors.firstOrNull { it.returnType == psi.type }?.let { parseFunction(it) }, psi.getModifier().toPlatformDependant(), - listOf(platformData), + listOf(sourceSetData), emptyList(), PropertyContainer.empty<DProperty>() + psi.annotations.toList().toExtra() ) |