diff options
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 } |