aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/src/main/kotlin/model/properties/PropertyContainer.kt3
-rw-r--r--core/src/main/kotlin/pages/ContentNodes.kt110
-rw-r--r--core/src/main/kotlin/pages/ContentSourceSet.kt1
-rw-r--r--core/src/main/kotlin/transformers/pages/PageTransformer.kt12
-rw-r--r--plugins/base/src/main/kotlin/DokkaBase.kt9
-rw-r--r--plugins/base/src/main/kotlin/renderers/html/HtmlRenderer.kt1
-rw-r--r--plugins/base/src/main/kotlin/transformers/pages/merger/SameMethodNamePageMergerStrategy.kt3
-rw-r--r--plugins/base/src/main/kotlin/transformers/pages/merger/SourceSetMergingPageTransformer.kt36
-rw-r--r--plugins/base/src/test/kotlin/content/params/ContentForParamsTest.kt1
-rw-r--r--plugins/base/src/test/kotlin/linkableContent/LinkableContentTest.kt1
-rw-r--r--plugins/base/src/test/kotlin/markdown/LinkTest.kt2
-rw-r--r--plugins/javadoc/src/main/kotlin/org/jetbrains/dokka/javadoc/pages/JavadocContentNodes.kt7
12 files changed, 147 insertions, 39 deletions
diff --git a/core/src/main/kotlin/model/properties/PropertyContainer.kt b/core/src/main/kotlin/model/properties/PropertyContainer.kt
index 6009bfe0..b14a30f5 100644
--- a/core/src/main/kotlin/model/properties/PropertyContainer.kt
+++ b/core/src/main/kotlin/model/properties/PropertyContainer.kt
@@ -26,6 +26,7 @@ class PropertyContainer<C : Any> internal constructor(
operator fun <D: Any> PropertyContainer<D>.plus(prop: ExtraProperty<D>?): PropertyContainer<D> =
if (prop == null) this else PropertyContainer(map + (prop.key to prop))
+
interface WithExtraProperties<C : Any> {
val extra: PropertyContainer<C>
@@ -57,4 +58,4 @@ fun <C> C.mergeExtras(left: C, right: C): C where C : Any, C : WithExtraProperti
val newExtras = PropertyContainer((unambiguous.flatten() + replaces).associateBy { it.key })
return needingFullMerge.fold(withNewExtras(newExtras)) { acc, merger -> merger(acc, left, right) }
-} \ No newline at end of file
+}
diff --git a/core/src/main/kotlin/pages/ContentNodes.kt b/core/src/main/kotlin/pages/ContentNodes.kt
index b82c023f..02d6bf61 100644
--- a/core/src/main/kotlin/pages/ContentNodes.kt
+++ b/core/src/main/kotlin/pages/ContentNodes.kt
@@ -1,8 +1,5 @@
package org.jetbrains.dokka.pages
-import org.jetbrains.dokka.DokkaConfiguration.DokkaSourceSet
-import org.jetbrains.dokka.DokkaSourceSetID
-import org.jetbrains.dokka.Platform
import org.jetbrains.dokka.links.DRI
import org.jetbrains.dokka.model.WithChildren
import org.jetbrains.dokka.model.properties.PropertyContainer
@@ -12,7 +9,6 @@ data class DCI(val dri: Set<DRI>, val kind: Kind) {
override fun toString() = "$dri[$kind]"
}
-
interface ContentNode : WithExtraProperties<ContentNode>, WithChildren<ContentNode> {
val dci: DCI
val sourceSets: Set<ContentSourceSet>
@@ -20,6 +16,8 @@ interface ContentNode : WithExtraProperties<ContentNode>, WithChildren<ContentNo
fun hasAnyContent(): Boolean
+ fun withSourceSets(sourceSets: Set<ContentSourceSet>): ContentNode
+
override val children: List<ContentNode>
get() = emptyList()
}
@@ -32,8 +30,8 @@ data class ContentText(
override val style: Set<Style> = emptySet(),
override val extra: PropertyContainer<ContentNode> = PropertyContainer.empty()
) : ContentNode {
- override fun withNewExtras(newExtras: PropertyContainer<ContentNode>): ContentNode = copy(extra = newExtras)
-
+ override fun withNewExtras(newExtras: PropertyContainer<ContentNode>): ContentText = copy(extra = newExtras)
+ override fun withSourceSets(sourceSets: Set<ContentSourceSet>): ContentText = copy(sourceSets = sourceSets)
override fun hasAnyContent(): Boolean = !text.isBlank()
}
@@ -44,8 +42,8 @@ data class ContentBreakLine(
override val style: Set<Style> = emptySet(),
override val extra: PropertyContainer<ContentNode> = PropertyContainer.empty()
) : ContentNode {
- override fun withNewExtras(newExtras: PropertyContainer<ContentNode>): ContentNode = copy(extra = newExtras)
-
+ override fun withNewExtras(newExtras: PropertyContainer<ContentNode>): ContentBreakLine = copy(extra = newExtras)
+ override fun withSourceSets(sourceSets: Set<ContentSourceSet>): ContentBreakLine = copy(sourceSets = sourceSets)
override fun hasAnyContent(): Boolean = true
}
@@ -61,6 +59,12 @@ data class ContentHeader(
constructor(level: Int, c: ContentComposite) : this(c.children, level, c.dci, c.sourceSets, c.style, c.extra)
override fun withNewExtras(newExtras: PropertyContainer<ContentNode>): ContentHeader = copy(extra = newExtras)
+
+ override fun transformChildren(transformer: (ContentNode) -> ContentNode): ContentHeader =
+ copy(children = children.map(transformer))
+
+ override fun withSourceSets(sourceSets: Set<ContentSourceSet>): ContentHeader =
+ copy(sourceSets = sourceSets)
}
interface ContentCode : ContentComposite
@@ -75,6 +79,13 @@ data class ContentCodeBlock(
override val extra: PropertyContainer<ContentNode> = PropertyContainer.empty()
) : ContentCode {
override fun withNewExtras(newExtras: PropertyContainer<ContentNode>): ContentCodeBlock = copy(extra = newExtras)
+
+ override fun transformChildren(transformer: (ContentNode) -> ContentNode): ContentCodeBlock =
+ copy(children = children.map(transformer))
+
+ override fun withSourceSets(sourceSets: Set<ContentSourceSet>): ContentCodeBlock =
+ copy(sourceSets = sourceSets)
+
}
data class ContentCodeInline(
@@ -86,6 +97,13 @@ data class ContentCodeInline(
override val extra: PropertyContainer<ContentNode> = PropertyContainer.empty()
) : ContentCode {
override fun withNewExtras(newExtras: PropertyContainer<ContentNode>): ContentCodeInline = copy(extra = newExtras)
+
+ override fun transformChildren(transformer: (ContentNode) -> ContentNode): ContentCodeInline =
+ copy(children = children.map(transformer))
+
+ override fun withSourceSets(sourceSets: Set<ContentSourceSet>): ContentCodeInline =
+ copy(sourceSets = sourceSets)
+
}
/** Union type replacement */
@@ -101,6 +119,13 @@ data class ContentDRILink(
override val extra: PropertyContainer<ContentNode> = PropertyContainer.empty()
) : ContentLink {
override fun withNewExtras(newExtras: PropertyContainer<ContentNode>): ContentDRILink = copy(extra = newExtras)
+
+ override fun transformChildren(transformer: (ContentNode) -> ContentNode): ContentDRILink =
+ copy(children = children.map(transformer))
+
+ override fun withSourceSets(sourceSets: Set<ContentSourceSet>): ContentDRILink =
+ copy(sourceSets = sourceSets)
+
}
/** All links that do not need to be resolved */
@@ -114,6 +139,12 @@ data class ContentResolvedLink(
) : ContentLink {
override fun withNewExtras(newExtras: PropertyContainer<ContentNode>): ContentResolvedLink =
copy(extra = newExtras)
+
+ override fun transformChildren(transformer: (ContentNode) -> ContentNode): ContentResolvedLink =
+ copy(children = children.map(transformer))
+
+ override fun withSourceSets(sourceSets: Set<ContentSourceSet>): ContentResolvedLink =
+ copy(sourceSets = sourceSets)
}
/** Embedded resources like images */
@@ -128,12 +159,22 @@ data class ContentEmbeddedResource(
) : ContentLink {
override fun withNewExtras(newExtras: PropertyContainer<ContentNode>): ContentEmbeddedResource =
copy(extra = newExtras)
+
+ override fun transformChildren(transformer: (ContentNode) -> ContentNode): ContentEmbeddedResource =
+ copy(children = children.map(transformer))
+
+ override fun withSourceSets(sourceSets: Set<ContentSourceSet>): ContentEmbeddedResource =
+ copy(sourceSets = sourceSets)
}
/** Logical grouping of [ContentNode]s */
interface ContentComposite : ContentNode {
override val children: List<ContentNode> // overwrite to make it abstract once again
+ override val sourceSets: Set<ContentSourceSet> get() = children.flatMap { it.sourceSets }.toSet()
+
+ fun transformChildren(transformer: (ContentNode) -> ContentNode): ContentComposite
+
override fun hasAnyContent(): Boolean = children.any { it.hasAnyContent() }
}
@@ -147,6 +188,13 @@ data class ContentTable(
override val extra: PropertyContainer<ContentNode> = PropertyContainer.empty()
) : ContentComposite {
override fun withNewExtras(newExtras: PropertyContainer<ContentNode>): ContentTable = copy(extra = newExtras)
+
+ override fun transformChildren(transformer: (ContentNode) -> ContentNode): ContentTable =
+ copy(children = children.map(transformer).filterIsInstance<ContentGroup>())
+
+ override fun withSourceSets(sourceSets: Set<ContentSourceSet>): ContentTable =
+ copy(sourceSets = sourceSets)
+
}
/** Lists */
@@ -159,6 +207,12 @@ data class ContentList(
override val extra: PropertyContainer<ContentNode> = PropertyContainer.empty()
) : ContentComposite {
override fun withNewExtras(newExtras: PropertyContainer<ContentNode>): ContentList = copy(extra = newExtras)
+
+ override fun transformChildren(transformer: (ContentNode) -> ContentNode): ContentList =
+ copy(children = children.map(transformer))
+
+ override fun withSourceSets(sourceSets: Set<ContentSourceSet>): ContentList =
+ copy(sourceSets = sourceSets)
}
/** Default group, eg. for blocks of Functions, Properties, etc. **/
@@ -170,6 +224,12 @@ data class ContentGroup(
override val extra: PropertyContainer<ContentNode> = PropertyContainer.empty()
) : ContentComposite {
override fun withNewExtras(newExtras: PropertyContainer<ContentNode>): ContentGroup = copy(extra = newExtras)
+
+ override fun transformChildren(transformer: (ContentNode) -> ContentNode): ContentGroup =
+ copy(children = children.map(transformer))
+
+ override fun withSourceSets(sourceSets: Set<ContentSourceSet>): ContentGroup =
+ copy(sourceSets = sourceSets)
}
/**
@@ -190,6 +250,12 @@ data class ContentDivergentGroup(
override fun withNewExtras(newExtras: PropertyContainer<ContentNode>): ContentDivergentGroup =
copy(extra = newExtras)
+
+ override fun transformChildren(transformer: (ContentNode) -> ContentNode): ContentDivergentGroup =
+ copy(children = children.map(transformer).filterIsInstance<ContentDivergentInstance>())
+
+ // TODO NOW?
+ override fun withSourceSets(sourceSets: Set<ContentSourceSet>): ContentDivergentGroup = this
}
/** Instance of a divergent content */
@@ -207,6 +273,17 @@ data class ContentDivergentInstance(
override fun withNewExtras(newExtras: PropertyContainer<ContentNode>): ContentDivergentInstance =
copy(extra = newExtras)
+
+ override fun transformChildren(transformer: (ContentNode) -> ContentNode): ContentDivergentInstance =
+ copy(
+ before = before?.let(transformer),
+ divergent = divergent.let(transformer),
+ after = after?.let(transformer)
+ )
+
+ override fun withSourceSets(sourceSets: Set<ContentSourceSet>): ContentDivergentInstance =
+ copy(sourceSets = sourceSets)
+
}
data class PlatformHintedContent(
@@ -226,6 +303,13 @@ data class PlatformHintedContent(
override fun withNewExtras(newExtras: PropertyContainer<ContentNode>) =
throw UnsupportedOperationException("This method should not be called on this PlatformHintedContent")
+
+ override fun transformChildren(transformer: (ContentNode) -> ContentNode): PlatformHintedContent =
+ copy(inner = transformer(inner))
+
+ override fun withSourceSets(sourceSets: Set<ContentSourceSet>): PlatformHintedContent =
+ copy(sourceSets = sourceSets)
+
}
interface Style
@@ -266,14 +350,4 @@ object CommentTable : Style
object MultimoduleTable : Style
-fun ContentNode.dfs(predicate: (ContentNode) -> Boolean): ContentNode? = if (predicate(this)) {
- this
-} else {
- if (this is ContentComposite) {
- this.children.asSequence().mapNotNull { it.dfs(predicate) }.firstOrNull()
- } else {
- null
- }
-}
-
fun ContentNode.hasStyle(style: Style) = this.style.contains(style)
diff --git a/core/src/main/kotlin/pages/ContentSourceSet.kt b/core/src/main/kotlin/pages/ContentSourceSet.kt
index 0ff87edb..f53cdb12 100644
--- a/core/src/main/kotlin/pages/ContentSourceSet.kt
+++ b/core/src/main/kotlin/pages/ContentSourceSet.kt
@@ -26,7 +26,6 @@ data class ContentSourceSet(
}
-//TODO NOW: Test
data class CompositeSourceSetID(
private val children: Set<DokkaSourceSetID>
) {
diff --git a/core/src/main/kotlin/transformers/pages/PageTransformer.kt b/core/src/main/kotlin/transformers/pages/PageTransformer.kt
index 086f6d22..68dc4bc8 100644
--- a/core/src/main/kotlin/transformers/pages/PageTransformer.kt
+++ b/core/src/main/kotlin/transformers/pages/PageTransformer.kt
@@ -1,19 +1,7 @@
package org.jetbrains.dokka.transformers.pages
-import org.jetbrains.dokka.pages.ContentNode
import org.jetbrains.dokka.pages.RootPageNode
interface PageTransformer {
operator fun invoke(input: RootPageNode): RootPageNode
}
-
-object SourceSetMergePageTransformer : PageTransformer {
- override fun invoke(input: RootPageNode): RootPageNode {
-
- return input.transformContentPagesTree { contentPage ->
- val content: ContentNode = contentPage.content
- TODO()
- }
- }
-
-}
diff --git a/plugins/base/src/main/kotlin/DokkaBase.kt b/plugins/base/src/main/kotlin/DokkaBase.kt
index 20769d07..cf268ec1 100644
--- a/plugins/base/src/main/kotlin/DokkaBase.kt
+++ b/plugins/base/src/main/kotlin/DokkaBase.kt
@@ -19,10 +19,7 @@ import org.jetbrains.dokka.base.transformers.documentables.ReportUndocumentedTra
import org.jetbrains.dokka.base.transformers.pages.annotations.SinceKotlinTransformer
import org.jetbrains.dokka.base.transformers.pages.comments.CommentsToContentConverter
import org.jetbrains.dokka.base.transformers.pages.comments.DocTagToContentConverter
-import org.jetbrains.dokka.base.transformers.pages.merger.FallbackPageMergerStrategy
-import org.jetbrains.dokka.base.transformers.pages.merger.PageMerger
-import org.jetbrains.dokka.base.transformers.pages.merger.PageMergerStrategy
-import org.jetbrains.dokka.base.transformers.pages.merger.SameMethodNamePageMergerStrategy
+import org.jetbrains.dokka.base.transformers.pages.merger.*
import org.jetbrains.dokka.base.transformers.pages.samples.DefaultSamplesTransformer
import org.jetbrains.dokka.base.transformers.pages.sourcelinks.SourceLinksTransformer
import org.jetbrains.dokka.base.translators.descriptors.DefaultDescriptorToDocumentableTranslator
@@ -129,6 +126,10 @@ class DokkaBase : DokkaPlugin() {
CoreExtensions.pageTransformer providing { ctx -> PageMerger(ctx[pageMergerStrategy]) }
}
+ val sourceSetMerger by extending {
+ CoreExtensions.pageTransformer providing ::SourceSetMergingPageTransformer
+ }
+
val fallbackMerger by extending {
pageMergerStrategy providing { ctx -> FallbackPageMergerStrategy(ctx.logger) }
}
diff --git a/plugins/base/src/main/kotlin/renderers/html/HtmlRenderer.kt b/plugins/base/src/main/kotlin/renderers/html/HtmlRenderer.kt
index c533836a..8baf70a5 100644
--- a/plugins/base/src/main/kotlin/renderers/html/HtmlRenderer.kt
+++ b/plugins/base/src/main/kotlin/renderers/html/HtmlRenderer.kt
@@ -10,6 +10,7 @@ import org.jetbrains.dokka.base.DokkaBase
import org.jetbrains.dokka.base.renderers.DefaultRenderer
import org.jetbrains.dokka.base.renderers.TabSortingStrategy
import org.jetbrains.dokka.links.DRI
+import org.jetbrains.dokka.model.dfs
import org.jetbrains.dokka.model.properties.PropertyContainer
import org.jetbrains.dokka.model.withDescendants
import org.jetbrains.dokka.pages.*
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 d81f131b..4eacf359 100644
--- a/plugins/base/src/main/kotlin/transformers/pages/merger/SameMethodNamePageMergerStrategy.kt
+++ b/plugins/base/src/main/kotlin/transformers/pages/merger/SameMethodNamePageMergerStrategy.kt
@@ -1,5 +1,6 @@
package org.jetbrains.dokka.base.transformers.pages.merger
+import org.jetbrains.dokka.model.dfs
import org.jetbrains.dokka.pages.*
import org.jetbrains.dokka.utilities.DokkaLogger
@@ -37,4 +38,4 @@ class SameMethodNamePageMergerStrategy(val logger: DokkaLogger) : PageMergerStra
)
}
}
-} \ No newline at end of file
+}
diff --git a/plugins/base/src/main/kotlin/transformers/pages/merger/SourceSetMergingPageTransformer.kt b/plugins/base/src/main/kotlin/transformers/pages/merger/SourceSetMergingPageTransformer.kt
new file mode 100644
index 00000000..aaf4b5c3
--- /dev/null
+++ b/plugins/base/src/main/kotlin/transformers/pages/merger/SourceSetMergingPageTransformer.kt
@@ -0,0 +1,36 @@
+package org.jetbrains.dokka.base.transformers.pages.merger
+
+import org.jetbrains.dokka.Platform
+import org.jetbrains.dokka.pages.*
+import org.jetbrains.dokka.plugability.DokkaContext
+import org.jetbrains.dokka.transformers.pages.PageTransformer
+
+class SourceSetMergingPageTransformer(context: DokkaContext) : PageTransformer {
+
+ private val mergedSourceSets = context.configuration.sourceSets.toContentSourceSets()
+ .associateBy { sourceSet -> sourceSet.key }
+
+ override fun invoke(input: RootPageNode): RootPageNode {
+ return input.transformContentPagesTree { contentPage ->
+ val content: ContentNode = contentPage.content
+ val newContent = transformWithMergedSourceSets(content)
+ contentPage.modified(content = newContent)
+ }
+ }
+
+ private fun transformWithMergedSourceSets(
+ contentNode: ContentNode
+ ): ContentNode {
+ val mergedSourceSets = contentNode.sourceSets.map { mergedSourceSets.getValue(it.key) }.toSet()
+ return when (contentNode) {
+ is ContentComposite -> contentNode
+ .transformChildren(::transformWithMergedSourceSets)
+ .withSourceSets(mergedSourceSets)
+ else -> contentNode.withSourceSets(mergedSourceSets.toSet())
+ }
+ }
+}
+
+private val ContentSourceSet.key get() = SourceSetMergingKey(displayName, analysisPlatform)
+
+private data class SourceSetMergingKey(private val displayName: String, private val platform: Platform)
diff --git a/plugins/base/src/test/kotlin/content/params/ContentForParamsTest.kt b/plugins/base/src/test/kotlin/content/params/ContentForParamsTest.kt
index 4ac5717d..4f2bd8dc 100644
--- a/plugins/base/src/test/kotlin/content/params/ContentForParamsTest.kt
+++ b/plugins/base/src/test/kotlin/content/params/ContentForParamsTest.kt
@@ -9,7 +9,6 @@ import org.jetbrains.dokka.model.doc.Param
import org.jetbrains.dokka.model.doc.Text
import org.jetbrains.dokka.pages.ContentPage
import org.jetbrains.dokka.pages.MemberPageNode
-import org.jetbrains.dokka.pages.dfs
import org.jetbrains.dokka.testApi.testRunner.AbstractCoreTest
import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstanceOrNull
import org.junit.jupiter.api.Test
diff --git a/plugins/base/src/test/kotlin/linkableContent/LinkableContentTest.kt b/plugins/base/src/test/kotlin/linkableContent/LinkableContentTest.kt
index f93678a4..42d10549 100644
--- a/plugins/base/src/test/kotlin/linkableContent/LinkableContentTest.kt
+++ b/plugins/base/src/test/kotlin/linkableContent/LinkableContentTest.kt
@@ -5,6 +5,7 @@ import org.jetbrains.dokka.base.DokkaBase
import org.jetbrains.dokka.base.transformers.pages.samples.DefaultSamplesTransformer
import org.jetbrains.dokka.base.transformers.pages.sourcelinks.SourceLinksTransformer
import org.jetbrains.dokka.base.translators.documentables.PageContentBuilder
+import org.jetbrains.dokka.model.dfs
import org.jetbrains.dokka.pages.*
import org.jetbrains.dokka.plugability.plugin
import org.jetbrains.dokka.testApi.testRunner.AbstractCoreTest
diff --git a/plugins/base/src/test/kotlin/markdown/LinkTest.kt b/plugins/base/src/test/kotlin/markdown/LinkTest.kt
index a6333c5a..32cf01a8 100644
--- a/plugins/base/src/test/kotlin/markdown/LinkTest.kt
+++ b/plugins/base/src/test/kotlin/markdown/LinkTest.kt
@@ -1,9 +1,9 @@
package markdown
+import org.jetbrains.dokka.model.dfs
import org.jetbrains.dokka.pages.ClasslikePageNode
import org.jetbrains.dokka.pages.ContentDRILink
import org.jetbrains.dokka.pages.MemberPageNode
-import org.jetbrains.dokka.pages.dfs
import org.jetbrains.dokka.testApi.testRunner.AbstractCoreTest
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Assertions.assertNotNull
diff --git a/plugins/javadoc/src/main/kotlin/org/jetbrains/dokka/javadoc/pages/JavadocContentNodes.kt b/plugins/javadoc/src/main/kotlin/org/jetbrains/dokka/javadoc/pages/JavadocContentNodes.kt
index 2c9ee013..5816ad3c 100644
--- a/plugins/javadoc/src/main/kotlin/org/jetbrains/dokka/javadoc/pages/JavadocContentNodes.kt
+++ b/plugins/javadoc/src/main/kotlin/org/jetbrains/dokka/javadoc/pages/JavadocContentNodes.kt
@@ -17,6 +17,10 @@ abstract class JavadocContentNode(
override val style: Set<Style> = emptySet()
override val extra: PropertyContainer<ContentNode> = PropertyContainer.empty()
override fun withNewExtras(newExtras: PropertyContainer<ContentNode>): ContentNode = this
+
+ // TODO: Support needed?
+ override fun withSourceSets(sourceSets: Set<ContentSourceSet>): JavadocContentNode = this
+
}
interface JavadocList {
@@ -41,6 +45,9 @@ class EmptyNode(
override fun withNewExtras(newExtras: PropertyContainer<ContentNode>): ContentNode =
EmptyNode(dci.dri.first(), dci.kind, sourceSets, newExtras)
+ override fun withSourceSets(sourceSets: Set<ContentSourceSet>): ContentNode =
+ EmptyNode(dci.dri.first(), dci.kind, sourceSets, extra)
+
override fun hasAnyContent(): Boolean = false
}