aboutsummaryrefslogtreecommitdiff
path: root/plugins/base/src/main/kotlin/transformers
diff options
context:
space:
mode:
authorKamil Doległo <kamilok1965@interia.pl>2020-04-02 18:20:34 +0200
committerPaweł Marks <Kordyjan@users.noreply.github.com>2020-04-07 11:43:41 +0200
commitaf1ea32aa3f1e71cd47851a4a06344431801c8fd (patch)
tree906f1d7751780ba82dee91a4dbd7c29c585c52f9 /plugins/base/src/main/kotlin/transformers
parentfe24837fb51d5004ec3d7d728ce4c325a192e426 (diff)
downloaddokka-af1ea32aa3f1e71cd47851a4a06344431801c8fd.tar.gz
dokka-af1ea32aa3f1e71cd47851a4a06344431801c8fd.tar.bz2
dokka-af1ea32aa3f1e71cd47851a4a06344431801c8fd.zip
Add Typealiases rendering and merging
Diffstat (limited to 'plugins/base/src/main/kotlin/transformers')
-rw-r--r--plugins/base/src/main/kotlin/transformers/documentables/ActualTypealiasAdder.kt73
-rw-r--r--plugins/base/src/main/kotlin/transformers/documentables/DefaultDocumentableMerger.kt15
2 files changed, 83 insertions, 5 deletions
diff --git a/plugins/base/src/main/kotlin/transformers/documentables/ActualTypealiasAdder.kt b/plugins/base/src/main/kotlin/transformers/documentables/ActualTypealiasAdder.kt
new file mode 100644
index 00000000..b3282b03
--- /dev/null
+++ b/plugins/base/src/main/kotlin/transformers/documentables/ActualTypealiasAdder.kt
@@ -0,0 +1,73 @@
+package org.jetbrains.dokka.base.transformers.documentables
+
+import org.jetbrains.dokka.links.DRI
+import org.jetbrains.dokka.model.*
+import org.jetbrains.dokka.model.properties.WithExtraProperties
+import org.jetbrains.dokka.plugability.DokkaContext
+import org.jetbrains.dokka.transformers.documentation.PreMergeDocumentableTransformer
+
+class ActualTypealiasAdder : PreMergeDocumentableTransformer {
+ override fun invoke(modules: List<DModule>, context: DokkaContext) = modules.map { it.mergeTypealiases() }
+
+ private fun DModule.mergeTypealiases(): DModule = copy(packages = packages.map { pkg ->
+ if (pkg.typealiases.isEmpty()) {
+ pkg
+ } else {
+ val typealiases = pkg.typealiases.map { it.dri to it }.toMap()
+ pkg.copy(
+ classlikes = addActualTypeAliasToClasslikes(pkg.classlikes, typealiases)
+ )
+ }
+ })
+
+ private fun addActualTypeAliasToClasslikes(
+ elements: Iterable<DClasslike>,
+ typealiases: Map<DRI, DTypeAlias>
+ ): List<DClasslike> = elements.flatMap {
+ when (it) {
+ is DClass -> addActualTypeAlias(
+ it.copy(
+ classlikes = addActualTypeAliasToClasslikes(it.classlikes, typealiases)
+ ).let(::listOf),
+ typealiases
+ )
+ is DEnum -> addActualTypeAlias(
+ it.copy(
+ classlikes = addActualTypeAliasToClasslikes(it.classlikes, typealiases)
+ ).let(::listOf),
+ typealiases
+ )
+ is DInterface -> addActualTypeAlias(
+ it.copy(
+ classlikes = addActualTypeAliasToClasslikes(it.classlikes, typealiases)
+ ).let(::listOf),
+ typealiases
+ )
+ is DObject -> addActualTypeAlias(
+ it.copy(
+ classlikes = addActualTypeAliasToClasslikes(it.classlikes, typealiases)
+ ).let(::listOf),
+ typealiases
+ )
+ else -> throw IllegalStateException("${it::class.qualifiedName} ${it.name} cannot have extra added")
+ } as List<DClasslike>
+ }
+
+ private fun <T> addActualTypeAlias(
+ elements: Iterable<T>,
+ typealiases: Map<DRI, DTypeAlias>
+ ): List<T> where T : DClasslike, T : WithExtraProperties<T>, T : WithExpectActual =
+ elements.map { element ->
+ if (element.sources.expect != null) {
+ typealiases[element.dri]?.let { ta ->
+ element.withNewExtras(
+ element.extra + ActualTypealias(
+ PlatformDependent.from(ta.platformData.single(), ta.underlyingType.values.single())
+ )
+ )
+ } ?: element
+ } else {
+ element
+ }
+ }
+} \ No newline at end of file
diff --git a/plugins/base/src/main/kotlin/transformers/documentables/DefaultDocumentableMerger.kt b/plugins/base/src/main/kotlin/transformers/documentables/DefaultDocumentableMerger.kt
index c87b5de3..ddb5903b 100644
--- a/plugins/base/src/main/kotlin/transformers/documentables/DefaultDocumentableMerger.kt
+++ b/plugins/base/src/main/kotlin/transformers/documentables/DefaultDocumentableMerger.kt
@@ -1,10 +1,6 @@
package org.jetbrains.dokka.base.transformers.documentables
import org.jetbrains.dokka.model.*
-import org.jetbrains.dokka.model.DEnum
-import org.jetbrains.dokka.model.DFunction
-import org.jetbrains.dokka.model.DPackage
-import org.jetbrains.dokka.model.DAnnotation
import org.jetbrains.dokka.model.properties.mergeExtras
import org.jetbrains.dokka.pages.PlatformData
import org.jetbrains.dokka.plugability.DokkaContext
@@ -16,7 +12,8 @@ internal object DefaultDocumentableMerger : DocumentableMerger {
override fun invoke(modules: Collection<DModule>, context: DokkaContext): DModule {
val projectName =
- modules.fold(modules.first().name) { acc, module -> acc.commonPrefixWith(module.name) }.takeIf { it.isNotEmpty() }
+ modules.fold(modules.first().name) { acc, module -> acc.commonPrefixWith(module.name) }
+ .takeIf { it.isNotEmpty() }
?: "project"
return modules.reduce { left, right ->
@@ -111,6 +108,7 @@ fun DPackage.mergeWith(other: DPackage): DPackage = copy(
properties = mergeExpectActual(properties + other.properties, DProperty::mergeWith) { copy(platformData = it) },
classlikes = mergeExpectActual(classlikes + other.classlikes, DClasslike::mergeWith, DClasslike::setPlatformData),
documentation = documentation.mergeWith(other.documentation),
+ typealiases = merge(typealiases + other.typealiases, DTypeAlias::mergeWith),
platformData = (platformData + other.platformData).distinct()
).mergeExtras(this, other)
@@ -243,4 +241,11 @@ fun DParameter.mergeWith(other: DParameter): DParameter = copy(
fun DTypeParameter.mergeWith(other: DTypeParameter): DTypeParameter = copy(
documentation = documentation.mergeWith(other.documentation),
platformData = (platformData + other.platformData).distinct()
+).mergeExtras(this, other)
+
+fun DTypeAlias.mergeWith(other: DTypeAlias): DTypeAlias = copy(
+ documentation = documentation.mergeWith(other.documentation),
+ underlyingType = underlyingType.mergeWith(other.underlyingType),
+ visibility = visibility.mergeWith(other.visibility),
+ platformData = (platformData + other.platformData).distinct()
).mergeExtras(this, other) \ No newline at end of file