diff options
author | Andrey Tyrin <andrei.tyrin@jetbrains.com> | 2022-10-31 13:50:29 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-10-31 13:50:29 +0100 |
commit | faca33f69872cfd3abe84e3b7e1d4a9e309d7abc (patch) | |
tree | d3bf5df9f4da8939995e980c5b0227dadf441807 /plugins/kotlin-as-java/src/main/kotlin/converters/KotlinCompanion.kt | |
parent | c0aece910e9b012a45ef577136a3f986c52df23e (diff) | |
download | dokka-faca33f69872cfd3abe84e3b7e1d4a9e309d7abc.tar.gz dokka-faca33f69872cfd3abe84e3b7e1d4a9e309d7abc.tar.bz2 dokka-faca33f69872cfd3abe84e3b7e1d4a9e309d7abc.zip |
Suppress useless companion for Kotlin-As-Java (#2681)
Diffstat (limited to 'plugins/kotlin-as-java/src/main/kotlin/converters/KotlinCompanion.kt')
-rw-r--r-- | plugins/kotlin-as-java/src/main/kotlin/converters/KotlinCompanion.kt | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/plugins/kotlin-as-java/src/main/kotlin/converters/KotlinCompanion.kt b/plugins/kotlin-as-java/src/main/kotlin/converters/KotlinCompanion.kt new file mode 100644 index 00000000..dec1591a --- /dev/null +++ b/plugins/kotlin-as-java/src/main/kotlin/converters/KotlinCompanion.kt @@ -0,0 +1,70 @@ +package org.jetbrains.dokka.kotlinAsJava.converters + +import org.jetbrains.dokka.links.Callable +import org.jetbrains.dokka.model.* +import org.jetbrains.dokka.model.properties.PropertyContainer + +private const val DEFAULT_COMPANION_NAME = "Companion" + +internal fun DObject?.staticFunctionsForJava(): List<DFunction> { + if (this == null) return emptyList() + return functions.filter { it.isJvmStatic } +} + +/** + * @return properties that will be visible as static for java. + * See [Static fields](https://kotlinlang.org/docs/java-to-kotlin-interop.html#static-fields) + */ +internal fun DObject?.staticPropertiesForJava(): List<DProperty> { + if (this == null) return emptyList() + return properties.filter { it.isJvmField || it.isConst || it.isLateInit } +} + +internal fun DObject.companionInstancePropertyForJava(): DProperty? { + if (hasNothingToRender()) return null // do not show if companion not rendered + + return DProperty( + name = name ?: DEFAULT_COMPANION_NAME, + modifier = sourceSets.associateWith { JavaModifier.Final }, + dri = dri.copy(callable = Callable(name ?: DEFAULT_COMPANION_NAME, null, emptyList())), + documentation = emptyMap(), + sources = emptyMap(), + visibility = sourceSets.associateWith { + JavaVisibility.Public + }, + type = GenericTypeConstructor(dri, emptyList()), + setter = null, + getter = null, + sourceSets = sourceSets, + receiver = null, + generics = emptyList(), + expectPresentInSet = expectPresentInSet, + isExpectActual = false, + extra = PropertyContainer.withAll(sourceSets.map { + mapOf(it to setOf(ExtraModifiers.JavaOnlyModifiers.Static)).toAdditionalModifiers() + }) + ) +} + +internal fun DObject.companionAsJava(): DObject? { + if (hasNothingToRender()) return null + + return asJava( + excludedProps = staticPropertiesForJava(), + excludedFunctions = staticFunctionsForJava() + ) +} + +/** + * Hide companion object if there isn't members of parents. + * Properties and functions that are moved to outer class are not counted as members. + */ +private fun DObject.hasNothingToRender(): Boolean { + val nonStaticPropsCount = properties.size - staticPropertiesForJava().size + val nonStaticFunctionsCount = functions.size - staticFunctionsForJava().size + val classLikesCount = classlikes.size + val superTypesCount = supertypes.values.firstOrNull()?.size ?: 0 + + return nonStaticFunctionsCount + nonStaticPropsCount + + classLikesCount + superTypesCount == 0 +} |