Skip to content

Commit

Permalink
Add filtering stategies extension point and fixed constructors in Kot…
Browse files Browse the repository at this point in the history
…lin-as-Java
  • Loading branch information
BarkingBad authored and kamildoleglo committed Oct 7, 2020
1 parent ec63795 commit 96701ae
Show file tree
Hide file tree
Showing 11 changed files with 139 additions and 23 deletions.
10 changes: 8 additions & 2 deletions plugins/base/src/main/kotlin/DokkaBase.kt
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,9 @@ 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
import org.jetbrains.dokka.base.translators.documentables.DefaultDocumentableFilteringStrategies
import org.jetbrains.dokka.base.translators.documentables.DefaultDocumentableToPageTranslator
import org.jetbrains.dokka.base.translators.documentables.DocumentablesFilteringStrategies
import org.jetbrains.dokka.base.translators.documentables.PageContentBuilder
import org.jetbrains.dokka.base.translators.psi.DefaultPsiToDocumentableTranslator
import org.jetbrains.dokka.plugability.DokkaPlugin
Expand All @@ -39,7 +41,7 @@ class DokkaBase : DokkaPlugin() {
val htmlPreprocessors by extensionPoint<PageTransformer>()
val kotlinAnalysis by extensionPoint<KotlinAnalysis>()
val tabSortingStrategy by extensionPoint<TabSortingStrategy>()

val documentablesFilteringStrategies by extensionPoint<DocumentablesFilteringStrategies>()

val descriptorToDocumentableTranslator by extending {
CoreExtensions.sourceToDocumentableTranslator providing { ctx ->
Expand Down Expand Up @@ -115,7 +117,7 @@ class DokkaBase : DokkaPlugin() {
DefaultDocumentableToPageTranslator(
ctx.single(commentsToContentConverter),
ctx.single(signatureProvider),
ctx.logger
ctx
)
}
}
Expand Down Expand Up @@ -229,4 +231,8 @@ class DokkaBase : DokkaPlugin() {
MultimodulePageCreator(it)
}
}

val defaultDocumentablesFilteringStrategies by extending {
documentablesFilteringStrategies with DefaultDocumentableFilteringStrategies
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package org.jetbrains.dokka.base.translators.documentables

import org.jetbrains.dokka.model.DFunction
import org.jetbrains.dokka.model.PrimaryConstructorExtra

object DefaultDocumentableFilteringStrategies : DocumentablesFilteringStrategies {
override fun shouldConstructorBeInPage(constructor: DFunction): Boolean =
constructor.extra[PrimaryConstructorExtra] == null || constructor.documentation.isNotEmpty()
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,15 @@ import org.jetbrains.dokka.base.signatures.SignatureProvider
import org.jetbrains.dokka.base.transformers.pages.comments.CommentsToContentConverter
import org.jetbrains.dokka.model.DModule
import org.jetbrains.dokka.pages.ModulePageNode
import org.jetbrains.dokka.plugability.DokkaContext
import org.jetbrains.dokka.transformers.documentation.DocumentableToPageTranslator
import org.jetbrains.dokka.utilities.DokkaLogger

class DefaultDocumentableToPageTranslator(
private val commentsToContentConverter: CommentsToContentConverter,
private val signatureProvider: SignatureProvider,
private val logger: DokkaLogger
private val context: DokkaContext
) : DocumentableToPageTranslator {
override fun invoke(module: DModule): ModulePageNode =
DefaultPageCreator(commentsToContentConverter, signatureProvider, logger).pageForModule(module)
}
DefaultPageCreator(commentsToContentConverter, signatureProvider, context).pageForModule(module)
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,15 @@ import org.jetbrains.dokka.model.doc.*
import org.jetbrains.dokka.model.properties.PropertyContainer
import org.jetbrains.dokka.model.properties.WithExtraProperties
import org.jetbrains.dokka.pages.*
import org.jetbrains.dokka.utilities.DokkaLogger
import org.jetbrains.kotlin.utils.addToStdlib.safeAs
import kotlin.reflect.KClass
import kotlin.reflect.full.isSubclassOf
import org.jetbrains.dokka.DokkaConfiguration.DokkaSourceSet
import org.jetbrains.dokka.base.resolvers.anchors.SymbolAnchorHint
import org.jetbrains.dokka.base.DokkaBase
import org.jetbrains.dokka.base.transformers.documentables.ClashingDriIdentifier
import org.jetbrains.dokka.plugability.DokkaContext
import org.jetbrains.dokka.plugability.plugin

private typealias GroupedTags = Map<KClass<out TagWrapper>, List<Pair<DokkaSourceSet?, TagWrapper>>>

Expand All @@ -27,8 +29,10 @@ private val specialTags: Set<KClass<out TagWrapper>> =
open class DefaultPageCreator(
commentsToContentConverter: CommentsToContentConverter,
signatureProvider: SignatureProvider,
val logger: DokkaLogger
val context: DokkaContext
) {
val logger by context::logger

protected open val contentBuilder = PageContentBuilder(commentsToContentConverter, signatureProvider, logger)

open fun pageForModule(m: DModule) =
Expand Down Expand Up @@ -238,7 +242,7 @@ open class DefaultPageCreator(
"Constructors",
2,
ContentKind.Constructors,
c.constructors.filter { it.extra[PrimaryConstructorExtra] == null || it.documentation.isNotEmpty() },
c.constructors.filter(context.single(context.plugin<DokkaBase>().documentablesFilteringStrategies)::shouldConstructorBeInPage),
c.sourceSets,
extra = PropertyContainer.empty<ContentNode>() + SimpleAttr.header("Constructors")
) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package org.jetbrains.dokka.base.translators.documentables

import org.jetbrains.dokka.model.DFunction

interface DocumentablesFilteringStrategies {
fun shouldConstructorBeInPage(constructor: DFunction): Boolean
}
Original file line number Diff line number Diff line change
@@ -1,16 +1,15 @@
package transformerBuilders;

import org.jetbrains.dokka.CoreExtensions
import org.jetbrains.dokka.pages.PageNode
import org.jetbrains.dokka.pages.RendererSpecificResourcePage
import org.jetbrains.dokka.pages.RenderingStrategy
import org.jetbrains.dokka.pages.*
import org.jetbrains.dokka.plugability.DokkaPlugin
import org.jetbrains.dokka.testApi.testRunner.AbstractCoreTest
import org.jetbrains.dokka.transformers.pages.PageTransformer
import org.jetbrains.dokka.transformers.pages.pageMapper
import org.jetbrains.dokka.transformers.pages.pageScanner
import org.jetbrains.dokka.transformers.pages.pageStructureTransformer
import org.junit.jupiter.api.Test
import kotlin.test.assertEquals

class PageTransformerBuilderTest : AbstractCoreTest() {

Expand Down Expand Up @@ -133,6 +132,43 @@ class PageTransformerBuilderTest : AbstractCoreTest() {
}
}

@Test
fun `kotlin constructors tab should not exist`() {
val configuration = dokkaConfiguration {
sourceSets {
sourceSet {
sourceRoots = listOf("src/")
}
}
}
testInline(
"""
|/src/main/kotlin/kotlinAsJavaPlugin/Test.kt
|package kotlinAsJavaPlugin
|
|class Test(val xd: Int)
""".trimMargin(),
configuration
) {
pagesGenerationStage = { root ->
val content = root.children
.flatMap { it.children<ContentPage>() }
.map { it.content }.single().children
.filterIsInstance<ContentGroup>()
.single { it.dci.kind == ContentKind.Main }.children

val constructorTabsCount = content.filter { it is ContentHeader }.flatMap {
it.children.filter { it is ContentText }
}.count {
(it as? ContentText)?.text == "Constructors"
}

assertEquals(0, constructorTabsCount)
}
}
}


private fun <T> Collection<T>.assertCount(n: Int, prefix: String = "") =
assert(count() == n) { "${prefix}Expected $n, got ${count()}" }

Expand Down
13 changes: 11 additions & 2 deletions plugins/kotlin-as-java/src/main/kotlin/KotlinAsJavaPlugin.kt
Original file line number Diff line number Diff line change
Expand Up @@ -4,27 +4,36 @@ import org.jetbrains.dokka.CoreExtensions
import org.jetbrains.dokka.base.DokkaBase
import org.jetbrains.dokka.kotlinAsJava.signatures.JavaSignatureProvider
import org.jetbrains.dokka.kotlinAsJava.transformers.KotlinAsJavaDocumentableTransformer
import org.jetbrains.dokka.kotlinAsJava.translators.KotlinAsJavaDocumentableFilteringStrategies
import org.jetbrains.dokka.kotlinAsJava.translators.KotlinAsJavaDocumentableToPageTranslator
import org.jetbrains.dokka.plugability.DokkaPlugin

class KotlinAsJavaPlugin : DokkaPlugin() {
val kotlinAsJavaDocumentableTransformer by extending {
CoreExtensions.documentableTransformer with KotlinAsJavaDocumentableTransformer()
}

val javaSignatureProvider by extending {
val dokkaBasePlugin = plugin<DokkaBase>()
dokkaBasePlugin.signatureProvider providing { ctx ->
JavaSignatureProvider(ctx.single(dokkaBasePlugin.commentsToContentConverter), ctx.logger)
} override dokkaBasePlugin.kotlinSignatureProvider
}

val defaultDocumentableFilteringStrategies by extending {
val dokkaBasePlugin = plugin<DokkaBase>()
dokkaBasePlugin.documentablesFilteringStrategies with KotlinAsJavaDocumentableFilteringStrategies override
dokkaBasePlugin.defaultDocumentablesFilteringStrategies
}

val kotlinAsJavaDocumentableToPageTranslator by extending {
val dokkaBasePlugin = plugin<DokkaBase>()
CoreExtensions.documentableToPageTranslator providing { ctx ->
KotlinAsJavaDocumentableToPageTranslator(
ctx.single(dokkaBasePlugin.commentsToContentConverter),
ctx.single(dokkaBasePlugin.signatureProvider),
ctx.logger
ctx
)
} override dokkaBasePlugin.documentableToPageTranslator
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package org.jetbrains.dokka.kotlinAsJava.translators

import org.jetbrains.dokka.base.translators.documentables.DocumentablesFilteringStrategies
import org.jetbrains.dokka.model.DFunction

object KotlinAsJavaDocumentableFilteringStrategies : DocumentablesFilteringStrategies {
override fun shouldConstructorBeInPage(constructor: DFunction) = true
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,16 @@ package org.jetbrains.dokka.kotlinAsJava.translators

import org.jetbrains.dokka.base.signatures.SignatureProvider
import org.jetbrains.dokka.base.transformers.pages.comments.CommentsToContentConverter
import org.jetbrains.dokka.transformers.documentation.DocumentableToPageTranslator
import org.jetbrains.dokka.model.DModule
import org.jetbrains.dokka.pages.ModulePageNode
import org.jetbrains.dokka.utilities.DokkaLogger
import org.jetbrains.dokka.plugability.DokkaContext
import org.jetbrains.dokka.transformers.documentation.DocumentableToPageTranslator

class KotlinAsJavaDocumentableToPageTranslator(
private val commentsToContentConverter: CommentsToContentConverter,
private val signatureProvider: SignatureProvider,
private val logger: DokkaLogger
private val context: DokkaContext
) : DocumentableToPageTranslator {
override fun invoke(module: DModule): ModulePageNode =
KotlinAsJavaPageCreator(commentsToContentConverter, signatureProvider, logger).pageForModule(module)
}
KotlinAsJavaPageCreator(commentsToContentConverter, signatureProvider, context).pageForModule(module)
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,12 @@ import org.jetbrains.dokka.base.transformers.pages.comments.CommentsToContentCon
import org.jetbrains.dokka.base.translators.documentables.DefaultPageCreator
import org.jetbrains.dokka.model.DProperty
import org.jetbrains.dokka.pages.MemberPageNode
import org.jetbrains.dokka.utilities.DokkaLogger
import org.jetbrains.dokka.plugability.DokkaContext

class KotlinAsJavaPageCreator(
commentsToContentConverter: CommentsToContentConverter,
signatureProvider: SignatureProvider,
logger: DokkaLogger
) : DefaultPageCreator(commentsToContentConverter, signatureProvider, logger) {
context: DokkaContext
) : DefaultPageCreator(commentsToContentConverter, signatureProvider, context) {
override fun pageForProperty(p: DProperty): MemberPageNode? = null
}
}
38 changes: 37 additions & 1 deletion plugins/kotlin-as-java/src/test/kotlin/KotlinAsJavaPluginTest.kt
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import utils.A
import utils.Span
import utils.TestOutputWriterPlugin
import utils.match
import kotlin.test.assertEquals

class KotlinAsJavaPluginTest : AbstractCoreTest() {

Expand Down Expand Up @@ -86,7 +87,10 @@ class KotlinAsJavaPluginTest : AbstractCoreTest() {
.map { it.content }

val children = contentList.flatMap { content ->
content.mainContents.first().cast<ContentGroup>().children
content.mainContents.single { it is ContentGroup }.children // TODO: Fix nesting of groups in PageCreator,
// becuase now there is different level of nesting constructors and properties/functions
// `contentForScope` is called on same level as constructors are
// best solution would be possibility to merge these groups
.filterIsInstance<ContentTable>()
.filter { it.children.isNotEmpty() }
}
Expand Down Expand Up @@ -372,6 +376,38 @@ class KotlinAsJavaPluginTest : AbstractCoreTest() {
}
}
}

@Test
fun `kotlin as java constructor`() {
val configuration = dokkaConfiguration {
sourceSets {
sourceSet {
sourceRoots = listOf("src/")
}
}
}
testInline(
"""
|/src/main/kotlin/kotlinAsJavaPlugin/Test.kt
|package kotlinAsJavaPlugin
|
|class Test(val xd: Int)
""".trimMargin(),
configuration,
cleanupOutput = true
) {
pagesGenerationStage = { root ->
val content = root.children
.flatMap { it.children<ContentPage>() }
.map { it.content }.single().mainContents

val text = content.single { it is ContentHeader }.children
.single() as ContentText

assertEquals("Constructors", text.text)
}
}
}
}

private val ContentNode.mainContents: List<ContentNode>
Expand Down

0 comments on commit 96701ae

Please sign in to comment.