aboutsummaryrefslogtreecommitdiff
path: root/plugins/base/src/main
diff options
context:
space:
mode:
authorBłażej Kardyś <bkardys@virtuslab.com>2020-05-05 17:45:12 +0200
committerPaweł Marks <Kordyjan@users.noreply.github.com>2020-05-14 13:30:33 +0200
commit3f2a790190da4f40ea6d8a976aa1929b2a1b002b (patch)
tree752ee84451954e9ea5e6d4133e18e41aaee2f7b1 /plugins/base/src/main
parenta440f0cb8756019131a2c15389e747aea3c585e7 (diff)
downloaddokka-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')
-rw-r--r--plugins/base/src/main/kotlin/DokkaBase.kt6
-rw-r--r--plugins/base/src/main/kotlin/renderers/DefaultRenderer.kt21
-rw-r--r--plugins/base/src/main/kotlin/renderers/html/HtmlRenderer.kt58
-rw-r--r--plugins/base/src/main/kotlin/renderers/html/NavigationPage.kt4
-rw-r--r--plugins/base/src/main/kotlin/resolvers/local/DefaultLocationProvider.kt9
-rw-r--r--plugins/base/src/main/kotlin/resolvers/local/LocationProvider.kt4
-rw-r--r--plugins/base/src/main/kotlin/signatures/KotlinSignatureProvider.kt35
-rw-r--r--plugins/base/src/main/kotlin/transformers/documentables/ActualTypealiasAdder.kt8
-rw-r--r--plugins/base/src/main/kotlin/transformers/documentables/DefaultDocumentableMerger.kt233
-rw-r--r--plugins/base/src/main/kotlin/transformers/documentables/DocumentableVisibilityFilter.kt55
-rw-r--r--plugins/base/src/main/kotlin/transformers/documentables/InheritorsExtractorTransformer.kt23
-rw-r--r--plugins/base/src/main/kotlin/transformers/documentables/ModuleAndPackageDocumentationTransformer.kt42
-rw-r--r--plugins/base/src/main/kotlin/transformers/pages/comments/CommentsToContentConverter.kt3
-rw-r--r--plugins/base/src/main/kotlin/transformers/pages/comments/DocTagToContentConverter.kt33
-rw-r--r--plugins/base/src/main/kotlin/transformers/pages/merger/SameMethodNamePageMergerStrategy.kt2
-rw-r--r--plugins/base/src/main/kotlin/transformers/pages/samples/SamplesTransformer.kt25
-rw-r--r--plugins/base/src/main/kotlin/transformers/pages/sourcelinks/SourceLinksTransformer.kt23
-rw-r--r--plugins/base/src/main/kotlin/translators/descriptors/DefaultDescriptorToDocumentableTranslator.kt252
-rw-r--r--plugins/base/src/main/kotlin/translators/documentables/DefaultPageCreator.kt111
-rw-r--r--plugins/base/src/main/kotlin/translators/documentables/PageContentBuilder.kt98
-rw-r--r--plugins/base/src/main/kotlin/translators/psi/DefaultPsiToDocumentableTranslator.kt57
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