From f2c477f4f7126d462e1e42a6118355431bff9af6 Mon Sep 17 00:00:00 2001 From: Kamil Doległo Date: Fri, 21 Feb 2020 15:47:08 +0100 Subject: Refactor PageBuilder and PageContentBuilder Also PageBuilder has been renamed to DefaultPageCreator --- .../DefaultDocumentableToPageTranslator.kt | 12 +- .../documentables/DefaultPageCreator.kt | 126 +++++++ .../translators/documentables/PageBuilder.kt | 159 -------- .../documentables/PageContentBuilder.kt | 408 +++++++++++---------- 4 files changed, 349 insertions(+), 356 deletions(-) create mode 100644 plugins/base/src/main/kotlin/translators/documentables/DefaultPageCreator.kt delete mode 100644 plugins/base/src/main/kotlin/translators/documentables/PageBuilder.kt (limited to 'plugins/base/src/main') diff --git a/plugins/base/src/main/kotlin/translators/documentables/DefaultDocumentableToPageTranslator.kt b/plugins/base/src/main/kotlin/translators/documentables/DefaultDocumentableToPageTranslator.kt index f577c8f4..2d9bab90 100644 --- a/plugins/base/src/main/kotlin/translators/documentables/DefaultDocumentableToPageTranslator.kt +++ b/plugins/base/src/main/kotlin/translators/documentables/DefaultDocumentableToPageTranslator.kt @@ -6,20 +6,10 @@ import org.jetbrains.dokka.pages.ModulePageNode import org.jetbrains.dokka.transformers.documentation.DocumentableToPageTranslator import org.jetbrains.dokka.utilities.DokkaLogger - class DefaultDocumentableToPageTranslator( private val commentsToContentConverter: CommentsToContentConverter, private val logger: DokkaLogger ) : DocumentableToPageTranslator { override fun invoke(module: Module): ModulePageNode = - DefaultPageBuilder { node, kind, operation -> - DefaultPageContentBuilder.group( - setOf(node.dri), - node.platformData, - kind, - commentsToContentConverter, - logger, - operation - ) - }.pageForModule(module) + DefaultPageCreator(commentsToContentConverter, logger).pageForModule(module) } \ No newline at end of file diff --git a/plugins/base/src/main/kotlin/translators/documentables/DefaultPageCreator.kt b/plugins/base/src/main/kotlin/translators/documentables/DefaultPageCreator.kt new file mode 100644 index 00000000..d6880f01 --- /dev/null +++ b/plugins/base/src/main/kotlin/translators/documentables/DefaultPageCreator.kt @@ -0,0 +1,126 @@ +package org.jetbrains.dokka.base.translators.documentables + +import org.jetbrains.dokka.base.transformers.pages.comments.CommentsToContentConverter +import org.jetbrains.dokka.model.* +import org.jetbrains.dokka.model.Enum +import org.jetbrains.dokka.model.Function +import org.jetbrains.dokka.model.doc.TagWrapper +import org.jetbrains.dokka.pages.* +import org.jetbrains.dokka.utilities.DokkaLogger + +open class DefaultPageCreator( + commentsToContentConverter: CommentsToContentConverter, + val logger: DokkaLogger +) { + protected open val contentBuilder = PageContentBuilder(commentsToContentConverter, logger) + + open fun pageForModule(m: Module): ModulePageNode = + ModulePageNode(m.name.ifEmpty { "root" }, contentForModule(m), m, m.packages.map { pageForPackage(it) }) + + open fun pageForPackage(p: Package): PackagePageNode = + PackagePageNode(p.name, contentForPackage(p), setOf(p.dri), p, + p.classlikes.map { pageForClasslike(it) } + + p.functions.map { pageForMember(it) } + + p.packages.map { pageForPackage(it) }) + + open fun pageForClasslike(c: Classlike): ClasslikePageNode { + val constructors = when (c) { + is Class -> c.constructors + is Enum -> c.constructors + else -> emptyList() + } + + return ClasslikePageNode(c.name.orEmpty(), contentForClasslike(c), setOf(c.dri), c, + constructors.map { pageForMember(it) } + + c.classlikes.map { pageForClasslike(it) } + + c.functions.map { pageForMember(it) }) + } + + open fun pageForMember(c: Callable): MemberPageNode = when (c) { + is Function -> MemberPageNode(c.name, contentForFunction(c), setOf(c.dri), c) + else -> throw IllegalStateException("$c should not be present here") + } + + protected open fun contentForModule(m: Module) = contentBuilder.contentFor(m) { + header(1) { text("root") } + block("Packages", 2, ContentKind.Packages, m.packages, m.platformData.toSet()) { + link(it.name, it.dri) + } + text("Index\n") + text("Link to allpage here") + } + + protected open fun contentForPackage(p: Package) = contentBuilder.contentFor(p) { + header(1) { text("Package ${p.name}") } + block("Types", 2, ContentKind.Properties, p.classlikes, p.platformData.toSet()) { + link(it.name.orEmpty(), it.dri) + text(it.briefDocTagString) + } + block("Functions", 2, ContentKind.Functions, p.functions, p.platformData.toSet()) { + link(it.name, it.dri) + signature(it) + text(it.briefDocTagString) + } + } + + protected open fun contentForClasslike(c: Classlike) = contentBuilder.contentFor(c) { + when (c) { // TODO this when will be removed when signature generation is moved to utils + is Class -> header(1) { text(c.name) } + is Enum -> { + header(1) { text("enum ${c.name}") } + block("Entries", 2, ContentKind.Properties, c.entries, c.platformData.toSet()) { entry -> + link(entry.name.orEmpty(), entry.dri) + contentForComments(entry) + } + } + else -> throw IllegalStateException("$c should not be present here") + } + + contentForComments(c) + + if (c is WithConstructors) { + block("Constructors", 2, ContentKind.Functions, c.constructors, c.platformData.toSet()) { + link(it.name, it.dri) + signature(it) + text(it.briefDocTagString) + } + } + + block("Functions", 2, ContentKind.Functions, c.functions, c.platformData.toSet()) { + link(it.name, it.dri) + signature(it) + text(it.briefDocTagString) + } + + block("Properties", 2, ContentKind.Properties, c.properties, c.platformData.toSet()) { + link(it.name, it.dri) + text(it.briefDocTagString) + } + } + + protected open fun contentForComments(d: Documentable) = contentBuilder.contentFor(d) { + // TODO: this probably needs fixing + d.documentation.forEach { _, documentationNode -> + documentationNode.children.forEach { + header(3) { + text(it.toHeaderString()) + d.documentation.keys.joinToString(prefix = "[", postfix = "]", separator = ", ") + } + comment(it.root) + text("\n") + } + } + } + + protected open fun contentForFunction(f: Function) = contentBuilder.contentFor(f) { + header(1) { text(f.name) } + signature(f) + contentForComments(f) + block("Parameters", 2, ContentKind.Parameters, f.children, f.platformData.toSet()) { + text(it.name ?: "") + it.documentation.forEach { it.value.children.forEach { comment(it.root) } } + } + } + + protected open fun TagWrapper.toHeaderString() = this.javaClass.toGenericString().split('.').last() +} diff --git a/plugins/base/src/main/kotlin/translators/documentables/PageBuilder.kt b/plugins/base/src/main/kotlin/translators/documentables/PageBuilder.kt deleted file mode 100644 index 82419a77..00000000 --- a/plugins/base/src/main/kotlin/translators/documentables/PageBuilder.kt +++ /dev/null @@ -1,159 +0,0 @@ -package org.jetbrains.dokka.base.translators.documentables - -import org.jetbrains.dokka.model.* -import org.jetbrains.dokka.model.Enum -import org.jetbrains.dokka.model.Function -import org.jetbrains.dokka.model.doc.TagWrapper -import org.jetbrains.dokka.pages.* - -open class DefaultPageBuilder( - override val rootContentGroup: RootContentBuilder -) : PageBuilder { - - override fun pageForModule(m: Module): ModulePageNode = - ModulePageNode(m.name.ifEmpty { "root" }, contentForModule(m), m, m.packages.map { pageForPackage(it) }) - - override fun pageForPackage(p: Package) = - PackagePageNode(p.name, contentForPackage(p), setOf(p.dri), p, - p.classlikes.map { pageForClasslike(it) } + - p.functions.map { pageForMember(it) }) - - override fun pageForClasslike(c: Classlike): ClasslikePageNode { - val constructors = when (c) { - is Class -> c.constructors - is Enum -> c.constructors - else -> emptyList() - } - - return ClasslikePageNode(c.name, contentForClasslike(c), setOf(c.dri), c, - constructors.map { pageForMember(it) } + - c.classlikes.map { pageForClasslike(it) } + - c.functions.map { pageForMember(it) }) - } - - override fun pageForMember(m: CallableNode): MemberPageNode = - when (m) { - is Function -> - MemberPageNode(m.name, contentForFunction(m), setOf(m.dri), m) - else -> throw IllegalStateException("$m should not be present here") - } - - protected open fun group(node: Documentable, content: PageContentBuilderFunction) = - rootContentGroup(node, ContentKind.Main, content) - - protected open fun contentForModule(m: Module) = group(m) { - header(1) { text("root") } - block("Packages", 2, ContentKind.Packages, m.packages, m.platformData) { - link(it.name, it.dri) - } - text("Index\n") - text("Link to allpage here") - } - - protected open fun contentForPackage(p: Package) = group(p) { - header(1) { text("Package ${p.name}") } - block("Types", 2, ContentKind.Properties, p.classlikes, p.platformData) { - link(it.name, it.dri) - text(it.briefDocTagString) - } - block("Functions", 2, ContentKind.Functions, p.functions, p.platformData) { - link(it.name, it.dri) - signature(it) - text(it.briefDocTagString) - } - } - - open fun contentForClasslike(c: Classlike): ContentGroup = when (c) { - is Class -> contentForClass(c) - is Enum -> contentForEnum(c) - else -> throw IllegalStateException("$c should not be present here") - } - - protected fun contentForClass(c: Class) = group(c) { - header(1) { text(c.name) } - - c.inherited.takeIf { it.isNotEmpty() }?.let { - header(2) { text("SuperInterfaces") } - linkTable(it) - } - contentForComments(c) - block("Constructors", 2, ContentKind.Functions, c.constructors, c.platformData) { - link(it.name, it.dri) - signature(it) - text(it.briefDocTagString) - } - block("Functions", 2, ContentKind.Functions, c.functions, c.platformData) { - link(it.name, it.dri) - signature(it) - text(it.briefDocTagString) - } - block("Properties", 2, ContentKind.Properties, c.properties, c.platformData) { - link(it.name, it.dri) - text(it.briefDocTagString) - - } - } - - fun contentForEnum(c: Enum): ContentGroup = group(c) { - header(1) { text("enum ${c.name}") } - - block("Entries", 2, ContentKind.Properties, c.entries, c.platformData) { entry -> - link(entry.name, entry.dri) - contentForComments(entry) - } - - c.inherited.takeIf { it.isNotEmpty() }?.let { - header(2) { text("SuperInterfaces") } - linkTable(it) - } - contentForComments(c) - block("Constructors", 2, ContentKind.Functions, c.constructors, c.platformData) { - link(it.name, it.dri) - signature(it) - text(it.briefDocTagString) - } - block("Functions", 2, ContentKind.Functions, c.functions, c.platformData) { - link(it.name, it.dri) - signature(it) - text(it.briefDocTagString) - } - block("Properties", 2, ContentKind.Properties, c.properties, c.platformData) { - link(it.name, it.dri) - text(it.briefDocTagString) - } - } - - private fun PageContentBuilder.contentForComments(d: Documentable) = - d.platformInfo.forEach { platformInfo -> - platformInfo.documentationNode.children.forEach { - header(3) { - text(it.toHeaderString()) - text(" [${platformInfo.platformData.joinToString(", ") { it.platformType.name }}]") - } - comment(it.root) - text("\n") - } - } - - private fun contentForFunction(f: Function) = group(f) { - header(1) { text(f.name) } - signature(f) - contentForComments(f) - block("Parameters", 2, ContentKind.Parameters, f.children, f.platformData) { - text(it.name ?: "") - it.platformInfo.forEach { it.documentationNode.children.forEach { comment(it.root) } } - } - } - - private fun TagWrapper.toHeaderString() = this.javaClass.toGenericString().split('.').last() -} - -typealias RootContentBuilder = (Documentable, Kind, PageContentBuilderFunction) -> ContentGroup - -interface PageBuilder { - val rootContentGroup: RootContentBuilder - fun pageForModule(m: Module): ModulePageNode - fun pageForPackage(p: Package): PackagePageNode - fun pageForMember(m: CallableNode): MemberPageNode - fun pageForClasslike(c: Classlike): ClasslikePageNode -} \ No newline at end of file diff --git a/plugins/base/src/main/kotlin/translators/documentables/PageContentBuilder.kt b/plugins/base/src/main/kotlin/translators/documentables/PageContentBuilder.kt index 48456910..588d9cb8 100644 --- a/plugins/base/src/main/kotlin/translators/documentables/PageContentBuilder.kt +++ b/plugins/base/src/main/kotlin/translators/documentables/PageContentBuilder.kt @@ -9,210 +9,246 @@ import org.jetbrains.dokka.model.doc.DocTag import org.jetbrains.dokka.pages.* import org.jetbrains.dokka.utilities.DokkaLogger -open class DefaultPageContentBuilder( - protected val dri: Set, - protected val platformData: Set, - protected val kind: Kind, - protected val commentsConverter: CommentsToContentConverter, - val logger: DokkaLogger, - protected val styles: Set