diff --git a/plugins/base/frontend/package-lock.json b/plugins/base/frontend/package-lock.json index 997f5c0355..a28d810e70 100644 --- a/plugins/base/frontend/package-lock.json +++ b/plugins/base/frontend/package-lock.json @@ -41,7 +41,7 @@ "terser-webpack-plugin": "^5.2.5" }, "engines": { - "node": ">=17.0.0" + "node": ">=16.0.0" } }, "node_modules/@babel/code-frame": { diff --git a/plugins/base/src/main/kotlin/DokkaBase.kt b/plugins/base/src/main/kotlin/DokkaBase.kt index 03fbf64e28..87bf1c23e5 100644 --- a/plugins/base/src/main/kotlin/DokkaBase.kt +++ b/plugins/base/src/main/kotlin/DokkaBase.kt @@ -25,7 +25,10 @@ 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.DocumentableFilteringStrategies +import org.jetbrains.dokka.base.translators.documentables.PageContentBuilder import org.jetbrains.dokka.base.translators.psi.DefaultPsiToDocumentableTranslator import org.jetbrains.dokka.base.generation.SingleModuleGeneration import org.jetbrains.dokka.base.renderers.html.command.consumers.ReplaceVersionsConsumer @@ -51,6 +54,8 @@ class DokkaBase : DokkaPlugin() { CoreExtensions.generation providing ::SingleModuleGeneration } + val documentableFilteringStrategies by extensionPoint() + val descriptorToDocumentableTranslator by extending { CoreExtensions.sourceToDocumentableTranslator providing ::DefaultDescriptorToDocumentableTranslator } @@ -252,4 +257,8 @@ class DokkaBase : DokkaPlugin() { val baseSearchbarDataInstaller by extending { htmlPreprocessors providing ::SearchbarDataInstaller order { after(sourceLinksTransformer) } } + + val defaultDocumentableFilteringStrategies by extending { + documentableFilteringStrategies with DefaultDocumentableFilteringStrategies + } } diff --git a/plugins/base/src/main/kotlin/translators/documentables/DefaultDocumentableFilteringStrategies.kt b/plugins/base/src/main/kotlin/translators/documentables/DefaultDocumentableFilteringStrategies.kt new file mode 100644 index 0000000000..412f04f4c9 --- /dev/null +++ b/plugins/base/src/main/kotlin/translators/documentables/DefaultDocumentableFilteringStrategies.kt @@ -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 : DocumentableFilteringStrategies { + override fun shouldConstructorBeInPage(constructor: DFunction): Boolean = + constructor.extra[PrimaryConstructorExtra] == null || constructor.documentation.isNotEmpty() +} diff --git a/plugins/base/src/main/kotlin/translators/documentables/DefaultDocumentableToPageTranslator.kt b/plugins/base/src/main/kotlin/translators/documentables/DefaultDocumentableToPageTranslator.kt index 186472075b..30f8ff9d0d 100644 --- a/plugins/base/src/main/kotlin/translators/documentables/DefaultDocumentableToPageTranslator.kt +++ b/plugins/base/src/main/kotlin/translators/documentables/DefaultDocumentableToPageTranslator.kt @@ -11,13 +11,12 @@ import org.jetbrains.dokka.plugability.querySingle import org.jetbrains.dokka.transformers.documentation.DocumentableToPageTranslator class DefaultDocumentableToPageTranslator( - context: DokkaContext + private val context: DokkaContext ) : DocumentableToPageTranslator { private val configuration = configuration(context) private val commentsToContentConverter = context.plugin().querySingle { commentsToContentConverter } private val signatureProvider = context.plugin().querySingle { signatureProvider } - private val logger = context.logger override fun invoke(module: DModule): ModulePageNode = - DefaultPageCreator(configuration, commentsToContentConverter, signatureProvider, logger).pageForModule(module) -} \ No newline at end of file + DefaultPageCreator(configuration, commentsToContentConverter, signatureProvider, context).pageForModule(module) +} diff --git a/plugins/base/src/main/kotlin/translators/documentables/DefaultPageCreator.kt b/plugins/base/src/main/kotlin/translators/documentables/DefaultPageCreator.kt index 1b58135562..adb8eaceb7 100644 --- a/plugins/base/src/main/kotlin/translators/documentables/DefaultPageCreator.kt +++ b/plugins/base/src/main/kotlin/translators/documentables/DefaultPageCreator.kt @@ -11,14 +11,16 @@ 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.DokkaBaseConfiguration 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, List>> @@ -29,8 +31,10 @@ open class DefaultPageCreator( configuration: DokkaBaseConfiguration?, commentsToContentConverter: CommentsToContentConverter, signatureProvider: SignatureProvider, - val logger: DokkaLogger + val context: DokkaContext ) { + val logger by context::logger + protected open val contentBuilder = PageContentBuilder(commentsToContentConverter, signatureProvider, logger) protected val separateInheritedMembers = @@ -256,7 +260,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().documentableFilteringStrategies)::shouldConstructorBeInPage), c.sourceSets, needsAnchors = true, extra = PropertyContainer.empty() + SimpleAttr.header("Constructors") diff --git a/plugins/base/src/main/kotlin/translators/documentables/DocumentableFilteringStrategies.kt b/plugins/base/src/main/kotlin/translators/documentables/DocumentableFilteringStrategies.kt new file mode 100644 index 0000000000..d47be2259f --- /dev/null +++ b/plugins/base/src/main/kotlin/translators/documentables/DocumentableFilteringStrategies.kt @@ -0,0 +1,7 @@ +package org.jetbrains.dokka.base.translators.documentables + +import org.jetbrains.dokka.model.DFunction + +interface DocumentableFilteringStrategies { + fun shouldConstructorBeInPage(constructor: DFunction): Boolean +} diff --git a/plugins/base/src/test/kotlin/transformerBuilders/PageTransformerBuilderTest.kt b/plugins/base/src/test/kotlin/transformerBuilders/PageTransformerBuilderTest.kt index e17f0800c6..0b4baa1c7c 100644 --- a/plugins/base/src/test/kotlin/transformerBuilders/PageTransformerBuilderTest.kt +++ b/plugins/base/src/test/kotlin/transformerBuilders/PageTransformerBuilderTest.kt @@ -1,9 +1,7 @@ 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.base.testApi.testRunner.BaseAbstractTest import org.jetbrains.dokka.transformers.pages.PageTransformer @@ -11,6 +9,7 @@ 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 : BaseAbstractTest() { @@ -133,6 +132,43 @@ class PageTransformerBuilderTest : BaseAbstractTest() { } } + @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() } + .map { it.content }.single().children + .filterIsInstance() + .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 Collection.assertCount(n: Int, prefix: String = "") = assert(count() == n) { "${prefix}Expected $n, got ${count()}" } diff --git a/plugins/kotlin-as-java/src/main/kotlin/KotlinAsJavaPlugin.kt b/plugins/kotlin-as-java/src/main/kotlin/KotlinAsJavaPlugin.kt index b8e12553e5..082bd4fd63 100644 --- a/plugins/kotlin-as-java/src/main/kotlin/KotlinAsJavaPlugin.kt +++ b/plugins/kotlin-as-java/src/main/kotlin/KotlinAsJavaPlugin.kt @@ -2,13 +2,12 @@ package org.jetbrains.dokka.kotlinAsJava import org.jetbrains.dokka.CoreExtensions import org.jetbrains.dokka.base.DokkaBase -import org.jetbrains.dokka.base.DokkaBaseConfiguration import org.jetbrains.dokka.kotlinAsJava.signatures.JavaSignatureProvider import org.jetbrains.dokka.kotlinAsJava.transformers.JvmNameDocumentableTransformer 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 -import org.jetbrains.dokka.plugability.configuration class KotlinAsJavaPlugin : DokkaPlugin() { val kotlinAsJavaDocumentableTransformer by extending { @@ -26,8 +25,15 @@ class KotlinAsJavaPlugin : DokkaPlugin() { signatureProvider providing ::JavaSignatureProvider override kotlinSignatureProvider } } + + val defaultDocumentableFilteringStrategies by extending { + val dokkaBasePlugin = plugin() + dokkaBasePlugin.documentableFilteringStrategies with KotlinAsJavaDocumentableFilteringStrategies override + dokkaBasePlugin.defaultDocumentableFilteringStrategies + } + val kotlinAsJavaDocumentableToPageTranslator by extending { CoreExtensions.documentableToPageTranslator providing ::KotlinAsJavaDocumentableToPageTranslator override plugin().documentableToPageTranslator } -} \ No newline at end of file +} diff --git a/plugins/kotlin-as-java/src/main/kotlin/translators/KotlinAsJavaDocumentableFilteringStrategies.kt b/plugins/kotlin-as-java/src/main/kotlin/translators/KotlinAsJavaDocumentableFilteringStrategies.kt new file mode 100644 index 0000000000..5ff8001326 --- /dev/null +++ b/plugins/kotlin-as-java/src/main/kotlin/translators/KotlinAsJavaDocumentableFilteringStrategies.kt @@ -0,0 +1,8 @@ +package org.jetbrains.dokka.kotlinAsJava.translators + +import org.jetbrains.dokka.base.translators.documentables.DocumentableFilteringStrategies +import org.jetbrains.dokka.model.DFunction + +object KotlinAsJavaDocumentableFilteringStrategies : DocumentableFilteringStrategies { + override fun shouldConstructorBeInPage(constructor: DFunction) = true +} diff --git a/plugins/kotlin-as-java/src/main/kotlin/translators/KotlinAsJavaDocumentableToPageTranslator.kt b/plugins/kotlin-as-java/src/main/kotlin/translators/KotlinAsJavaDocumentableToPageTranslator.kt index 0f7d74b62e..532d29ebc8 100644 --- a/plugins/kotlin-as-java/src/main/kotlin/translators/KotlinAsJavaDocumentableToPageTranslator.kt +++ b/plugins/kotlin-as-java/src/main/kotlin/translators/KotlinAsJavaDocumentableToPageTranslator.kt @@ -2,8 +2,6 @@ package org.jetbrains.dokka.kotlinAsJava.translators import org.jetbrains.dokka.base.DokkaBase import org.jetbrains.dokka.base.DokkaBaseConfiguration -import org.jetbrains.dokka.base.signatures.SignatureProvider -import org.jetbrains.dokka.base.transformers.pages.comments.CommentsToContentConverter import org.jetbrains.dokka.DokkaConfiguration import org.jetbrains.dokka.transformers.documentation.DocumentableToPageTranslator import org.jetbrains.dokka.model.DModule @@ -14,12 +12,11 @@ import org.jetbrains.dokka.plugability.plugin import org.jetbrains.dokka.plugability.querySingle import org.jetbrains.dokka.utilities.DokkaLogger -class KotlinAsJavaDocumentableToPageTranslator(context: DokkaContext) : DocumentableToPageTranslator { +class KotlinAsJavaDocumentableToPageTranslator(private val context: DokkaContext) : DocumentableToPageTranslator { private val configuration = configuration(context) private val commentsToContentConverter = context.plugin().querySingle { commentsToContentConverter } private val signatureProvider = context.plugin().querySingle { signatureProvider } - private val logger: DokkaLogger = context.logger override fun invoke(module: DModule): ModulePageNode = - KotlinAsJavaPageCreator(configuration, commentsToContentConverter, signatureProvider, logger).pageForModule(module) -} \ No newline at end of file + KotlinAsJavaPageCreator(configuration, commentsToContentConverter, signatureProvider, context).pageForModule(module) +} diff --git a/plugins/kotlin-as-java/src/main/kotlin/translators/KotlinAsJavaPageCreator.kt b/plugins/kotlin-as-java/src/main/kotlin/translators/KotlinAsJavaPageCreator.kt index b2cf624651..4be6a9a0e8 100644 --- a/plugins/kotlin-as-java/src/main/kotlin/translators/KotlinAsJavaPageCreator.kt +++ b/plugins/kotlin-as-java/src/main/kotlin/translators/KotlinAsJavaPageCreator.kt @@ -4,16 +4,15 @@ import org.jetbrains.dokka.base.DokkaBaseConfiguration import org.jetbrains.dokka.base.signatures.SignatureProvider import org.jetbrains.dokka.base.transformers.pages.comments.CommentsToContentConverter import org.jetbrains.dokka.base.translators.documentables.DefaultPageCreator -import org.jetbrains.dokka.DokkaConfiguration 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( configuration: DokkaBaseConfiguration?, commentsToContentConverter: CommentsToContentConverter, signatureProvider: SignatureProvider, - logger: DokkaLogger -) : DefaultPageCreator(configuration, commentsToContentConverter, signatureProvider, logger) { + context: DokkaContext +) : DefaultPageCreator(configuration, commentsToContentConverter, signatureProvider, context) { override fun pageForProperty(p: DProperty): MemberPageNode? = null -} \ No newline at end of file +} diff --git a/plugins/kotlin-as-java/src/test/kotlin/KotlinAsJavaPluginTest.kt b/plugins/kotlin-as-java/src/test/kotlin/KotlinAsJavaPluginTest.kt index 655405b943..7c0c0de192 100644 --- a/plugins/kotlin-as-java/src/test/kotlin/KotlinAsJavaPluginTest.kt +++ b/plugins/kotlin-as-java/src/test/kotlin/KotlinAsJavaPluginTest.kt @@ -15,6 +15,7 @@ import utils.A import utils.Span import utils.TestOutputWriterPlugin import utils.match +import kotlin.test.assertEquals class KotlinAsJavaPluginTest : BaseAbstractTest() { @@ -87,7 +88,10 @@ class KotlinAsJavaPluginTest : BaseAbstractTest() { .map { it.content } val children = contentList.flatMap { content -> - content.mainContents.first().cast().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() .filter { it.children.isNotEmpty() } } @@ -437,6 +441,38 @@ class KotlinAsJavaPluginTest : BaseAbstractTest() { } } } + + @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() } + .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