From 33d67aae63986687f0eff9228cfc9f9d5da6d61e Mon Sep 17 00:00:00 2001 From: Paweł Marks Date: Thu, 27 Feb 2020 18:21:06 +0100 Subject: Signature provider moved to base --- .../kotlin/signatures/KotlinSignatureProvider.kt | 113 +++++++++++++++++++++ 1 file changed, 113 insertions(+) create mode 100644 plugins/base/src/main/kotlin/signatures/KotlinSignatureProvider.kt (limited to 'plugins/base/src/main/kotlin/signatures/KotlinSignatureProvider.kt') diff --git a/plugins/base/src/main/kotlin/signatures/KotlinSignatureProvider.kt b/plugins/base/src/main/kotlin/signatures/KotlinSignatureProvider.kt new file mode 100644 index 00000000..6eddca0d --- /dev/null +++ b/plugins/base/src/main/kotlin/signatures/KotlinSignatureProvider.kt @@ -0,0 +1,113 @@ +package org.jetbrains.dokka.base.signatures + +import org.jetbrains.dokka.base.transformers.pages.comments.CommentsToContentConverter +import org.jetbrains.dokka.base.translators.documentables.PageContentBuilder +import org.jetbrains.dokka.links.DRI +import org.jetbrains.dokka.links.sureClassNames +import org.jetbrains.dokka.model.* +import org.jetbrains.dokka.model.Enum +import org.jetbrains.dokka.model.Function +import org.jetbrains.dokka.pages.ContentKind +import org.jetbrains.dokka.pages.ContentNode +import org.jetbrains.dokka.pages.PlatformData +import org.jetbrains.dokka.utilities.DokkaLogger + +class KotlinSignatureProvider(ctcc: CommentsToContentConverter, logger: DokkaLogger) : SignatureProvider { + private val contentBuilder = PageContentBuilder(ctcc, logger) + + override fun signature(documentable: Documentable): List = when (documentable) { + is Function -> signature(documentable) + is Classlike -> signature(documentable) + else -> throw NotImplementedError( + "Cannot generate signature for ${documentable::class.qualifiedName} ${documentable.name}" + ) + } + + private fun signature(f: Function) = f.platformData.map { signature(f, it) }.distinct() + + private fun signature(c: Classlike) = c.platformData.map { signature(c, it) }.distinct() + + private fun signature(c: Classlike, platform: PlatformData) = contentBuilder.contentFor(c, ContentKind.Symbol) { + text(c.visibility[platform]?.externalDisplayName ?: "") + if (c is Class) { + text(c.modifier.toString()) + } + when (c) { + is Class -> text(" class ") + is Interface -> text(" interface ") + is Enum -> text(" enum ") + is Object -> text(" object ") + } + text(c.name!!) + if (c is WithSupertypes) { + list(c.supertypes.getValue(platform), prefix = " : ") { + link(it.sureClassNames, it) + } + } + } + + private fun signature(f: Function, platform: PlatformData) = contentBuilder.contentFor(f, ContentKind.Symbol) { + text(f.visibility[platform]?.externalDisplayName ?: "") + text(f.modifier.toString()) + text(" fun ") + f.receiver?.also { + type(it.type) + text(".") + } + link(f.name, f.dri) + val generics = f.generics.filterOnPlatform(platform) + if (generics.isNotEmpty()) { + text("<") + generics.forEach { + signature(it) + } + text(">") + } + text("(") + list(f.parameters.filterOnPlatform(platform)) { + link(it.name!!, it.dri) + text(": ") + type(it.type) + } + text(")") + val returnType = f.type + if (!f.isConstructor && returnType.constructorFqName != Unit::class.qualifiedName) { + text(": ") + + type(returnType) + } + } + + private fun signature(t: TypeParameter) = contentBuilder.contentFor(t, ContentKind.Symbol) { + link(t.name, t.dri) + if (t.bounds.isNotEmpty()) { + text("<") + t.bounds.forEach { + signature(it, t.dri, t.platformData) + } + text(">") + } + } + + private fun signature(p: Projection, dri: DRI, platforms: List): List = when (p) { + is OtherParameter -> contentBuilder.contentFor(dri, platforms.toSet()) { text(p.name) }.children + + is TypeConstructor -> contentBuilder.contentFor(dri, platforms.toSet()) { + link(p.dri.classNames.orEmpty(), p.dri) + }.children + p.projections.flatMap { signature(it, dri, platforms) } + + is Variance -> contentBuilder.contentFor(dri, platforms.toSet()) { + text(p.kind.toString() + " ") + }.children + signature(p.inner, dri, platforms) + + is Star -> contentBuilder.contentFor(dri, platforms.toSet()) { text("*") }.children + + is Nullable -> signature(p.inner, dri, platforms) + contentBuilder.contentFor( + dri, + platforms.toSet() + ) { text("?") }.children + } + + private fun Collection.filterOnPlatform(platformData: PlatformData) = + this.filter { it.platformData.contains(platformData) } +} \ No newline at end of file -- cgit From 156396f7520b3ac45e37068d6b72087008322cbe Mon Sep 17 00:00:00 2001 From: Kamil Doległo Date: Tue, 3 Mar 2020 17:42:48 +0100 Subject: Replace inline signature generation with KotlinSignatureProvider --- plugins/base/src/main/kotlin/DokkaBase.kt | 13 ++++++- .../kotlin/signatures/KotlinSignatureProvider.kt | 4 +- .../DefaultDocumentableToPageTranslator.kt | 4 +- .../documentables/DefaultPageCreator.kt | 42 ++++++++------------- .../documentables/PageContentBuilder.kt | 43 +++++++++------------- 5 files changed, 49 insertions(+), 57 deletions(-) (limited to 'plugins/base/src/main/kotlin/signatures/KotlinSignatureProvider.kt') diff --git a/plugins/base/src/main/kotlin/DokkaBase.kt b/plugins/base/src/main/kotlin/DokkaBase.kt index 78a51559..f2adcbc1 100644 --- a/plugins/base/src/main/kotlin/DokkaBase.kt +++ b/plugins/base/src/main/kotlin/DokkaBase.kt @@ -6,6 +6,7 @@ import org.jetbrains.dokka.base.renderers.OutputWriter import org.jetbrains.dokka.base.renderers.html.HtmlRenderer import org.jetbrains.dokka.base.resolvers.DefaultLocationProviderFactory import org.jetbrains.dokka.base.resolvers.LocationProviderFactory +import org.jetbrains.dokka.base.signatures.KotlinSignatureProvider import org.jetbrains.dokka.base.signatures.SignatureProvider import org.jetbrains.dokka.base.transformers.documentables.DefaultDocumentableMerger import org.jetbrains.dokka.base.transformers.pages.comments.CommentsToContentConverter @@ -38,9 +39,19 @@ class DokkaBase : DokkaPlugin() { CoreExtensions.documentableMerger with DefaultDocumentableMerger } + val kotlinSignatureProvider by extending(isFallback = true) { + signatureProvider providing { ctx -> + KotlinSignatureProvider(ctx.single(commentsToContentConverter), ctx.logger) + } + } + val documentableToPageTranslator by extending(isFallback = true) { CoreExtensions.documentableToPageTranslator providing { ctx -> - DefaultDocumentableToPageTranslator(ctx.single(commentsToContentConverter), ctx.logger) + DefaultDocumentableToPageTranslator( + ctx.single(commentsToContentConverter), + ctx.single(signatureProvider), + ctx.logger + ) } } diff --git a/plugins/base/src/main/kotlin/signatures/KotlinSignatureProvider.kt b/plugins/base/src/main/kotlin/signatures/KotlinSignatureProvider.kt index 6eddca0d..2d4694bd 100644 --- a/plugins/base/src/main/kotlin/signatures/KotlinSignatureProvider.kt +++ b/plugins/base/src/main/kotlin/signatures/KotlinSignatureProvider.kt @@ -13,7 +13,7 @@ import org.jetbrains.dokka.pages.PlatformData import org.jetbrains.dokka.utilities.DokkaLogger class KotlinSignatureProvider(ctcc: CommentsToContentConverter, logger: DokkaLogger) : SignatureProvider { - private val contentBuilder = PageContentBuilder(ctcc, logger) + private val contentBuilder = PageContentBuilder(ctcc, this, logger) override fun signature(documentable: Documentable): List = when (documentable) { is Function -> signature(documentable) @@ -59,7 +59,7 @@ class KotlinSignatureProvider(ctcc: CommentsToContentConverter, logger: DokkaLog if (generics.isNotEmpty()) { text("<") generics.forEach { - signature(it) + this@KotlinSignatureProvider.signature(it) } text(">") } diff --git a/plugins/base/src/main/kotlin/translators/documentables/DefaultDocumentableToPageTranslator.kt b/plugins/base/src/main/kotlin/translators/documentables/DefaultDocumentableToPageTranslator.kt index 2d9bab90..16f9b9b3 100644 --- a/plugins/base/src/main/kotlin/translators/documentables/DefaultDocumentableToPageTranslator.kt +++ b/plugins/base/src/main/kotlin/translators/documentables/DefaultDocumentableToPageTranslator.kt @@ -1,5 +1,6 @@ package org.jetbrains.dokka.base.translators.documentables +import org.jetbrains.dokka.base.signatures.SignatureProvider import org.jetbrains.dokka.base.transformers.pages.comments.CommentsToContentConverter import org.jetbrains.dokka.model.Module import org.jetbrains.dokka.pages.ModulePageNode @@ -8,8 +9,9 @@ import org.jetbrains.dokka.utilities.DokkaLogger class DefaultDocumentableToPageTranslator( private val commentsToContentConverter: CommentsToContentConverter, + private val signatureProvider: SignatureProvider, private val logger: DokkaLogger ) : DocumentableToPageTranslator { override fun invoke(module: Module): ModulePageNode = - DefaultPageCreator(commentsToContentConverter, logger).pageForModule(module) + DefaultPageCreator(commentsToContentConverter, signatureProvider, 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 index f171e15f..5f3772ce 100644 --- a/plugins/base/src/main/kotlin/translators/documentables/DefaultPageCreator.kt +++ b/plugins/base/src/main/kotlin/translators/documentables/DefaultPageCreator.kt @@ -1,5 +1,6 @@ package org.jetbrains.dokka.base.translators.documentables +import org.jetbrains.dokka.base.signatures.SignatureProvider import org.jetbrains.dokka.base.transformers.pages.comments.CommentsToContentConverter import org.jetbrains.dokka.links.DRI import org.jetbrains.dokka.model.* @@ -12,9 +13,10 @@ import org.jetbrains.dokka.utilities.DokkaLogger open class DefaultPageCreator( commentsToContentConverter: CommentsToContentConverter, + signatureProvider: SignatureProvider, val logger: DokkaLogger ) { - protected open val contentBuilder = PageContentBuilder(commentsToContentConverter, logger) + protected open val contentBuilder = PageContentBuilder(commentsToContentConverter, signatureProvider, logger) open fun pageForModule(m: Module) = ModulePageNode(m.name.ifEmpty { "" }, contentForModule(m), m, m.packages.map(::pageForPackage)) @@ -50,21 +52,22 @@ open class DefaultPageCreator( protected open fun contentForPackage(p: Package) = contentBuilder.contentFor(p) { header(1) { text("Package ${p.name}") } - contentForScope(p, p.dri, p.platformData) + +contentForScope(p, p.dri, p.platformData) } - protected open fun PageContentBuilder.DocumentableContentBuilder.contentForScope( + protected open fun contentForScope( s: WithScope, dri: DRI, platformData: List - ) { + ) = contentBuilder.contentFor(s as Documentable) { block("Types", 2, ContentKind.Classlikes, s.classlikes, platformData.toSet()) { link(it.name.orEmpty(), it.dri) + +signature(it) text(it.briefDocTagString) } block("Functions", 2, ContentKind.Functions, s.functions, platformData.toSet()) { link(it.name, it.dri) - signature(it) + +signature(it) text(it.briefDocTagString) } block("Properties", 2, ContentKind.Properties, s.properties, platformData.toSet()) { @@ -74,19 +77,8 @@ open class DefaultPageCreator( } 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, is Object, is Annotation, is Interface -> 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) + +signature(c) + +contentForComments(c) if (c is WithConstructors) { block("Constructors", 2, ContentKind.Constructors, c.constructors, c.platformData.toSet()) { @@ -96,10 +88,10 @@ open class DefaultPageCreator( } } - contentForScope(c, c.dri, c.platformData) + +contentForScope(c, c.dri, c.platformData) } - protected open fun PageContentBuilder.DocumentableContentBuilder.contentForComments(d: Documentable) = + protected open fun contentForComments(d: Documentable) = contentBuilder.contentFor(d) { // TODO: this probably needs fixing d.documentation.forEach { _, documentationNode -> documentationNode.children.forEach { @@ -111,12 +103,12 @@ open class DefaultPageCreator( text("\n") } } - + }.children protected open fun contentForFunction(f: Function) = contentBuilder.contentFor(f) { header(1) { text(f.name) } - signature(f) - contentForComments(f) + +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) } } @@ -124,8 +116,4 @@ open class DefaultPageCreator( } protected open fun TagWrapper.toHeaderString() = this.javaClass.toGenericString().split('.').last() -} - -class A { - companion object F {} } \ 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 8d04e986..eb422920 100644 --- a/plugins/base/src/main/kotlin/translators/documentables/PageContentBuilder.kt +++ b/plugins/base/src/main/kotlin/translators/documentables/PageContentBuilder.kt @@ -1,9 +1,9 @@ package org.jetbrains.dokka.base.translators.documentables +import org.jetbrains.dokka.base.signatures.SignatureProvider import org.jetbrains.dokka.base.transformers.pages.comments.CommentsToContentConverter import org.jetbrains.dokka.links.DRI import org.jetbrains.dokka.model.Documentable -import org.jetbrains.dokka.model.Function import org.jetbrains.dokka.model.TypeWrapper import org.jetbrains.dokka.model.doc.DocTag import org.jetbrains.dokka.pages.* @@ -14,6 +14,7 @@ annotation class ContentBuilderMarker open class PageContentBuilder( val commentsConverter: CommentsToContentConverter, + val signatureProvider: SignatureProvider, val logger: DokkaLogger ) { fun contentFor( @@ -61,6 +62,14 @@ open class PageContentBuilder( extras ) + operator fun ContentNode.unaryPlus() { + contents += this + } + + operator fun Collection.unaryPlus() { + contents += this + } + fun header( level: Int, kind: Kind = ContentKind.Main, @@ -84,31 +93,13 @@ open class PageContentBuilder( contents += createText(text, kind, platformData, styles, extras) } - fun signature(f: Function, block: DocumentableContentBuilder.() -> Unit) { - contents += buildGroup(f.dri, f.platformData.toSet(), ContentKind.Symbol, mainStyles, mainExtras, block) - } - - fun signature(f: Function) = signature(f) { - text("fun ") - f.receiver?.also { - // TODO signature should be rewritten - type(it.type) - text(".") - } - link(f.name, f.dri) - text("(") - list(f.parameters) { - link(it.name!!, it.dri) - text(": ") - type(it.type) - } - text(")") - val returnType = f.type - if (!f.isConstructor && returnType.constructorFqName != Unit::class.qualifiedName) { - text(": ") - type(returnType) - } - } + fun signature(d: Documentable) = ContentGroup( + signatureProvider.signature(d), + DCI(setOf(d.dri), ContentKind.Symbol), + d.platformData.toSet(), + mainStyles, + mainExtras + ) fun linkTable( elements: List, -- cgit From 89c33f431a43caa07365ec69b2b57f3b4e9a01c6 Mon Sep 17 00:00:00 2001 From: Paweł Marks Date: Wed, 4 Mar 2020 00:29:36 +0100 Subject: Big refactor of signature provider --- .../kotlin/signatures/KotlinSignatureProvider.kt | 91 +++++++++++----------- .../main/kotlin/signatures/SignatureProvider.kt | 2 +- .../documentables/DefaultPageCreator.kt | 10 +-- .../documentables/PageContentBuilder.kt | 15 ++-- 4 files changed, 56 insertions(+), 62 deletions(-) (limited to 'plugins/base/src/main/kotlin/signatures/KotlinSignatureProvider.kt') diff --git a/plugins/base/src/main/kotlin/signatures/KotlinSignatureProvider.kt b/plugins/base/src/main/kotlin/signatures/KotlinSignatureProvider.kt index 2d4694bd..0706d387 100644 --- a/plugins/base/src/main/kotlin/signatures/KotlinSignatureProvider.kt +++ b/plugins/base/src/main/kotlin/signatures/KotlinSignatureProvider.kt @@ -2,9 +2,9 @@ package org.jetbrains.dokka.base.signatures import org.jetbrains.dokka.base.transformers.pages.comments.CommentsToContentConverter import org.jetbrains.dokka.base.translators.documentables.PageContentBuilder -import org.jetbrains.dokka.links.DRI import org.jetbrains.dokka.links.sureClassNames import org.jetbrains.dokka.model.* +import org.jetbrains.dokka.model.Annotation import org.jetbrains.dokka.model.Enum import org.jetbrains.dokka.model.Function import org.jetbrains.dokka.pages.ContentKind @@ -15,56 +15,51 @@ import org.jetbrains.dokka.utilities.DokkaLogger class KotlinSignatureProvider(ctcc: CommentsToContentConverter, logger: DokkaLogger) : SignatureProvider { private val contentBuilder = PageContentBuilder(ctcc, this, logger) - override fun signature(documentable: Documentable): List = when (documentable) { + override fun signature(documentable: Documentable): ContentNode = when (documentable) { is Function -> signature(documentable) is Classlike -> signature(documentable) + is TypeParameter -> signature(documentable) else -> throw NotImplementedError( "Cannot generate signature for ${documentable::class.qualifiedName} ${documentable.name}" ) } - private fun signature(f: Function) = f.platformData.map { signature(f, it) }.distinct() - - private fun signature(c: Classlike) = c.platformData.map { signature(c, it) }.distinct() - - private fun signature(c: Classlike, platform: PlatformData) = contentBuilder.contentFor(c, ContentKind.Symbol) { - text(c.visibility[platform]?.externalDisplayName ?: "") + private fun signature(c: Classlike) = contentBuilder.contentFor(c, ContentKind.Symbol) { + platformText(c.visibility) { it.externalDisplayName + " " } if (c is Class) { - text(c.modifier.toString()) + text(c.modifier.toString() + " ") } when (c) { - is Class -> text(" class ") - is Interface -> text(" interface ") - is Enum -> text(" enum ") - is Object -> text(" object ") + is Class -> text("class ") + is Interface -> text("interface ") + is Enum -> text("enum ") + is Object -> text("object ") + is Annotation -> text("annotation class ") } text(c.name!!) if (c is WithSupertypes) { - list(c.supertypes.getValue(platform), prefix = " : ") { - link(it.sureClassNames, it) + c.supertypes.map { (p, dris) -> + list(dris, prefix = " : ", platformData = setOf(p)) { + link(it.sureClassNames, it, platformData = setOf(p)) + } } } } - private fun signature(f: Function, platform: PlatformData) = contentBuilder.contentFor(f, ContentKind.Symbol) { - text(f.visibility[platform]?.externalDisplayName ?: "") - text(f.modifier.toString()) - text(" fun ") + private fun signature(f: Function) = contentBuilder.contentFor(f, ContentKind.Symbol) { + platformText(f.visibility) { it.externalDisplayName + " " } + text(f.modifier.toString() + " ") + text("fun ") f.receiver?.also { type(it.type) text(".") } link(f.name, f.dri) - val generics = f.generics.filterOnPlatform(platform) - if (generics.isNotEmpty()) { - text("<") - generics.forEach { - this@KotlinSignatureProvider.signature(it) - } - text(">") + list(f.generics, prefix = "<", suffix = ">") { + +buildSignature(it) } text("(") - list(f.parameters.filterOnPlatform(platform)) { + list(f.parameters) { link(it.name!!, it.dri) text(": ") type(it.type) @@ -73,41 +68,45 @@ class KotlinSignatureProvider(ctcc: CommentsToContentConverter, logger: DokkaLog val returnType = f.type if (!f.isConstructor && returnType.constructorFqName != Unit::class.qualifiedName) { text(": ") - type(returnType) } } private fun signature(t: TypeParameter) = contentBuilder.contentFor(t, ContentKind.Symbol) { link(t.name, t.dri) - if (t.bounds.isNotEmpty()) { - text("<") - t.bounds.forEach { - signature(it, t.dri, t.platformData) - } - text(">") + list(t.bounds, prefix = " : ") { + signatureForProjection(it) } } - private fun signature(p: Projection, dri: DRI, platforms: List): List = when (p) { - is OtherParameter -> contentBuilder.contentFor(dri, platforms.toSet()) { text(p.name) }.children + private fun PageContentBuilder.DocumentableContentBuilder.signatureForProjection(p: Projection): Unit = when (p) { + is OtherParameter -> text(p.name) - is TypeConstructor -> contentBuilder.contentFor(dri, platforms.toSet()) { + is TypeConstructor -> group { link(p.dri.classNames.orEmpty(), p.dri) - }.children + p.projections.flatMap { signature(it, dri, platforms) } + list(p.projections, prefix = "<", suffix = ">") { + signatureForProjection(it) + } + } - is Variance -> contentBuilder.contentFor(dri, platforms.toSet()) { + is Variance -> group { text(p.kind.toString() + " ") - }.children + signature(p.inner, dri, platforms) + signatureForProjection(p.inner) + } - is Star -> contentBuilder.contentFor(dri, platforms.toSet()) { text("*") }.children + is Star -> text("*") - is Nullable -> signature(p.inner, dri, platforms) + contentBuilder.contentFor( - dri, - platforms.toSet() - ) { text("?") }.children + is Nullable -> group { + signatureForProjection(p.inner) + text("?") + } } private fun Collection.filterOnPlatform(platformData: PlatformData) = this.filter { it.platformData.contains(platformData) } -} \ No newline at end of file +} + +private fun PageContentBuilder.DocumentableContentBuilder.platformText( + value: PlatformDependent, + transform: (T) -> String +) = value.entries.forEach { (p, v) -> text(transform(v), platformData = setOf(p)) } \ No newline at end of file diff --git a/plugins/base/src/main/kotlin/signatures/SignatureProvider.kt b/plugins/base/src/main/kotlin/signatures/SignatureProvider.kt index 738f405a..041015fc 100644 --- a/plugins/base/src/main/kotlin/signatures/SignatureProvider.kt +++ b/plugins/base/src/main/kotlin/signatures/SignatureProvider.kt @@ -4,5 +4,5 @@ import org.jetbrains.dokka.model.Documentable import org.jetbrains.dokka.pages.ContentNode interface SignatureProvider { - fun signature(documentable: Documentable): List + fun signature(documentable: Documentable): ContentNode } \ 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 index 5f3772ce..d92bec19 100644 --- a/plugins/base/src/main/kotlin/translators/documentables/DefaultPageCreator.kt +++ b/plugins/base/src/main/kotlin/translators/documentables/DefaultPageCreator.kt @@ -62,12 +62,12 @@ open class DefaultPageCreator( ) = contentBuilder.contentFor(s as Documentable) { block("Types", 2, ContentKind.Classlikes, s.classlikes, platformData.toSet()) { link(it.name.orEmpty(), it.dri) - +signature(it) + +buildSignature(it) text(it.briefDocTagString) } block("Functions", 2, ContentKind.Functions, s.functions, platformData.toSet()) { link(it.name, it.dri) - +signature(it) + +buildSignature(it) text(it.briefDocTagString) } block("Properties", 2, ContentKind.Properties, s.properties, platformData.toSet()) { @@ -77,13 +77,13 @@ open class DefaultPageCreator( } protected open fun contentForClasslike(c: Classlike) = contentBuilder.contentFor(c) { - +signature(c) + +buildSignature(c) +contentForComments(c) if (c is WithConstructors) { block("Constructors", 2, ContentKind.Constructors, c.constructors, c.platformData.toSet()) { link(it.name, it.dri) - signature(it) + +buildSignature(it) text(it.briefDocTagString) } } @@ -107,7 +107,7 @@ open class DefaultPageCreator( protected open fun contentForFunction(f: Function) = contentBuilder.contentFor(f) { header(1) { text(f.name) } - +signature(f) + +buildSignature(f) +contentForComments(f) block("Parameters", 2, ContentKind.Parameters, f.children, f.platformData.toSet()) { text(it.name ?: "") diff --git a/plugins/base/src/main/kotlin/translators/documentables/PageContentBuilder.kt b/plugins/base/src/main/kotlin/translators/documentables/PageContentBuilder.kt index 0c08241f..369c9c81 100644 --- a/plugins/base/src/main/kotlin/translators/documentables/PageContentBuilder.kt +++ b/plugins/base/src/main/kotlin/translators/documentables/PageContentBuilder.kt @@ -93,13 +93,7 @@ open class PageContentBuilder( contents += createText(text, kind, platformData, styles, extras) } - fun signature(d: Documentable) = ContentGroup( - signatureProvider.signature(d), - DCI(setOf(d.dri), ContentKind.Symbol), - d.platformData.toSet(), - mainStyles, - mainExtras - ) + fun buildSignature(d: Documentable) = signatureProvider.signature(d) fun linkTable( elements: List, @@ -152,16 +146,17 @@ open class PageContentBuilder( prefix: String = "", suffix: String = "", separator: String = ", ", + platformData: Set = mainPlatformData, // TODO: children should be aware of this platform data operation: DocumentableContentBuilder.(T) -> Unit ) { if (elements.isNotEmpty()) { - if (prefix.isNotEmpty()) text(prefix) + if (prefix.isNotEmpty()) text(prefix, platformData = platformData) elements.dropLast(1).forEach { operation(it) - text(separator) + text(separator, platformData = platformData) } operation(elements.last()) - if (suffix.isNotEmpty()) text(suffix) + if (suffix.isNotEmpty()) text(suffix, platformData = platformData) } } -- cgit From ad8d1e01a8d4f1f6066c74f89466f3b33c948f87 Mon Sep 17 00:00:00 2001 From: Paweł Marks Date: Wed, 4 Mar 2020 00:37:56 +0100 Subject: Update of test data --- plugins/base/src/main/kotlin/signatures/KotlinSignatureProvider.kt | 2 +- plugins/base/src/test/resources/expect/test/out/root/fn.html | 2 +- plugins/base/src/test/resources/expect/test/out/root/index.html | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) (limited to 'plugins/base/src/main/kotlin/signatures/KotlinSignatureProvider.kt') diff --git a/plugins/base/src/main/kotlin/signatures/KotlinSignatureProvider.kt b/plugins/base/src/main/kotlin/signatures/KotlinSignatureProvider.kt index 0706d387..3e06dc20 100644 --- a/plugins/base/src/main/kotlin/signatures/KotlinSignatureProvider.kt +++ b/plugins/base/src/main/kotlin/signatures/KotlinSignatureProvider.kt @@ -48,7 +48,7 @@ class KotlinSignatureProvider(ctcc: CommentsToContentConverter, logger: DokkaLog private fun signature(f: Function) = contentBuilder.contentFor(f, ContentKind.Symbol) { platformText(f.visibility) { it.externalDisplayName + " " } - text(f.modifier.toString() + " ") + text(f.modifier.toString().toLowerCase() + " ") text("fun ") f.receiver?.also { type(it.type) diff --git a/plugins/base/src/test/resources/expect/test/out/root/fn.html b/plugins/base/src/test/resources/expect/test/out/root/fn.html index 806730da..cc0ae002 100644 --- a/plugins/base/src/test/resources/expect/test/out/root/fn.html +++ b/plugins/base/src/test/resources/expect/test/out/root/fn.html @@ -14,7 +14,7 @@
//root//fn

fn

-fun fn() +public final fun fn()

Description

Function fn
diff --git a/plugins/base/src/test/resources/expect/test/out/root/index.html b/plugins/base/src/test/resources/expect/test/out/root/index.html index fa51a24a..81f2bcc2 100644 --- a/plugins/base/src/test/resources/expect/test/out/root/index.html +++ b/plugins/base/src/test/resources/expect/test/out/root/index.html @@ -20,7 +20,7 @@ fn - fun fn() + public final fun fn() Function fn -- cgit From 1ed877e8b51ec586a2976e8088e34d17de82fc52 Mon Sep 17 00:00:00 2001 From: Paweł Marks Date: Wed, 4 Mar 2020 14:07:57 +0100 Subject: Now signature provider uses new visibility model --- core/src/main/kotlin/model/Documentable.kt | 22 +++++++++++----------- .../kotlin/signatures/KotlinSignatureProvider.kt | 13 +++++++------ .../test/resources/expect/test/out/root/fn.html | 2 +- .../test/resources/expect/test/out/root/index.html | 2 +- 4 files changed, 20 insertions(+), 19 deletions(-) (limited to 'plugins/base/src/main/kotlin/signatures/KotlinSignatureProvider.kt') diff --git a/core/src/main/kotlin/model/Documentable.kt b/core/src/main/kotlin/model/Documentable.kt index aeb10bee..9116b6e6 100644 --- a/core/src/main/kotlin/model/Documentable.kt +++ b/core/src/main/kotlin/model/Documentable.kt @@ -351,19 +351,19 @@ fun Documentable.dfs(predicate: (Documentable) -> Boolean): Documentable? = this.children.asSequence().mapNotNull { it.dfs(predicate) }.firstOrNull() } -sealed class Visibility -sealed class KotlinVisibility : Visibility() { - object Public : KotlinVisibility() - object Private : KotlinVisibility() - object Protected : KotlinVisibility() - object Internal : KotlinVisibility() +sealed class Visibility(val name: String) +sealed class KotlinVisibility(name: String) : Visibility(name) { + object Public : KotlinVisibility("public") + object Private : KotlinVisibility("private") + object Protected : KotlinVisibility("protected") + object Internal : KotlinVisibility("internal") } -sealed class JavaVisibility : Visibility() { - object Public : JavaVisibility() - object Private : JavaVisibility() - object Protected : JavaVisibility() - object Default : JavaVisibility() +sealed class JavaVisibility(name: String) : Visibility(name) { + object Public : JavaVisibility("public") + object Private : JavaVisibility("private") + object Protected : JavaVisibility("protected") + object Default : JavaVisibility("") } fun PlatformDependent?.orEmpty(): PlatformDependent = this ?: PlatformDependent.empty() diff --git a/plugins/base/src/main/kotlin/signatures/KotlinSignatureProvider.kt b/plugins/base/src/main/kotlin/signatures/KotlinSignatureProvider.kt index 3e06dc20..cfca20b0 100644 --- a/plugins/base/src/main/kotlin/signatures/KotlinSignatureProvider.kt +++ b/plugins/base/src/main/kotlin/signatures/KotlinSignatureProvider.kt @@ -15,6 +15,8 @@ import org.jetbrains.dokka.utilities.DokkaLogger class KotlinSignatureProvider(ctcc: CommentsToContentConverter, logger: DokkaLogger) : SignatureProvider { private val contentBuilder = PageContentBuilder(ctcc, this, logger) + private val ignoredVisibilities = setOf(JavaVisibility.Default, KotlinVisibility.Public) + override fun signature(documentable: Documentable): ContentNode = when (documentable) { is Function -> signature(documentable) is Classlike -> signature(documentable) @@ -25,7 +27,7 @@ class KotlinSignatureProvider(ctcc: CommentsToContentConverter, logger: DokkaLog } private fun signature(c: Classlike) = contentBuilder.contentFor(c, ContentKind.Symbol) { - platformText(c.visibility) { it.externalDisplayName + " " } + platformText(c.visibility) { (it.takeIf { it !in ignoredVisibilities }?.name ?: "") + " " } if (c is Class) { text(c.modifier.toString() + " ") } @@ -47,7 +49,7 @@ class KotlinSignatureProvider(ctcc: CommentsToContentConverter, logger: DokkaLog } private fun signature(f: Function) = contentBuilder.contentFor(f, ContentKind.Symbol) { - platformText(f.visibility) { it.externalDisplayName + " " } + platformText(f.visibility) { (it.takeIf { it !in ignoredVisibilities }?.name ?: "") + " " } text(f.modifier.toString().toLowerCase() + " ") text("fun ") f.receiver?.also { @@ -101,12 +103,11 @@ class KotlinSignatureProvider(ctcc: CommentsToContentConverter, logger: DokkaLog text("?") } } - - private fun Collection.filterOnPlatform(platformData: PlatformData) = - this.filter { it.platformData.contains(platformData) } } private fun PageContentBuilder.DocumentableContentBuilder.platformText( value: PlatformDependent, transform: (T) -> String -) = value.entries.forEach { (p, v) -> text(transform(v), platformData = setOf(p)) } \ No newline at end of file +) = value.entries.forEach { (p, v) -> + transform(v).takeIf { it.isNotBlank() }?.also { text(it, platformData = setOf(p)) } +} \ No newline at end of file diff --git a/plugins/base/src/test/resources/expect/test/out/root/fn.html b/plugins/base/src/test/resources/expect/test/out/root/fn.html index cc0ae002..e87d7bc4 100644 --- a/plugins/base/src/test/resources/expect/test/out/root/fn.html +++ b/plugins/base/src/test/resources/expect/test/out/root/fn.html @@ -14,7 +14,7 @@
//root//fn

fn

-public final fun fn() +final fun fn()

Description

Function fn
diff --git a/plugins/base/src/test/resources/expect/test/out/root/index.html b/plugins/base/src/test/resources/expect/test/out/root/index.html index 81f2bcc2..25c65b11 100644 --- a/plugins/base/src/test/resources/expect/test/out/root/index.html +++ b/plugins/base/src/test/resources/expect/test/out/root/index.html @@ -20,7 +20,7 @@ fn - public final fun fn() + final fun fn() Function fn -- cgit From ea0945efe8c7b5dd9aabc4f049afaac612b70422 Mon Sep 17 00:00:00 2001 From: Kamil Doległo Date: Wed, 4 Mar 2020 16:50:40 +0100 Subject: Fix some DRI translations --- .../kotlin/signatures/KotlinSignatureProvider.kt | 7 -- .../documentables/PageContentBuilder.kt | 9 +++ .../src/main/kotlin/JavaSignatureProvider.kt | 88 ++++++++++------------ .../kotlin/converters/KotlinToJavaConverter.kt | 81 ++++++++++++++++---- 4 files changed, 114 insertions(+), 71 deletions(-) (limited to 'plugins/base/src/main/kotlin/signatures/KotlinSignatureProvider.kt') diff --git a/plugins/base/src/main/kotlin/signatures/KotlinSignatureProvider.kt b/plugins/base/src/main/kotlin/signatures/KotlinSignatureProvider.kt index cfca20b0..97445b2b 100644 --- a/plugins/base/src/main/kotlin/signatures/KotlinSignatureProvider.kt +++ b/plugins/base/src/main/kotlin/signatures/KotlinSignatureProvider.kt @@ -104,10 +104,3 @@ class KotlinSignatureProvider(ctcc: CommentsToContentConverter, logger: DokkaLog } } } - -private fun PageContentBuilder.DocumentableContentBuilder.platformText( - value: PlatformDependent, - transform: (T) -> String -) = value.entries.forEach { (p, v) -> - transform(v).takeIf { it.isNotBlank() }?.also { text(it, platformData = setOf(p)) } -} \ 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 ef1b8ec1..b9e20919 100644 --- a/plugins/base/src/main/kotlin/translators/documentables/PageContentBuilder.kt +++ b/plugins/base/src/main/kotlin/translators/documentables/PageContentBuilder.kt @@ -4,6 +4,7 @@ import org.jetbrains.dokka.base.signatures.SignatureProvider import org.jetbrains.dokka.base.transformers.pages.comments.CommentsToContentConverter import org.jetbrains.dokka.links.DRI import org.jetbrains.dokka.model.Documentable +import org.jetbrains.dokka.model.PlatformDependent import org.jetbrains.dokka.model.TypeWrapper import org.jetbrains.dokka.model.doc.DocTag import org.jetbrains.dokka.model.properties.PropertyContainer @@ -264,5 +265,13 @@ open class PageContentBuilder( type(it) } } + + + fun platformText( + value: PlatformDependent, + transform: (T) -> String + ) = value.entries.forEach { (p, v) -> + transform(v).takeIf { it.isNotBlank() }?.also { text(it, platformData = setOf(p)) } + } } } \ No newline at end of file diff --git a/plugins/kotlin-as-java/src/main/kotlin/JavaSignatureProvider.kt b/plugins/kotlin-as-java/src/main/kotlin/JavaSignatureProvider.kt index 2e3ec152..8e2c783e 100644 --- a/plugins/kotlin-as-java/src/main/kotlin/JavaSignatureProvider.kt +++ b/plugins/kotlin-as-java/src/main/kotlin/JavaSignatureProvider.kt @@ -3,7 +3,6 @@ package org.jetbrains.dokka.kotlinAsJava import org.jetbrains.dokka.base.signatures.SignatureProvider import org.jetbrains.dokka.base.transformers.pages.comments.CommentsToContentConverter import org.jetbrains.dokka.base.translators.documentables.PageContentBuilder -import org.jetbrains.dokka.links.DRI import org.jetbrains.dokka.links.sureClassNames import org.jetbrains.dokka.model.* import org.jetbrains.dokka.model.Annotation @@ -17,48 +16,50 @@ import org.jetbrains.dokka.utilities.DokkaLogger class JavaSignatureProvider(ctcc: CommentsToContentConverter, logger: DokkaLogger) : SignatureProvider { private val contentBuilder = PageContentBuilder(ctcc, this, logger) - override fun signature(documentable: Documentable): List = when (documentable) { + private val ignoredVisibilities = setOf(JavaVisibility.Default, KotlinVisibility.Public) + private val ignoredModifiers = + setOf(WithAbstraction.Modifier.Open, WithAbstraction.Modifier.Empty, WithAbstraction.Modifier.Sealed) + + + override fun signature(documentable: Documentable): ContentNode = when (documentable) { is Function -> signature(documentable) is Classlike -> signature(documentable) + is TypeParameter -> signature(documentable) else -> throw NotImplementedError( "Cannot generate signature for ${documentable::class.qualifiedName} ${documentable.name}" ) } - private fun signature(f: Function) = f.platformData.map { signature(f, it) }.distinct() - - private fun signature(c: Classlike) = c.platformData.map { signature(c, it) }.distinct() + private fun signature(c: Classlike) = contentBuilder.contentFor(c, ContentKind.Symbol) { + platformText(c.visibility) { (it.takeIf { it !in ignoredVisibilities }?.name ?: "") + " " } - private fun signature(c: Classlike, platform: PlatformData) = contentBuilder.contentFor(c, ContentKind.Symbol) { if (c is Class) { - text(c.modifier.takeIf { it != WithAbstraction.Modifier.Empty }?.toString()?.toLowerCase().orEmpty()) + text(c.modifier.takeIf { it !in ignoredModifiers }?.toString()?.toLowerCase().orEmpty() + " ") } + when (c) { - is Class -> text(" class ") - is Interface -> text(" interface ") - is Enum -> text(" enum ") - is Object -> text(" class ") - is Annotation -> text(" @interface ") + is Class -> text("class ") + is Interface -> text("interface ") + is Enum -> text("enum ") + is Object -> text("class ") + is Annotation -> text("@interface ") } text(c.name!!) if (c is WithGenerics) { - val generics = c.generics.filterOnPlatform(platform) - if (generics.isNotEmpty()) { - text("<") - list(generics) { - +this@JavaSignatureProvider.signature(it) - } - text(">") + list(c.generics, prefix = "<", suffix = ">") { + +buildSignature(it) } } - if (c is WithSupertypes && c.supertypes.containsKey(platform)) { - list(c.supertypes.getValue(platform), prefix = " extends ") { - link(it.sureClassNames, it) + if (c is WithSupertypes) { + c.supertypes.map { (p, dris) -> + list(dris, prefix = " extends ", platformData = setOf(p)) { + link(it.sureClassNames, it, platformData = setOf(p)) + } } } } - private fun signature(f: Function, platform: PlatformData) = contentBuilder.contentFor(f, ContentKind.Symbol) { + private fun signature(f: Function) = contentBuilder.contentFor(f, ContentKind.Symbol) { text(f.modifier.takeIf { it != WithAbstraction.Modifier.Empty }?.toString()?.toLowerCase().orEmpty() + " ") val returnType = f.type if (!f.isConstructor && returnType.constructorFqName != Unit::class.qualifiedName) { @@ -66,16 +67,11 @@ class JavaSignatureProvider(ctcc: CommentsToContentConverter, logger: DokkaLogge } text(" ") link(f.name, f.dri) - val generics = f.generics.filterOnPlatform(platform) - if (generics.isNotEmpty()) { - text("<") - generics.forEach { - this@JavaSignatureProvider.signature(it) - } - text(">") + list(f.generics, prefix = "<", suffix = ">") { + +buildSignature(it) } text("(") - list(f.parameters.filterOnPlatform(platform)) { + list(f.parameters) { type(it.type) text(" ") link(it.name!!, it.dri) @@ -85,34 +81,30 @@ class JavaSignatureProvider(ctcc: CommentsToContentConverter, logger: DokkaLogge private fun signature(t: TypeParameter) = contentBuilder.contentFor(t, ContentKind.Symbol) { text(t.name.substringAfterLast(".")) - if (t.bounds.isNotEmpty()) { - text(" extends ") - t.bounds.forEach { - +signature(it, t.dri, t.platformData) - } + list(t.bounds, prefix = " extends ") { + signatureForProjection(it) } } - private fun signature(p: Projection, dri: DRI, platforms: List): List = when (p) { - is OtherParameter -> contentBuilder.contentFor(dri, platforms.toSet()) { text(p.name) }.children - is TypeConstructor -> contentBuilder.contentFor(dri, platforms.toSet()) { + private fun PageContentBuilder.DocumentableContentBuilder.signatureForProjection(p: Projection): Unit = when (p) { + is OtherParameter -> text(p.name) + + is TypeConstructor -> group { link(p.dri.classNames.orEmpty(), p.dri) list(p.projections, prefix = "<", suffix = ">") { - +signature(it, dri, platforms) + signatureForProjection(it) } - }.children + } - is Variance -> contentBuilder.contentFor(dri, platforms.toSet()) { + is Variance -> group { text(p.kind.toString() + " ") - }.children + signature(p.inner, dri, platforms) + signatureForProjection(p.inner) + } - is Star -> contentBuilder.contentFor(dri, platforms.toSet()) { text("?") }.children + is Star -> text("?") - is Nullable -> signature(p.inner, dri, platforms) + contentBuilder.contentFor( - dri, - platforms.toSet() - ) { text("?") }.children + is Nullable -> signatureForProjection(p.inner) } private fun Collection.filterOnPlatform(platformData: PlatformData) = diff --git a/plugins/kotlin-as-java/src/main/kotlin/converters/KotlinToJavaConverter.kt b/plugins/kotlin-as-java/src/main/kotlin/converters/KotlinToJavaConverter.kt index f7fc57ff..a8b45db0 100644 --- a/plugins/kotlin-as-java/src/main/kotlin/converters/KotlinToJavaConverter.kt +++ b/plugins/kotlin-as-java/src/main/kotlin/converters/KotlinToJavaConverter.kt @@ -16,7 +16,9 @@ import org.jetbrains.kotlin.resolve.jvm.JvmPrimitiveType private fun List.groupedByLocation() = map { it.sources to it } .groupBy({ (location, _) -> - location.let { it.map.entries.first().value.path.split("/").last().split(".").first() + "Kt" } // TODO: first() does not look reasonable + location.let { + it.map.entries.first().value.path.split("/").last().split(".").first() + "Kt" + } // TODO: first() does not look reasonable }) { it.second } internal fun Package.asJava(): Package { @@ -61,16 +63,19 @@ internal fun Property.asJava(isTopLevel: Boolean = false, relocateToClass: Strin } else { dri.withClass(relocateToClass) }, -// name = name.o, modifier = if (setter == null) { WithAbstraction.Modifier.Final } else { WithAbstraction.Modifier.Empty }, - type = type.asJava(isTopLevel), // TODO: check, + visibility = visibility.copy( + map = visibility.mapValues { JavaVisibility.Private } + ), + type = type.asJava(isTopLevel), // TODO: check setter = null, - getter = null // Removing getters and setters as they will be available as functions - ) // TODO: visibility -> always private; if (isTopLevel) -> static + getter = null, // Removing getters and setters as they will be available as functions + extra = if (isTopLevel) extra.plus(extra.mergeAdditionalModifiers(listOf(ExtraModifiers.STATIC))) else extra + ) internal fun Property.javaAccessors(isTopLevel: Boolean = false, relocateToClass: String? = null): List = listOfNotNull( @@ -86,7 +91,11 @@ internal fun Property.javaAccessors(isTopLevel: Boolean = false, relocateToClass } else { WithAbstraction.Modifier.Empty }, - type = type.asJava(isTopLevel) // TODO: check, + visibility = visibility.copy( + map = visibility.mapValues { JavaVisibility.Public } + ), + type = type.asJava(isTopLevel), // TODO: check + extra = if (isTopLevel) getter!!.extra.plus(getter!!.extra.mergeAdditionalModifiers(listOf(ExtraModifiers.STATIC))) else getter!!.extra ), setter?.copy( dri = if (relocateToClass.isNullOrBlank()) { @@ -100,9 +109,13 @@ internal fun Property.javaAccessors(isTopLevel: Boolean = false, relocateToClass } else { WithAbstraction.Modifier.Empty }, - type = type.asJava(isTopLevel) // TODO: check, + visibility = visibility.copy( + map = visibility.mapValues { JavaVisibility.Public } + ), + type = type.asJava(isTopLevel), // TODO: check + extra = if (isTopLevel) setter!!.extra.plus(setter!!.extra.mergeAdditionalModifiers(listOf(ExtraModifiers.STATIC))) else setter!!.extra ) - ) // TODO: if (isTopLevel) -> static; visibility -> always? public + ) internal fun Function.asJava(containingClassName: String): Function { @@ -134,18 +147,38 @@ internal fun Class.asJava(): Class = copy( it.asJava(name) }, properties = properties.map { it.asJava() }, - classlikes = classlikes.map { it.asJava() } + classlikes = classlikes.map { it.asJava() }, + generics = generics.map { it.asJava() }, + supertypes = supertypes.copy( + map = supertypes.mapValues { it.value.map { it.possiblyAsJava() } } + ) ) // TODO: if modifier is from Kotlin, then Empty -> Final I think, Java ones stay the same +private fun TypeParameter.asJava(): TypeParameter = copy( + dri = dri.possiblyAsJava(), + bounds = bounds.map { it.asJava() } +) + +private fun Bound.asJava(): Bound = when (this) { + is TypeConstructor -> copy( + dri = dri.possiblyAsJava() + ) + is Nullable -> copy( + inner = inner.asJava() + ) + else -> this +} + internal fun Enum.asJava(): Enum = copy( constructors = constructors.map { it.asJava(name) }, functions = (functions + properties.map { it.getter } + properties.map { it.setter }).filterNotNull().map { - it.asJava( - name - ) + it.asJava(name) }, properties = properties.map { it.asJava() }, - classlikes = classlikes.map { it.asJava() } + classlikes = classlikes.map { it.asJava() }, + supertypes = supertypes.copy( + map = supertypes.mapValues { it.value.map { it.possiblyAsJava() } } + ) // , entries = entries.map { it.asJava() } ) // TODO: if modifier is from Kotlin, then Empty -> Final I think, Java ones stay the same @@ -173,7 +206,10 @@ internal fun Object.asJava(): Object = copy( platformData = platformData, receiver = null ), - classlikes = classlikes.map { it.asJava() } + classlikes = classlikes.map { it.asJava() }, + supertypes = supertypes.copy( + map = supertypes.mapValues { it.value.map { it.possiblyAsJava() } } + ) ) internal fun Interface.asJava(): Interface = copy( @@ -181,7 +217,11 @@ internal fun Interface.asJava(): Interface = copy( .filterNotNull() .map { it.asJava(name) }, properties = emptyList(), - classlikes = classlikes.map { it.asJava() } // TODO: public static final class DefaultImpls with impls for methods (killme please) + classlikes = classlikes.map { it.asJava() }, // TODO: public static final class DefaultImpls with impls for methods + generics = generics.map { it.asJava() }, + supertypes = supertypes.copy( + map = supertypes.mapValues { it.value.map { it.possiblyAsJava() } } + ) ) internal fun Annotation.asJava(): Annotation = copy( @@ -215,8 +255,11 @@ internal fun TypeWrapper.getAsType(classId: ClassId, fqName: String, top: Boolea ) } +private fun DRI.partialFqName() = packageName?.let { "$it." } + classNames +private fun DRI.possiblyAsJava() = this.partialFqName().mapToJava()?.toDRI(this) ?: this + internal fun TypeWrapper.asJava(top: Boolean = true): TypeWrapper = constructorFqName - ?.takeUnless { it.endsWith(".Unit") } // TODO: ??? +// ?.takeUnless { it.endsWith(".Unit") } // TODO: ??? ?.let { fqName -> fqName.mapToJava()?.let { getAsType(it, fqName, top) } } ?: this @@ -231,6 +274,12 @@ internal fun ClassId.toDRI(dri: DRI?): DRI = DRI( target = null ) +private fun PropertyContainer.mergeAdditionalModifiers(second: List) = + this[AdditionalModifiers.AdditionalKey]?.squash(AdditionalModifiers(second)) ?: AdditionalModifiers(second) + +private fun AdditionalModifiers.squash(second: AdditionalModifiers) = + AdditionalModifiers((content + second.content).distinct()) + internal fun ClassId.classNames(): String = shortClassName.identifier + (outerClassId?.classNames()?.let { ".$it" } ?: "") -- cgit From fc875fe5f8bc52ac75053db097b3349465705732 Mon Sep 17 00:00:00 2001 From: Kamil Doległo Date: Wed, 4 Mar 2020 17:04:50 +0100 Subject: Refactor Modifiers --- core/src/main/kotlin/model/Documentable.kt | 25 +++++++++++++----- .../kotlin/signatures/KotlinSignatureProvider.kt | 4 +-- .../DefaultDescriptorToDocumentableTranslator.kt | 10 ++++---- .../psi/DefaultPsiToDocumentableTranslator.kt | 6 ++--- .../src/main/kotlin/JavaSignatureProvider.kt | 6 ++--- .../kotlin/converters/KotlinToJavaConverter.kt | 30 +++++++--------------- 6 files changed, 40 insertions(+), 41 deletions(-) (limited to 'plugins/base/src/main/kotlin/signatures/KotlinSignatureProvider.kt') diff --git a/core/src/main/kotlin/model/Documentable.kt b/core/src/main/kotlin/model/Documentable.kt index 9116b6e6..d073d39a 100644 --- a/core/src/main/kotlin/model/Documentable.kt +++ b/core/src/main/kotlin/model/Documentable.kt @@ -73,10 +73,21 @@ interface WithType { interface WithAbstraction { val modifier: Modifier +} - enum class Modifier { - Abstract, Open, Final, Sealed, Empty - } +sealed class Modifier(val name: String) +sealed class KotlinModifier(name: String) : Modifier(name) { + object Abstract : KotlinModifier("abstract") + object Open : KotlinModifier("open") + object Final : KotlinModifier("final") + object Sealed : KotlinModifier("sealed") + object Empty : KotlinModifier("") +} + +sealed class JavaModifier(name: String) : Modifier(name) { + object Abstract : JavaModifier("abstract") + object Final : JavaModifier("final") + object Empty : JavaModifier("") } interface WithCompanion { @@ -145,7 +156,7 @@ data class Class( override val generics: List, override val supertypes: PlatformDependent>, override val documentation: PlatformDependent, - override val modifier: WithAbstraction.Modifier, + override val modifier: Modifier, override val platformData: List, override val extra: PropertyContainer = PropertyContainer.empty() ) : Classlike(), WithAbstraction, WithCompanion, WithConstructors, WithGenerics, WithSupertypes, @@ -206,7 +217,7 @@ data class Function( override val type: TypeWrapper, override val generics: List, override val receiver: Parameter?, - override val modifier: WithAbstraction.Modifier, + override val modifier: Modifier, override val platformData: List, override val extra: PropertyContainer = PropertyContainer.empty() ) : Documentable(), Callable, WithGenerics, WithExtraProperties { @@ -286,7 +297,7 @@ data class Property( override val receiver: Parameter?, val setter: Function?, val getter: Function?, - override val modifier: WithAbstraction.Modifier, + override val modifier: Modifier, override val platformData: List, override val extra: PropertyContainer = PropertyContainer.empty() ) : Documentable(), Callable, WithExtraProperties { @@ -331,7 +342,7 @@ data class OtherParameter(val name: String) : Bound() object Star : Projection() data class TypeConstructor(val dri: DRI, val projections: List) : Bound() data class Nullable(val inner: Bound) : Bound() -data class Variance(val kind: Kind, val inner: Bound): Projection() { +data class Variance(val kind: Kind, val inner: Bound) : Projection() { enum class Kind { In, Out } } diff --git a/plugins/base/src/main/kotlin/signatures/KotlinSignatureProvider.kt b/plugins/base/src/main/kotlin/signatures/KotlinSignatureProvider.kt index 97445b2b..c8a5105d 100644 --- a/plugins/base/src/main/kotlin/signatures/KotlinSignatureProvider.kt +++ b/plugins/base/src/main/kotlin/signatures/KotlinSignatureProvider.kt @@ -29,7 +29,7 @@ class KotlinSignatureProvider(ctcc: CommentsToContentConverter, logger: DokkaLog private fun signature(c: Classlike) = contentBuilder.contentFor(c, ContentKind.Symbol) { platformText(c.visibility) { (it.takeIf { it !in ignoredVisibilities }?.name ?: "") + " " } if (c is Class) { - text(c.modifier.toString() + " ") + text(c.modifier.name + " ") } when (c) { is Class -> text("class ") @@ -50,7 +50,7 @@ class KotlinSignatureProvider(ctcc: CommentsToContentConverter, logger: DokkaLog private fun signature(f: Function) = contentBuilder.contentFor(f, ContentKind.Symbol) { platformText(f.visibility) { (it.takeIf { it !in ignoredVisibilities }?.name ?: "") + " " } - text(f.modifier.toString().toLowerCase() + " ") + text(f.modifier.name + " ") text("fun ") f.receiver?.also { type(it.type) diff --git a/plugins/base/src/main/kotlin/translators/descriptors/DefaultDescriptorToDocumentableTranslator.kt b/plugins/base/src/main/kotlin/translators/descriptors/DefaultDescriptorToDocumentableTranslator.kt index f30ffa00..29441ac1 100644 --- a/plugins/base/src/main/kotlin/translators/descriptors/DefaultDescriptorToDocumentableTranslator.kt +++ b/plugins/base/src/main/kotlin/translators/descriptors/DefaultDescriptorToDocumentableTranslator.kt @@ -434,11 +434,11 @@ private class DokkaDescriptorVisitor( // TODO: close this class and make it priv } fun MemberDescriptor.modifier() = when (modality) { - Modality.FINAL -> WithAbstraction.Modifier.Final - Modality.SEALED -> WithAbstraction.Modifier.Sealed - Modality.OPEN -> WithAbstraction.Modifier.Open - Modality.ABSTRACT -> WithAbstraction.Modifier.Abstract - else -> WithAbstraction.Modifier.Empty + Modality.FINAL -> KotlinModifier.Final + Modality.SEALED -> KotlinModifier.Sealed + Modality.OPEN -> KotlinModifier.Open + Modality.ABSTRACT -> KotlinModifier.Abstract + else -> KotlinModifier.Empty } private fun MemberDescriptor.createSources(): PlatformDependent = if (isExpect()) { diff --git a/plugins/base/src/main/kotlin/translators/psi/DefaultPsiToDocumentableTranslator.kt b/plugins/base/src/main/kotlin/translators/psi/DefaultPsiToDocumentableTranslator.kt index 6b25639f..81de12eb 100644 --- a/plugins/base/src/main/kotlin/translators/psi/DefaultPsiToDocumentableTranslator.kt +++ b/plugins/base/src/main/kotlin/translators/psi/DefaultPsiToDocumentableTranslator.kt @@ -243,9 +243,9 @@ object DefaultPsiToDocumentableTranslator : PsiToDocumentableTranslator { } private fun PsiModifierListOwner.getModifier() = when { - hasModifier(JvmModifier.ABSTRACT) -> WithAbstraction.Modifier.Abstract - hasModifier(JvmModifier.FINAL) -> WithAbstraction.Modifier.Final - else -> WithAbstraction.Modifier.Empty + hasModifier(JvmModifier.ABSTRACT) -> JavaModifier.Abstract + hasModifier(JvmModifier.FINAL) -> JavaModifier.Final + else -> JavaModifier.Empty } private fun PsiTypeParameterListOwner.mapTypeParameters(dri: DRI): List { diff --git a/plugins/kotlin-as-java/src/main/kotlin/JavaSignatureProvider.kt b/plugins/kotlin-as-java/src/main/kotlin/JavaSignatureProvider.kt index 8e2c783e..06224a7a 100644 --- a/plugins/kotlin-as-java/src/main/kotlin/JavaSignatureProvider.kt +++ b/plugins/kotlin-as-java/src/main/kotlin/JavaSignatureProvider.kt @@ -18,7 +18,7 @@ class JavaSignatureProvider(ctcc: CommentsToContentConverter, logger: DokkaLogge private val ignoredVisibilities = setOf(JavaVisibility.Default, KotlinVisibility.Public) private val ignoredModifiers = - setOf(WithAbstraction.Modifier.Open, WithAbstraction.Modifier.Empty, WithAbstraction.Modifier.Sealed) + setOf(KotlinModifier.Open, JavaModifier.Empty, KotlinModifier.Empty, KotlinModifier.Sealed) override fun signature(documentable: Documentable): ContentNode = when (documentable) { @@ -34,7 +34,7 @@ class JavaSignatureProvider(ctcc: CommentsToContentConverter, logger: DokkaLogge platformText(c.visibility) { (it.takeIf { it !in ignoredVisibilities }?.name ?: "") + " " } if (c is Class) { - text(c.modifier.takeIf { it !in ignoredModifiers }?.toString()?.toLowerCase().orEmpty() + " ") + text(c.modifier.takeIf { it !in ignoredModifiers }?.name.orEmpty() + " ") } when (c) { @@ -60,7 +60,7 @@ class JavaSignatureProvider(ctcc: CommentsToContentConverter, logger: DokkaLogge } private fun signature(f: Function) = contentBuilder.contentFor(f, ContentKind.Symbol) { - text(f.modifier.takeIf { it != WithAbstraction.Modifier.Empty }?.toString()?.toLowerCase().orEmpty() + " ") + text(f.modifier.takeIf { it !in ignoredModifiers }?.name.orEmpty() + " ") val returnType = f.type if (!f.isConstructor && returnType.constructorFqName != Unit::class.qualifiedName) { type(returnType) diff --git a/plugins/kotlin-as-java/src/main/kotlin/converters/KotlinToJavaConverter.kt b/plugins/kotlin-as-java/src/main/kotlin/converters/KotlinToJavaConverter.kt index a8b45db0..7c66e91f 100644 --- a/plugins/kotlin-as-java/src/main/kotlin/converters/KotlinToJavaConverter.kt +++ b/plugins/kotlin-as-java/src/main/kotlin/converters/KotlinToJavaConverter.kt @@ -42,7 +42,7 @@ internal fun Package.asJava(): Package { generics = emptyList(), supertypes = PlatformDependent.empty(), documentation = PlatformDependent.empty(), - modifier = WithAbstraction.Modifier.Final, + modifier = JavaModifier.Final, platformData = platformData, extra = PropertyContainer.empty() ) @@ -64,9 +64,9 @@ internal fun Property.asJava(isTopLevel: Boolean = false, relocateToClass: Strin dri.withClass(relocateToClass) }, modifier = if (setter == null) { - WithAbstraction.Modifier.Final + JavaModifier.Final } else { - WithAbstraction.Modifier.Empty + JavaModifier.Empty }, visibility = visibility.copy( map = visibility.mapValues { JavaVisibility.Private } @@ -87,9 +87,9 @@ internal fun Property.javaAccessors(isTopLevel: Boolean = false, relocateToClass }, name = "get" + name.capitalize(), modifier = if (setter == null) { - WithAbstraction.Modifier.Final + JavaModifier.Final } else { - WithAbstraction.Modifier.Empty + JavaModifier.Empty }, visibility = visibility.copy( map = visibility.mapValues { JavaVisibility.Public } @@ -105,9 +105,9 @@ internal fun Property.javaAccessors(isTopLevel: Boolean = false, relocateToClass }, name = "set" + name.capitalize(), modifier = if (setter == null) { - WithAbstraction.Modifier.Final + JavaModifier.Final } else { - WithAbstraction.Modifier.Empty + JavaModifier.Empty }, visibility = visibility.copy( map = visibility.mapValues { JavaVisibility.Public } @@ -189,7 +189,7 @@ internal fun Object.asJava(): Object = copy( properties = properties.map { it.asJava() } + Property( name = "INSTANCE", - modifier = WithAbstraction.Modifier.Final, + modifier = JavaModifier.Final, dri = dri.copy(callable = Callable("INSTANCE", null, emptyList())), documentation = PlatformDependent.empty(), sources = PlatformDependent.empty(), @@ -281,16 +281,4 @@ private fun AdditionalModifiers.squash(second: AdditionalModifiers) = AdditionalModifiers((content + second.content).distinct()) internal fun ClassId.classNames(): String = - shortClassName.identifier + (outerClassId?.classNames()?.let { ".$it" } ?: "") - -//fun TypeConstructor.asJava(): TypeReference = -// fullyQualifiedName.mapToJava() -// ?.let { tc.copy(fullyQualifiedName = it.asString(), params = tc.params.map { it.asJava() }) } ?: tc - -//fun TypeParam.asJava(): TypeReference = copy(bounds = bounds.map { it.asJava() }) - -//fun TypeReference.asJava(): TypeReference = when (this) { -// is TypeConstructor -> asJava() -// is TypeParam -> asJava() -// else -> this -//} \ No newline at end of file + shortClassName.identifier + (outerClassId?.classNames()?.let { ".$it" } ?: "") \ No newline at end of file -- cgit From f48bffb05efcfd03cf72189ab13472c196f2a948 Mon Sep 17 00:00:00 2001 From: Błażej Kardyś Date: Wed, 11 Mar 2020 15:23:41 +0100 Subject: Fixing signatures font, incorrect links and line breaking --- core/src/main/kotlin/pages/ContentNodes.kt | 6 +++--- core/src/main/resources/dokka/styles/style.css | 4 ++-- .../base/src/main/kotlin/renderers/html/HtmlRenderer.kt | 14 +++++++++----- .../src/main/kotlin/signatures/KotlinSignatureProvider.kt | 11 ++++++----- .../pages/comments/DocTagToContentConverter.kt | 1 - .../kotlin/translators/documentables/DefaultPageCreator.kt | 2 ++ .../kotlin/translators/documentables/PageContentBuilder.kt | 4 ++++ 7 files changed, 26 insertions(+), 16 deletions(-) (limited to 'plugins/base/src/main/kotlin/signatures/KotlinSignatureProvider.kt') diff --git a/core/src/main/kotlin/pages/ContentNodes.kt b/core/src/main/kotlin/pages/ContentNodes.kt index 414fac4a..eeefc3b9 100644 --- a/core/src/main/kotlin/pages/ContentNodes.kt +++ b/core/src/main/kotlin/pages/ContentNodes.kt @@ -26,8 +26,8 @@ data class ContentText( } data class ContentBreakLine( - override val dci: DCI, override val platforms: Set, + override val dci: DCI = DCI(emptySet(), ContentKind.Empty), override val style: Set