aboutsummaryrefslogtreecommitdiff
path: root/plugins/base/src/main/kotlin
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/base/src/main/kotlin')
-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 + 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()
)