From 3de1182033ca5a5db374e16a6ab3555627faa79b Mon Sep 17 00:00:00 2001 From: Szymon Świstun Date: Mon, 16 Mar 2020 13:08:29 +0100 Subject: Add default values for parameters --- core/src/main/kotlin/model/defaultValues.kt | 18 +++ .../kotlin/model/properties/PropertyContainer.kt | 5 +- .../transformers/pages/PageTransformerBuilders.kt | 6 +- .../PageTransformerBuilderTest.kt | 149 -------------------- .../DefaultDescriptorToDocumentableTranslator.kt | 20 ++- .../PageTransformerBuilderTest.kt | 150 +++++++++++++++++++++ 6 files changed, 190 insertions(+), 158 deletions(-) create mode 100644 core/src/main/kotlin/model/defaultValues.kt delete mode 100644 core/src/test/kotlin/transformerBuilders/PageTransformerBuilderTest.kt create mode 100644 plugins/base/src/test/kotlin/transformerBuilders/PageTransformerBuilderTest.kt diff --git a/core/src/main/kotlin/model/defaultValues.kt b/core/src/main/kotlin/model/defaultValues.kt new file mode 100644 index 00000000..63b69cbb --- /dev/null +++ b/core/src/main/kotlin/model/defaultValues.kt @@ -0,0 +1,18 @@ +package org.jetbrains.dokka.model + +import org.jetbrains.dokka.model.properties.ExtraProperty +import org.jetbrains.dokka.model.properties.MergeStrategy +import java.lang.IllegalStateException + +class DefaultValue(val value: String): ExtraProperty { + companion object : ExtraProperty.Key { + override fun mergeStrategyFor(left: DefaultValue, right: DefaultValue): MergeStrategy = if (left.value == right.value) + MergeStrategy.Replace(left) + else + MergeStrategy.Fail {throw IllegalStateException("Default values need to be the same")} + + } + + override val key: ExtraProperty.Key + get() = Companion +} \ No newline at end of file diff --git a/core/src/main/kotlin/model/properties/PropertyContainer.kt b/core/src/main/kotlin/model/properties/PropertyContainer.kt index 5ea42e42..107bede5 100644 --- a/core/src/main/kotlin/model/properties/PropertyContainer.kt +++ b/core/src/main/kotlin/model/properties/PropertyContainer.kt @@ -15,12 +15,13 @@ class PropertyContainer internal constructor( } inline fun allOfType(): List = map.values.filterIsInstance() - fun addAll(vararg extras: ExtraProperty): PropertyContainer = + fun addAll(extras: Collection>): PropertyContainer = PropertyContainer(map + extras.map { p -> p.key to p }) companion object { fun empty(): PropertyContainer = PropertyContainer(emptyMap()) - fun withAll(vararg extras: ExtraProperty) = empty().addAll(*extras) + fun withAll(vararg extras: ExtraProperty) = empty().addAll(extras.toList()) + fun withAll(extras: Collection>) = empty().addAll(extras) } } diff --git a/core/src/main/kotlin/transformers/pages/PageTransformerBuilders.kt b/core/src/main/kotlin/transformers/pages/PageTransformerBuilders.kt index 89b22c19..291b72ef 100644 --- a/core/src/main/kotlin/transformers/pages/PageTransformerBuilders.kt +++ b/core/src/main/kotlin/transformers/pages/PageTransformerBuilders.kt @@ -3,15 +3,15 @@ package org.jetbrains.dokka.transformers.pages import org.jetbrains.dokka.pages.PageNode import org.jetbrains.dokka.pages.RootPageNode -fun pageScanner(block: PageNode.() -> Unit) = object : PageNodeTransformer { +fun pageScanner(block: PageNode.() -> Unit) = object : PageTransformer { override fun invoke(input: RootPageNode): RootPageNode = input.invokeOnAll(block) as RootPageNode } -fun pageMapper(block: PageNode.() -> PageNode) = object : PageNodeTransformer { +fun pageMapper(block: PageNode.() -> PageNode) = object : PageTransformer { override fun invoke(input: RootPageNode): RootPageNode = input.alterChildren(block) as RootPageNode } -fun pageStructureTransformer(block: RootPageNode.() -> RootPageNode) = object : PageNodeTransformer { +fun pageStructureTransformer(block: RootPageNode.() -> RootPageNode) = object : PageTransformer { override fun invoke(input: RootPageNode): RootPageNode = block(input) } diff --git a/core/src/test/kotlin/transformerBuilders/PageTransformerBuilderTest.kt b/core/src/test/kotlin/transformerBuilders/PageTransformerBuilderTest.kt deleted file mode 100644 index 13ea5580..00000000 --- a/core/src/test/kotlin/transformerBuilders/PageTransformerBuilderTest.kt +++ /dev/null @@ -1,149 +0,0 @@ -package transformerBuilders; - -import org.jetbrains.dokka.CoreExtensions -import org.jetbrains.dokka.pages.* -import org.jetbrains.dokka.plugability.DokkaPlugin -import org.jetbrains.dokka.transformers.pages.PageNodeTransformer -import org.jetbrains.dokka.transformers.pages.pageMapper -import org.jetbrains.dokka.transformers.pages.pageScanner -import org.jetbrains.dokka.transformers.pages.pageStructureTransformer -import org.jetbrains.dokka.utilities.DokkaConsoleLogger -import org.junit.Test -import testApi.testRunner.AbstractCoreTest - -class PageTransformerBuilderTest : AbstractCoreTest() { - - class ProxyPlugin(transformer: PageNodeTransformer) : DokkaPlugin() { - val pageTransformer by extending { CoreExtensions.pageTransformer with transformer } - } - - @Test - fun scannerTest() { - val configuration = dokkaConfiguration { - passes { - pass { - sourceRoots = listOf("src/main/kotlin/transformerBuilder/Test.kt") - } - } - } - val list = mutableListOf() - - var orig: PageNode? = null - - testInline( - """ - |/src/main/kotlin/transformerBuilder/Test.kt - |package transformerBuilder - | - |object Test { - | fun test2(str: String): Unit {println(str)} - |} - """.trimMargin(), - configuration, - pluginOverrides = listOf(ProxyPlugin(pageScanner { - list += name - })) - ) { - pagesGenerationStage = { - orig = it - } - pagesTransformationStage = { root -> - list.assertCount(8, "Page list: ") - orig?.let { root.assertTransform(it) } - } - } - } - - @Test - fun mapperTest() { - val configuration = dokkaConfiguration { - passes { - pass { - sourceRoots = listOf("src/main/kotlin/transformerBuilder/Test.kt") - } - } - } - - var orig: PageNode? = null - - testInline( - """ - |/src/main/kotlin/transformerBuilder/Test.kt - |package transformerBuilder - | - |object Test { - | fun test2(str: String): Unit {println(str)} - |} - """.trimMargin(), - configuration, - pluginOverrides = listOf(ProxyPlugin(pageMapper { - modified(name = name + "2") - })) - ) { - pagesGenerationStage = { - orig = it - } - pagesTransformationStage = { - it.let { root -> - root.name.assertEqual("root2", "Root name: ") - orig?.let { - root.assertTransform(it) { node -> node.modified(name = node.name + "2") } - } - } - } - } - } - - @Test - fun structureTransformerTest() { - val configuration = dokkaConfiguration { - passes { - pass { - sourceRoots = listOf("src/main/kotlin/transformerBuilder/Test.kt") - } - } - } - - testInline( - """ - |/src/main/kotlin/transformerBuilder/Test.kt - |package transformerBuilder - | - |object Test { - | fun test2(str: String): Unit {println(str)} - |} - """.trimMargin(), - configuration, - pluginOverrides = listOf(ProxyPlugin(pageStructureTransformer { - val ch = children.first() - modified( - children = listOf( - ch, - RendererSpecificResourcePage("test", emptyList(), RenderingStrategy.DoNothing) - ) - ) - })) - ) { - pagesTransformationStage = { root -> - root.children.assertCount(2, "Root children: ") - root.children.first().name.assertEqual("transformerBuilder") - root.children[1].name.assertEqual("test") - } - } - } - - private fun Collection.assertCount(n: Int, prefix: String = "") = - assert(count() == n) { "${prefix}Expected $n, got ${count()}" } - - private fun T.assertEqual(expected: T, prefix: String = "") = assert(this == expected) { - "${prefix}Expected $expected, got $this" - } - - private fun PageNode.assertTransform(expected: PageNode, block: (PageNode) -> PageNode = { it }): Unit = this.let { - it.name.assertEqual(block(expected).name) - it.children.zip(expected.children).forEach { (g, e) -> - g.name.assertEqual(block(e).name) - g.assertTransform(e, block) - } - } -} diff --git a/plugins/base/src/main/kotlin/translators/descriptors/DefaultDescriptorToDocumentableTranslator.kt b/plugins/base/src/main/kotlin/translators/descriptors/DefaultDescriptorToDocumentableTranslator.kt index 44679d8d..6d834f9c 100644 --- a/plugins/base/src/main/kotlin/translators/descriptors/DefaultDescriptorToDocumentableTranslator.kt +++ b/plugins/base/src/main/kotlin/translators/descriptors/DefaultDescriptorToDocumentableTranslator.kt @@ -19,16 +19,19 @@ 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.psi.KtConstantExpression import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.calls.components.isVararg import org.jetbrains.kotlin.resolve.calls.tasks.isDynamic -import org.jetbrains.kotlin.resolve.descriptorUtil.* +import org.jetbrains.kotlin.resolve.descriptorUtil.annotationClass +import org.jetbrains.kotlin.resolve.descriptorUtil.getAllSuperclassesWithoutAny +import org.jetbrains.kotlin.resolve.descriptorUtil.getSuperClassNotAny +import org.jetbrains.kotlin.resolve.descriptorUtil.getSuperInterfaces import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter import org.jetbrains.kotlin.resolve.scopes.MemberScope +import org.jetbrains.kotlin.resolve.source.KotlinSourceElement import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.TypeProjection -import org.jetbrains.dokka.model.Variance -import org.jetbrains.kotlin.idea.kdoc.findKDoc class DefaultDescriptorToDocumentableTranslator( private val context: DokkaContext @@ -367,7 +370,12 @@ private class DokkaDescriptorVisitor( // TODO: close this class and make it priv type = descriptor.type.toBound(), documentation = descriptor.resolveDescriptorData(platformData), platformData = listOf(platformData), - extra = PropertyContainer.withAll(descriptor.additionalExtras(), descriptor.getAnnotations()) + extra = PropertyContainer.withAll( + listOfNotNull( + descriptor.additionalExtras(), + descriptor.getAnnotations(), + descriptor.getDefaultValue()?.let { DefaultValue(it) }) + ) ) private fun MemberScope.functions(parent: DRIWithPlatformInfo): List = @@ -523,6 +531,10 @@ private class DokkaDescriptorVisitor( // TODO: close this class and make it priv ) }.let(::Annotations) + fun ValueParameterDescriptor.getDefaultValue(): String? = (source as? KotlinSourceElement)?.let { + it.psi.children.find { it is KtConstantExpression }?.text + } + data class ClassInfo(val supertypes: List, val docs: PlatformDependent) private fun Visibility.toDokkaVisibility(): org.jetbrains.dokka.model.Visibility = when (this) { diff --git a/plugins/base/src/test/kotlin/transformerBuilders/PageTransformerBuilderTest.kt b/plugins/base/src/test/kotlin/transformerBuilders/PageTransformerBuilderTest.kt new file mode 100644 index 00000000..20ee7490 --- /dev/null +++ b/plugins/base/src/test/kotlin/transformerBuilders/PageTransformerBuilderTest.kt @@ -0,0 +1,150 @@ +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.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 + +class PageTransformerBuilderTest : AbstractCoreTest() { + + class ProxyPlugin(transformer: PageTransformer) : DokkaPlugin() { + val pageTransformer by extending { CoreExtensions.pageTransformer with transformer } + } + + @Test + fun scannerTest() { + val configuration = dokkaConfiguration { + passes { + pass { + sourceRoots = listOf("src/main/kotlin/transformerBuilder/Test.kt") + } + } + } + val list = mutableListOf() + + var orig: PageNode? = null + + testInline( + """ + |/src/main/kotlin/transformerBuilder/Test.kt + |package transformerBuilder + | + |object Test { + | fun test2(str: String): Unit {println(str)} + |} + """.trimMargin(), + configuration, + pluginOverrides = listOf(ProxyPlugin(pageScanner { + list += name + })) + ) { + pagesGenerationStage = { + orig = it + } + pagesTransformationStage = { root -> + list.assertCount(7, "Page list: ") + orig?.let { root.assertTransform(it) } + } + } + } + + @Test + fun mapperTest() { + val configuration = dokkaConfiguration { + passes { + pass { + sourceRoots = listOf("src/main/kotlin/transformerBuilder/Test.kt") + } + } + } + + var orig: PageNode? = null + + testInline( + """ + |/src/main/kotlin/transformerBuilder/Test.kt + |package transformerBuilder + | + |object Test { + | fun test2(str: String): Unit {println(str)} + |} + """.trimMargin(), + configuration, + pluginOverrides = listOf(ProxyPlugin(pageMapper { + modified(name = name + "2") + })) + ) { + pagesGenerationStage = { + orig = it + } + pagesTransformationStage = { + it.let { root -> + root.name.assertEqual("root2", "Root name: ") + orig?.let { + root.assertTransform(it) { node -> node.modified(name = node.name + "2") } + } + } + } + } + } + + @Test + fun structureTransformerTest() { + val configuration = dokkaConfiguration { + passes { + pass { + sourceRoots = listOf("src/main/kotlin/transformerBuilder/Test.kt") + } + } + } + + testInline( + """ + |/src/main/kotlin/transformerBuilder/Test.kt + |package transformerBuilder + | + |object Test { + | fun test2(str: String): Unit {println(str)} + |} + """.trimMargin(), + configuration, + pluginOverrides = listOf(ProxyPlugin(pageStructureTransformer { + val ch = children.first() + modified( + children = listOf( + ch, + RendererSpecificResourcePage("test", emptyList(), RenderingStrategy.DoNothing) + ) + ) + })) + ) { + pagesTransformationStage = { root -> + root.children.assertCount(2, "Root children: ") + root.children.first().name.assertEqual("transformerBuilder") + root.children[1].name.assertEqual("test") + } + } + } + + private fun Collection.assertCount(n: Int, prefix: String = "") = + assert(count() == n) { "${prefix}Expected $n, got ${count()}" } + + private fun T.assertEqual(expected: T, prefix: String = "") = assert(this == expected) { + "${prefix}Expected $expected, got $this" + } + + private fun PageNode.assertTransform(expected: PageNode, block: (PageNode) -> PageNode = { it }): Unit = this.let { + it.name.assertEqual(block(expected).name) + it.children.zip(expected.children).forEach { (g, e) -> + g.name.assertEqual(block(e).name) + g.assertTransform(e, block) + } + } +} -- cgit