aboutsummaryrefslogtreecommitdiff
path: root/plugins/base/src/main/kotlin/signatures/KotlinSignatureProvider.kt
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/base/src/main/kotlin/signatures/KotlinSignatureProvider.kt')
-rw-r--r--plugins/base/src/main/kotlin/signatures/KotlinSignatureProvider.kt188
1 files changed, 116 insertions, 72 deletions
diff --git a/plugins/base/src/main/kotlin/signatures/KotlinSignatureProvider.kt b/plugins/base/src/main/kotlin/signatures/KotlinSignatureProvider.kt
index 617af959..4c689abc 100644
--- a/plugins/base/src/main/kotlin/signatures/KotlinSignatureProvider.kt
+++ b/plugins/base/src/main/kotlin/signatures/KotlinSignatureProvider.kt
@@ -6,16 +6,20 @@ import org.jetbrains.dokka.links.*
import org.jetbrains.dokka.model.*
import org.jetbrains.dokka.model.Nullable
import org.jetbrains.dokka.model.TypeConstructor
+import org.jetbrains.dokka.model.properties.ExtraProperty
import org.jetbrains.dokka.model.properties.WithExtraProperties
import org.jetbrains.dokka.pages.ContentKind
import org.jetbrains.dokka.pages.ContentNode
import org.jetbrains.dokka.pages.TextStyle
import org.jetbrains.dokka.utilities.DokkaLogger
+import kotlin.text.Typography.nbsp
-class KotlinSignatureProvider(ctcc: CommentsToContentConverter, logger: DokkaLogger) : SignatureProvider {
+class KotlinSignatureProvider(ctcc: CommentsToContentConverter, logger: DokkaLogger) : SignatureProvider,
+ JvmSingatureUtils by KotlinSignatureUtils {
private val contentBuilder = PageContentBuilder(ctcc, this, logger)
- private val ignoredVisibilities = setOf(JavaVisibility.Default, KotlinVisibility.Public)
+ private val ignoredVisibilities = setOf(JavaVisibility.Public, KotlinVisibility.Public)
+ private val ignoredModifiers = setOf(JavaModifier.Final, KotlinModifier.Final)
override fun signature(documentable: Documentable): ContentNode = when (documentable) {
is DFunction -> functionSignature(documentable)
@@ -29,9 +33,10 @@ class KotlinSignatureProvider(ctcc: CommentsToContentConverter, logger: DokkaLog
)
}
- private fun signature(e: DEnumEntry) = contentBuilder.contentFor(e, ContentKind.Symbol, setOf(TextStyle.Monospace)){
- link(e.name, e.dri)
- }
+ private fun signature(e: DEnumEntry) =
+ contentBuilder.contentFor(e, ContentKind.Symbol, setOf(TextStyle.Monospace)) {
+ link(e.name, e.dri)
+ }
private fun actualTypealiasedSignature(dri: DRI, name: String, aliasedTypes: SourceSetDependent<Bound>) =
aliasedTypes.entries.groupBy({ it.value }, { it.key }).map { (bound, platforms) ->
@@ -55,84 +60,121 @@ class KotlinSignatureProvider(ctcc: CommentsToContentConverter, logger: DokkaLog
private fun regularSignature(c: DClasslike, sourceSets: Set<SourceSetData> = c.sourceSets.toSet()) =
contentBuilder.contentFor(c, ContentKind.Symbol, setOf(TextStyle.Monospace), sourceSets = sourceSets) {
- platformText(c.visibility, sourceSets) { (it.takeIf { it !in ignoredVisibilities }?.name ?: "") + " " }
- if (c is DClass) {
- platformText(c.modifier, sourceSets) {
- if (c.extra[AdditionalModifiers]?.content?.contains(ExtraModifiers.DATA) == true && it.name == "final") "data "
- else it.name + " "
+ group(styles = setOf(TextStyle.Block)) {
+ annotationsBlock(c)
+ platformText(
+ c.visibility,
+ sourceSets
+ ) { it.takeIf { it !in ignoredVisibilities }?.name?.let { "$it " } ?: "" }
+ if (c is DClass) {
+ platformText(c.modifier, sourceSets) {
+ if (it !in ignoredModifiers)
+ if (c.extra[AdditionalModifiers]?.content?.contains(ExtraModifiers.DATA) == true) ""
+ else (if (it is JavaModifier.Empty) KotlinModifier.Open else it).let { it.name + " " }
+ else
+ ""
+ }
}
- }
- when (c) {
- is DClass -> text("class ")
- is DInterface -> text("interface ")
- is DEnum -> text("enum ")
- is DObject -> text("object ")
- is DAnnotation -> text("annotation class ")
- }
- link(c.name!!, c.dri)
- if(c is WithGenerics){
- list(c.generics, prefix = "<", suffix = "> ") {
- +buildSignature(it)
+ when (c) {
+ is DClass -> text("class ")
+ is DInterface -> text("interface ")
+ is DEnum -> text("enum ")
+ is DObject -> text("object ")
+ is DAnnotation -> text("annotation class ")
}
- }
- if (c is DClass) {
- val pConstructor = c.constructors.singleOrNull { it.extra[PrimaryConstructorExtra] != null }
- list(pConstructor?.parameters.orEmpty(), "(", ")", ",", pConstructor?.sourceSets.orEmpty().toSet()) {
- text(it.name ?: "", styles = mainStyles.plus(TextStyle.Bold).plus(TextStyle.Indented))
- text(": ")
- signatureForProjection(it.type)
+ link(c.name!!, c.dri)
+ if (c is WithGenerics) {
+ list(c.generics, prefix = "<", suffix = "> ") {
+ +buildSignature(it)
+ }
}
- }
- if (c is WithSupertypes) {
- c.supertypes.filter { it.key in sourceSets }.map { (p, dris) ->
- list(dris, prefix = " : ", sourceSets = setOf(p)) {
- link(it.sureClassNames, it, sourceSets = setOf(p))
+ if (c is DClass) {
+ val pConstructor = c.constructors.singleOrNull { it.extra[PrimaryConstructorExtra] != null }
+ if (pConstructor?.annotations()?.isNotEmpty() == true) {
+ text(nbsp.toString())
+ annotationsInline(pConstructor)
+ text("constructor")
+ }
+ list(
+ pConstructor?.parameters.orEmpty(),
+ "(",
+ ")",
+ ",",
+ pConstructor?.sourceSets.orEmpty().toSet()
+ ) {
+ annotationsInline(it)
+ text(it.name ?: "", styles = mainStyles.plus(TextStyle.Bold))
+ text(": ")
+ signatureForProjection(it.type)
+ }
+ }
+ if (c is WithSupertypes) {
+ c.supertypes.filter { it.key in sourceSets }.map { (s, dris) ->
+ list(dris, prefix = " : ", sourceSets = setOf(s)) {
+ link(it.sureClassNames, it, sourceSets = setOf(s))
+ }
}
}
}
}
+
private fun propertySignature(p: DProperty, sourceSets: Set<SourceSetData> = p.sourceSets.toSet()) =
contentBuilder.contentFor(p, ContentKind.Symbol, setOf(TextStyle.Monospace), sourceSets = sourceSets) {
- platformText(p.visibility) { (it.takeIf { it !in ignoredVisibilities }?.name ?: "") + " " }
- platformText(p.modifier){ it.name + " "}
- p.setter?.let { text("var ") } ?: text("val ")
- list(p.generics, prefix = "<", suffix = "> ") {
- +buildSignature(it)
- }
- p.receiver?.also {
- signatureForProjection(it.type)
- text(".")
+ group(styles = setOf(TextStyle.Block)) {
+ annotationsBlock(p)
+ platformText(p.visibility) { it.takeIf { it !in ignoredVisibilities }?.name?.let { "$it " } ?: "" }
+ platformText(p.modifier) {
+ it.takeIf { it !in ignoredModifiers }?.let {
+ if (it is JavaModifier.Empty) KotlinModifier.Open else it
+ }?.name?.let { "$it " } ?: ""
+ }
+ text(p.modifiers().toSignatureString())
+ p.setter?.let { text("var ") } ?: text("val ")
+ list(p.generics, prefix = "<", suffix = "> ") {
+ +buildSignature(it)
+ }
+ p.receiver?.also {
+ signatureForProjection(it.type)
+ text(".")
+ }
+ link(p.name, p.dri)
+ text(": ")
+ signatureForProjection(p.type)
}
- link(p.name, p.dri)
- text(": ")
- signatureForProjection(p.type)
}
private fun functionSignature(f: DFunction, sourceSets: Set<SourceSetData> = f.sourceSets.toSet()) =
contentBuilder.contentFor(f, ContentKind.Symbol, setOf(TextStyle.Monospace), sourceSets = sourceSets) {
- platformText(f.visibility) { (it.takeIf { it !in ignoredVisibilities }?.name ?: "") + " " }
- platformText(f.modifier) { it.name + " " }
- text("fun ")
- list(f.generics, prefix = "<", suffix = "> ") {
- +buildSignature(it)
- }
- f.receiver?.also {
- signatureForProjection(it.type)
- text(".")
- }
- link(f.name, f.dri)
- text("(")
- list(f.parameters) {
- text(it.name!!)
- text(": ")
-
- signatureForProjection(it.type)
- }
- text(")")
- if (f.documentReturnType()) {
- text(": ")
- signatureForProjection(f.type)
+ group(styles = setOf(TextStyle.Block)) {
+ annotationsBlock(f)
+ platformText(f.visibility) { it.takeIf { it !in ignoredVisibilities }?.name?.let { "$it " } ?: "" }
+ platformText(f.modifier) {
+ it.takeIf { it !in ignoredModifiers }?.let {
+ if (it is JavaModifier.Empty) KotlinModifier.Open else it
+ }?.name?.let { "$it " } ?: ""
+ }
+ text(f.modifiers().toSignatureString())
+ text("fun ")
+ list(f.generics, prefix = "<", suffix = "> ") {
+ +buildSignature(it)
+ }
+ f.receiver?.also {
+ signatureForProjection(it.type)
+ text(".")
+ }
+ link(f.name, f.dri)
+ list(f.parameters, "(", ")") {
+ annotationsInline(it)
+ text(it.modifiers().toSignatureString())
+ text(it.name!!)
+ text(": ")
+ signatureForProjection(it.type)
+ }
+ if (f.documentReturnType()) {
+ text(": ")
+ signatureForProjection(f.type)
+ }
}
}
@@ -152,7 +194,8 @@ class KotlinSignatureProvider(ctcc: CommentsToContentConverter, logger: DokkaLog
setOf(TextStyle.Monospace),
sourceSets = platforms.toSet()
) {
- platformText(t.visibility) { (it.takeIf { it !in ignoredVisibilities }?.name ?: "") + " " }
+ platformText(t.visibility) { it.takeIf { it !in ignoredVisibilities }?.name?.let { "$it " } ?: "" }
+ text(t.modifiers().toSignatureString())
text("typealias ")
signatureForProjection(t.type)
text(" = ")
@@ -175,21 +218,21 @@ class KotlinSignatureProvider(ctcc: CommentsToContentConverter, logger: DokkaLog
is TypeConstructor -> if (p.function)
+funType(mainDRI.single(), mainPlatformData, p)
else
- group {
+ group(styles = emptySet()) {
link(p.dri.classNames.orEmpty(), p.dri)
list(p.projections, prefix = "<", suffix = ">") {
signatureForProjection(it)
}
}
- is Variance -> group {
+ is Variance -> group(styles = emptySet()) {
text(p.kind.toString() + " ")
signatureForProjection(p.inner)
}
is Star -> text("*")
- is Nullable -> group {
+ is Nullable -> group(styles = emptySet()) {
signatureForProjection(p.inner)
text("?")
}
@@ -197,6 +240,7 @@ class KotlinSignatureProvider(ctcc: CommentsToContentConverter, logger: DokkaLog
is JavaObject -> link("Any", DriOfAny)
is Void -> link("Unit", DriOfUnit)
is PrimitiveJavaType -> signatureForProjection(p.translateToKotlin())
+ is Dynamic -> text("dynamic")
}
private fun funType(dri: DRI, sourceSets: Set<SourceSetData>, type: TypeConstructor) =