aboutsummaryrefslogtreecommitdiff
path: root/plugins/base/src/main
diff options
context:
space:
mode:
authorsebastian.sellmair <sebastian.sellmair@jetbrains.com>2020-08-11 11:10:30 +0200
committerPaweł Marks <Kordyjan@users.noreply.github.com>2020-08-12 09:38:06 +0200
commit6a7d1c9aedfb12f309a410c404a830cb9d3972d3 (patch)
tree041efe2004f3adfdc8f029cd294380cf3f393fc4 /plugins/base/src/main
parentaeb2014eee704be377c06205d16f60562d2a8cf1 (diff)
downloaddokka-6a7d1c9aedfb12f309a410c404a830cb9d3972d3.tar.gz
dokka-6a7d1c9aedfb12f309a410c404a830cb9d3972d3.tar.bz2
dokka-6a7d1c9aedfb12f309a410c404a830cb9d3972d3.zip
Implement DocumentableFilterSuppressedTransformer
Diffstat (limited to 'plugins/base/src/main')
-rw-r--r--plugins/base/src/main/kotlin/DokkaBase.kt6
-rw-r--r--plugins/base/src/main/kotlin/transformers/documentables/SuppressedDocumentableFilterTransformer.kt68
2 files changed, 73 insertions, 1 deletions
diff --git a/plugins/base/src/main/kotlin/DokkaBase.kt b/plugins/base/src/main/kotlin/DokkaBase.kt
index 6586f2dc..20769d07 100644
--- a/plugins/base/src/main/kotlin/DokkaBase.kt
+++ b/plugins/base/src/main/kotlin/DokkaBase.kt
@@ -64,13 +64,17 @@ class DokkaBase : DokkaPlugin() {
CoreExtensions.preMergeDocumentableTransformer providing ::DeprecatedDocumentableFilterTransformer
}
+ val suppressedDocumentableFilter by extending {
+ CoreExtensions.preMergeDocumentableTransformer providing ::SuppressedDocumentableFilterTransformer
+ }
+
val documentableVisbilityFilter by extending {
CoreExtensions.preMergeDocumentableTransformer providing ::DocumentableVisibilityFilterTransformer
}
val emptyPackagesFilter by extending {
CoreExtensions.preMergeDocumentableTransformer providing ::EmptyPackagesFilterTransformer order {
- after(deprecatedDocumentableFilter, documentableVisbilityFilter)
+ after(deprecatedDocumentableFilter, suppressedDocumentableFilter, documentableVisbilityFilter)
}
}
diff --git a/plugins/base/src/main/kotlin/transformers/documentables/SuppressedDocumentableFilterTransformer.kt b/plugins/base/src/main/kotlin/transformers/documentables/SuppressedDocumentableFilterTransformer.kt
new file mode 100644
index 00000000..e7a2bf25
--- /dev/null
+++ b/plugins/base/src/main/kotlin/transformers/documentables/SuppressedDocumentableFilterTransformer.kt
@@ -0,0 +1,68 @@
+package org.jetbrains.dokka.base.transformers.documentables
+
+import org.jetbrains.dokka.DokkaConfiguration
+import org.jetbrains.dokka.DokkaConfiguration.DokkaSourceSet
+import org.jetbrains.dokka.model.*
+import org.jetbrains.dokka.plugability.DokkaContext
+import org.jetbrains.dokka.transformers.documentation.PreMergeDocumentableTransformer
+import java.io.File
+
+class SuppressedDocumentableFilterTransformer(val context: DokkaContext) : PreMergeDocumentableTransformer {
+ override fun invoke(modules: List<DModule>): List<DModule> {
+ return modules.mapNotNull { module -> filterModule(module) }
+ }
+
+ private fun filterModule(module: DModule): DModule? {
+ val packages = module.packages.mapNotNull { pkg -> filterPackage(pkg) }
+ return when {
+ packages == module.packages -> module
+ packages.isEmpty() -> null
+ else -> module.copy(packages = packages)
+ }
+ }
+
+ private fun filterPackage(pkg: DPackage): DPackage? {
+ val options = pkg.perPackageOptions
+ if (options?.suppress == true) {
+ return null
+ }
+
+ val filteredChildren = pkg.children.filter { child -> !isSuppressed(child) }
+ return when {
+ filteredChildren == pkg.children -> pkg
+ filteredChildren.isEmpty() -> null
+ else -> pkg.copy(
+ functions = filteredChildren.filterIsInstance<DFunction>(),
+ classlikes = filteredChildren.filterIsInstance<DClasslike>(),
+ typealiases = filteredChildren.filterIsInstance<DTypeAlias>(),
+ properties = filteredChildren.filterIsInstance<DProperty>()
+ )
+ }
+ }
+
+ private fun isSuppressed(documentable: Documentable): Boolean {
+ if (documentable !is WithExpectActual) return false
+ val sourceFile = File(documentable.source.path).absoluteFile
+ return documentable.sourceSet.suppressedFiles.any { suppressedFile ->
+ sourceFile.startsWith(File(suppressedFile).absoluteFile)
+ }
+ }
+
+ /**
+ * A [PreMergeDocumentableTransformer] can safely assume that documentables are not merged and therefore
+ * only belong to a single source set
+ */
+ private val Documentable.sourceSet: DokkaSourceSet get() = sourceSets.single()
+
+ private val Documentable.perPackageOptions: DokkaConfiguration.PackageOptions?
+ get() {
+ val packageName = dri.packageName ?: return null
+ return sourceSet.perPackageOptions
+ .sortedByDescending { packageOptions -> packageOptions.prefix.length }
+ .firstOrNull { packageOptions -> packageName.startsWith(packageOptions.prefix) }
+ }
+
+ private val <T> T.source: DocumentableSource where T : Documentable, T : WithExpectActual
+ get() = checkNotNull(sources[sourceSet])
+
+}