diff options
author | sebastian.sellmair <sebastian.sellmair@jetbrains.com> | 2020-08-25 14:28:44 +0200 |
---|---|---|
committer | Sebastian Sellmair <34319766+sellmair@users.noreply.github.com> | 2020-08-31 15:10:04 +0200 |
commit | 29cc17ba80018e3e45a5fabcf2e370c735fd5674 (patch) | |
tree | 4845c0d56582c290c69427769a032e8a017c2773 /plugins/base/src/main/kotlin/transformers/documentables/ModuleAndPackageDocumentationReader.kt | |
parent | 333091e5c5f896769c3371dd74c87a52ffa9562a (diff) | |
download | dokka-29cc17ba80018e3e45a5fabcf2e370c735fd5674.tar.gz dokka-29cc17ba80018e3e45a5fabcf2e370c735fd5674.tar.bz2 dokka-29cc17ba80018e3e45a5fabcf2e370c735fd5674.zip |
Implement ModuleAndPackageDocumentationReader
Diffstat (limited to 'plugins/base/src/main/kotlin/transformers/documentables/ModuleAndPackageDocumentationReader.kt')
-rw-r--r-- | plugins/base/src/main/kotlin/transformers/documentables/ModuleAndPackageDocumentationReader.kt | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/plugins/base/src/main/kotlin/transformers/documentables/ModuleAndPackageDocumentationReader.kt b/plugins/base/src/main/kotlin/transformers/documentables/ModuleAndPackageDocumentationReader.kt new file mode 100644 index 00000000..e8297f3f --- /dev/null +++ b/plugins/base/src/main/kotlin/transformers/documentables/ModuleAndPackageDocumentationReader.kt @@ -0,0 +1,72 @@ +@file:Suppress("FunctionName") + +package org.jetbrains.dokka.base.transformers.documentables + +import org.jetbrains.dokka.DokkaConfiguration +import org.jetbrains.dokka.analysis.KotlinAnalysis +import org.jetbrains.dokka.base.parsers.moduleAndPackage.ModuleAndPackageDocumentation.Classifier +import org.jetbrains.dokka.base.parsers.moduleAndPackage.ModuleAndPackageDocumentationFragment +import org.jetbrains.dokka.base.parsers.moduleAndPackage.ModuleAndPackageDocumentationParsingContext +import org.jetbrains.dokka.base.parsers.moduleAndPackage.parseModuleAndPackageDocumentation +import org.jetbrains.dokka.base.parsers.moduleAndPackage.parseModuleAndPackageDocumentationFragments +import org.jetbrains.dokka.model.DModule +import org.jetbrains.dokka.model.DPackage +import org.jetbrains.dokka.model.SourceSetDependent +import org.jetbrains.dokka.model.doc.DocumentationNode +import org.jetbrains.dokka.plugability.DokkaContext +import org.jetbrains.dokka.utilities.associateWithNotNull + +internal interface ModuleAndPackageDocumentationReader { + operator fun get(module: DModule): SourceSetDependent<DocumentationNode> + operator fun get(pkg: DPackage): SourceSetDependent<DocumentationNode> +} + +// TODO NOW: Test +internal fun ModuleAndPackageDocumentationReader( + context: DokkaContext, kotlinAnalysis: KotlinAnalysis? = null +): ModuleAndPackageDocumentationReader = ContextModuleAndPackageDocumentationReader(context, kotlinAnalysis) + +private class ContextModuleAndPackageDocumentationReader( + private val context: DokkaContext, + private val kotlinAnalysis: KotlinAnalysis? +) : ModuleAndPackageDocumentationReader { + + private val documentationFragments: SourceSetDependent<List<ModuleAndPackageDocumentationFragment>> = + context.configuration.sourceSets.associateWith { sourceSet -> + sourceSet.includes.flatMap { include -> parseModuleAndPackageDocumentationFragments(include) } + } + + private fun findDocumentationNodes( + sourceSets: Set<DokkaConfiguration.DokkaSourceSet>, + predicate: (ModuleAndPackageDocumentationFragment) -> Boolean + ): SourceSetDependent<DocumentationNode> { + return sourceSets.associateWithNotNull { sourceSet -> + val fragments = documentationFragments[sourceSet].orEmpty().filter(predicate) + val resolutionFacade = kotlinAnalysis?.get(sourceSet)?.facade + val documentations = fragments.map { fragment -> + parseModuleAndPackageDocumentation( + context = ModuleAndPackageDocumentationParsingContext(context.logger, resolutionFacade), + fragment = fragment + ) + } + when (documentations.size) { + 0 -> null + 1 -> documentations.single().documentation + else -> DocumentationNode(documentations.flatMap { it.documentation.children }) + } + } + } + + override fun get(module: DModule): SourceSetDependent<DocumentationNode> { + return findDocumentationNodes(module.sourceSets) { fragment -> + fragment.classifier == Classifier.Module && fragment.name == module.name + } + } + + override fun get(pkg: DPackage): SourceSetDependent<DocumentationNode> { + return findDocumentationNodes(pkg.sourceSets) { fragment -> + // TODO NOW: handle JS Root thing + fragment.classifier == Classifier.Package && fragment.name == pkg.dri.packageName + } + } +} |