aboutsummaryrefslogtreecommitdiff
path: root/core/src/main/kotlin/Generation
diff options
context:
space:
mode:
authorBłażej Kardyś <bkardys@virtuslab.com>2019-10-31 11:44:03 +0100
committerBłażej Kardyś <bkardys@virtuslab.com>2019-10-31 11:44:03 +0100
commitc33e8e16a0e446b78496cbcd878ba76ea51c0940 (patch)
tree7362b668c5ee48255e46a7efcb8db3f2525d1e8f /core/src/main/kotlin/Generation
parent14a290009098b777521b1dedb551047fb66ba73b (diff)
downloaddokka-c33e8e16a0e446b78496cbcd878ba76ea51c0940.tar.gz
dokka-c33e8e16a0e446b78496cbcd878ba76ea51c0940.tar.bz2
dokka-c33e8e16a0e446b78496cbcd878ba76ea51c0940.zip
Temp changes
Diffstat (limited to 'core/src/main/kotlin/Generation')
-rw-r--r--core/src/main/kotlin/Generation/DocumentationMerger.kt235
-rw-r--r--core/src/main/kotlin/Generation/DokkaGenerator.kt71
2 files changed, 31 insertions, 275 deletions
diff --git a/core/src/main/kotlin/Generation/DocumentationMerger.kt b/core/src/main/kotlin/Generation/DocumentationMerger.kt
deleted file mode 100644
index 53dc23a9..00000000
--- a/core/src/main/kotlin/Generation/DocumentationMerger.kt
+++ /dev/null
@@ -1,235 +0,0 @@
-package org.jetbrains.dokka.Generation
-
-import org.jetbrains.dokka.*
-
-class DocumentationMerger(
- private val documentationModules: List<DocumentationModule>,
- val logger: DokkaLogger
-) {
- private val producedNodeRefGraph: NodeReferenceGraph = NodeReferenceGraph()
- private val signatureMap: Map<DocumentationNode, String>
- private val oldToNewNodeMap: MutableMap<DocumentationNode, DocumentationNode> = mutableMapOf()
-
- init {
- if (documentationModules.groupBy { it.name }.size > 1) {
- throw IllegalArgumentException("Modules should have similar names: ${documentationModules.joinToString(", ") {it.name}}")
- }
-
- signatureMap = documentationModules
- .flatMap { it.nodeRefGraph.nodeMapView.entries }
- .associate { (k, v) -> v to k }
-
-
- documentationModules.map { it.nodeRefGraph }
- .flatMap { it.references }
- .forEach { producedNodeRefGraph.addReference(it) }
- }
-
- private fun mergePackageReferences(
- from: DocumentationNode,
- packages: List<DocumentationReference>
- ): List<DocumentationReference> {
- val packagesByName = packages
- .map { it.to }
- .groupBy { it.name }
-
- val resultReferences = mutableListOf<DocumentationReference>()
- for ((name, listOfPackages) in packagesByName) {
- try {
- val producedPackage = mergePackagesWithEqualNames(name, from, listOfPackages)
- updatePendingReferences()
-
- resultReferences.add(
- DocumentationReference(from, producedPackage, RefKind.Member)
- )
- } catch (t: Throwable) {
- val entries = listOfPackages.joinToString(",") { "references:${it.allReferences().size}" }
- throw Error("Failed to merge package $name from $from with entries $entries. ${t.message}", t)
- }
- }
-
- return resultReferences
- }
-
- private fun mergePackagesWithEqualNames(
- name: String,
- from: DocumentationNode,
- packages: List<DocumentationNode>
- ): DocumentationNode {
- val mergedPackage = DocumentationNode(name, Content.Empty, NodeKind.Package)
-
- for (contentToAppend in packages.map { it.content }.distinct()) {
- mergedPackage.updateContent {
- for (otherChild in contentToAppend.children) {
- children.add(otherChild)
- }
- }
- }
-
- for (node in packages) {
- oldToNewNodeMap[node] = mergedPackage
- }
-
- val references = packages.flatMap { it.allReferences() }
- val mergedReferences = mergeReferences(mergedPackage, references)
- for (ref in mergedReferences) {
- if (ref.kind == RefKind.Owner) {
- continue
- }
- mergedPackage.addReference(ref)
- }
-
- from.append(mergedPackage, RefKind.Member)
-
- return mergedPackage
- }
-
- private fun mergeMemberGroupBy(it: DocumentationNode): String {
- val signature = signatureMap[it]
-
- if (signature != null) {
- return signature
- }
-
- logger.error("Failed to find signature for $it in \n${it.allReferences().joinToString { "\n ${it.kind} ${it.to}" }}")
- return "<ERROR>"
- }
-
- private fun mergeMemberReferences(
- from: DocumentationNode,
- refs: List<DocumentationReference>
- ): List<DocumentationReference> {
- val membersBySignature: Map<String, List<DocumentationNode>> = refs.map { it.to }
- .groupBy(this::mergeMemberGroupBy)
-
- val mergedMembers: MutableList<DocumentationReference> = mutableListOf()
- for ((signature, members) in membersBySignature) {
- val newNode = mergeMembersWithEqualSignature(signature, members)
-
- producedNodeRefGraph.register(signature, newNode)
- updatePendingReferences()
- from.append(newNode, RefKind.Member)
-
- mergedMembers.add(DocumentationReference(from, newNode, RefKind.Member))
- }
-
- return mergedMembers
- }
-
- private fun mergeMembersWithEqualSignature(
- signature: String,
- nodes: List<DocumentationNode>
- ): DocumentationNode {
- require(nodes.isNotEmpty())
-
- val singleNode = nodes.singleOrNull()
- if (singleNode != null) {
- singleNode.dropReferences { it.kind == RefKind.Owner }
- return singleNode
- }
-
- // Specialization processing
- // Given (Common, JVM, JRE6, JS) and (JVM, JRE6) and (JVM, JRE7)
- // Sorted: (JVM, JRE6), (JVM, JRE7), (Common, JVM, JRE6, JS)
- // Should output: (JVM, JRE6), (JVM, JRE7), (Common, JS)
- // Should not remove first platform
- val nodesSortedByPlatformCount = nodes.sortedBy { it.platforms.size }
- val allPlatforms = mutableSetOf<String>()
- nodesSortedByPlatformCount.forEach { node ->
- node.platforms
- .filterNot { allPlatforms.add(it) }
- .filter { it != node.platforms.first() }
- .forEach { platform ->
- node.dropReferences { it.kind == RefKind.Platform && it.to.name == platform }
- }
- }
-
- // TODO: Quick and dirty fox for merging extensions for external classes. Fix this probably in StructuredFormatService
- // TODO: while refactoring documentation model
-
- val groupNode = if(nodes.first().kind == NodeKind.ExternalClass){
- DocumentationNode(nodes.first().name, Content.Empty, NodeKind.ExternalClass)
- } else {
- DocumentationNode(nodes.first().name, Content.Empty, NodeKind.GroupNode)
- }
- groupNode.appendTextNode(signature, NodeKind.Signature, RefKind.Detail)
-
- for (node in nodes) {
- node.dropReferences { it.kind == RefKind.Owner }
- groupNode.append(node, RefKind.Origin)
- node.append(groupNode, RefKind.TopLevelPage)
-
- oldToNewNodeMap[node] = groupNode
- }
-
- if (groupNode.kind == NodeKind.ExternalClass){
- val refs = nodes.flatMap { it.allReferences() }.filter { it.kind != RefKind.Owner && it.kind != RefKind.TopLevelPage }
- refs.forEach {
- if (it.kind != RefKind.Link) {
- it.to.dropReferences { ref -> ref.kind == RefKind.Owner }
- it.to.append(groupNode, RefKind.Owner)
- }
- groupNode.append(it.to, it.kind)
- }
- }
-
- // if nodes are classes, nested members should be also merged and
- // inserted at the same level with class
- if (nodes.all { it.kind in NodeKind.classLike }) {
- val members = nodes.flatMap { it.allReferences() }.filter { it.kind == RefKind.Member }
- val mergedMembers = mergeMemberReferences(groupNode, members)
-
- for (ref in mergedMembers) {
- if (ref.kind == RefKind.Owner) {
- continue
- }
-
- groupNode.append(ref.to, RefKind.Member)
- }
- }
-
- return groupNode
- }
-
-
- private fun mergeReferences(
- from: DocumentationNode,
- refs: List<DocumentationReference>
- ): List<DocumentationReference> {
- val (refsToPackages, otherRefs) = refs.partition { it.to.kind == NodeKind.Package }
- val mergedPackages = mergePackageReferences(from, refsToPackages)
-
- val (refsToMembers, refsNotToMembers) = otherRefs.partition { it.kind == RefKind.Member }
- val mergedMembers = mergeMemberReferences(from, refsToMembers)
-
- return mergedPackages + mergedMembers + refsNotToMembers
- }
-
- fun merge(): DocumentationModule {
- val mergedDocumentationModule = DocumentationModule(
- name = documentationModules.first().name,
- content = documentationModules.first().content,
- nodeRefGraph = producedNodeRefGraph
- )
-
- val refs = documentationModules.flatMap {
- it.allReferences()
- }
- mergeReferences(mergedDocumentationModule, refs)
-
- return mergedDocumentationModule
- }
-
- private fun updatePendingReferences() {
- for (ref in producedNodeRefGraph.references) {
- ref.lazyNodeFrom.update()
- ref.lazyNodeTo.update()
- }
- }
-
- private fun NodeResolver.update() {
- if (this is NodeResolver.Exact && exactNode in oldToNewNodeMap) {
- exactNode = oldToNewNodeMap[exactNode]!!
- }
- }
-} \ No newline at end of file
diff --git a/core/src/main/kotlin/Generation/DokkaGenerator.kt b/core/src/main/kotlin/Generation/DokkaGenerator.kt
index 90d7cfcc..51d70fbd 100644
--- a/core/src/main/kotlin/Generation/DokkaGenerator.kt
+++ b/core/src/main/kotlin/Generation/DokkaGenerator.kt
@@ -7,9 +7,7 @@ import com.intellij.openapi.vfs.VirtualFileManager
import com.intellij.psi.PsiFile
import com.intellij.psi.PsiJavaFile
import com.intellij.psi.PsiManager
-import org.jetbrains.dokka.Generation.DocumentationMerger
import org.jetbrains.dokka.Utilities.DokkaAnalysisModule
-import org.jetbrains.dokka.Utilities.DokkaOutputModule
import org.jetbrains.dokka.Utilities.DokkaRunModule
import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys
import org.jetbrains.kotlin.cli.common.messages.CompilerMessageLocation
@@ -24,12 +22,13 @@ import org.jetbrains.kotlin.resolve.LazyTopDownAnalyzer
import org.jetbrains.kotlin.resolve.TopDownAnalysisMode
import org.jetbrains.kotlin.utils.PathUtil
import java.io.File
-import kotlin.system.measureTimeMillis
-class DokkaGenerator(val dokkaConfiguration: DokkaConfiguration,
- val logger: DokkaLogger) {
+class DokkaGenerator(
+ val dokkaConfiguration: DokkaConfiguration,
+ val logger: DokkaLogger
+) {
- private val documentationModules: MutableList<DocumentationModule> = mutableListOf()
+ private val documentationModules: MutableList<DocumentationNodes.Module> = mutableListOf()
private val globalInjector = Guice.createInjector(DokkaRunModule(dokkaConfiguration))
@@ -37,26 +36,15 @@ class DokkaGenerator(val dokkaConfiguration: DokkaConfiguration,
for (pass in passesConfigurations) {
- val documentationModule = DocumentationModule(pass.moduleName)
+ val documentationModule = DocumentationNodes.Module(pass.moduleName)
appendSourceModule(pass, documentationModule)
documentationModules.add(documentationModule)
}
-
- val totalDocumentationModule = DocumentationMerger(documentationModules, logger).merge()
- totalDocumentationModule.prepareForGeneration(dokkaConfiguration)
-
- val timeBuild = measureTimeMillis {
- logger.info("Generating pages... ")
- val outputInjector = globalInjector.createChildInjector(DokkaOutputModule(dokkaConfiguration, logger))
- val instance = outputInjector.getInstance(Generator::class.java)
- instance.buildAll(totalDocumentationModule)
- }
- logger.info("done in ${timeBuild / 1000} secs")
}
private fun appendSourceModule(
passConfiguration: DokkaConfiguration.PassConfiguration,
- documentationModule: DocumentationModule
+ documentationModule: DocumentationNodes.Module
) = with(passConfiguration) {
val sourcePaths = passConfiguration.sourceRoots.map { it.path }
@@ -84,9 +72,15 @@ class DokkaGenerator(val dokkaConfiguration: DokkaConfiguration,
}
val injector = globalInjector.createChildInjector(
- DokkaAnalysisModule(environment, dokkaConfiguration, defaultPlatformsProvider, documentationModule.nodeRefGraph, passConfiguration, logger))
+ DokkaAnalysisModule(environment, dokkaConfiguration, defaultPlatformsProvider, passConfiguration, logger)
+ )
- buildDocumentationModule(injector, documentationModule, { isNotSample(it, passConfiguration.samples) }, includes)
+ buildDocumentationModule(
+ injector,
+ documentationModule,
+ { isNotSample(it, passConfiguration.samples) },
+ includes
+ )
val timeAnalyse = System.currentTimeMillis() - startAnalyse
logger.info("done in ${timeAnalyse / 1000} secs")
@@ -118,7 +112,7 @@ class DokkaGenerator(val dokkaConfiguration: DokkaConfiguration,
return environment
}
- private fun isNotSample(file: PsiFile, samples: List<String>): Boolean {
+ private fun isNotSample(file: PsiFile, samples: List<String>): Boolean {
val sourceFile = File(file.virtualFile!!.path)
return samples.none { sample ->
val canonicalSample = File(sample).canonicalPath
@@ -145,10 +139,12 @@ class DokkaMessageCollector(val logger: DokkaLogger) : MessageCollector {
override fun hasErrors() = seenErrors
}
-fun buildDocumentationModule(injector: Injector,
- documentationModule: DocumentationModule,
- filesToDocumentFilter: (PsiFile) -> Boolean = { file -> true },
- includes: List<String> = listOf()) {
+fun buildDocumentationModule(
+ injector: Injector,
+ documentationModule: DocumentationNodes.Module,
+ filesToDocumentFilter: (PsiFile) -> Boolean = { file -> true },
+ includes: List<String> = listOf()
+) {
val coreEnvironment = injector.getInstance(KotlinCoreEnvironment::class.java)
val fragmentFiles = coreEnvironment.getSourceFiles().filter(filesToDocumentFilter)
@@ -158,25 +154,20 @@ fun buildDocumentationModule(injector: Injector,
analyzer.analyzeDeclarations(TopDownAnalysisMode.TopLevelDeclarations, fragmentFiles)
val fragments = fragmentFiles.mapNotNull { resolutionFacade.resolveSession.getPackageFragment(it.packageFqName) }
- .distinct()
+ .distinct()
val packageDocs = injector.getInstance(PackageDocs::class.java)
for (include in includes) {
packageDocs.parse(include, fragments)
}
- if (documentationModule.content.isEmpty()) {
- documentationModule.updateContent {
- for (node in packageDocs.moduleContent.children) {
- append(node)
- }
- }
- }
parseJavaPackageDocs(packageDocs, coreEnvironment)
with(injector.getInstance(DocumentationBuilder::class.java)) {
- documentationModule.appendFragments(fragments, packageDocs.packageContent,
- injector.getInstance(PackageDocumentationBuilder::class.java))
+ documentationModule.appendFragments(
+ fragments,
+ injector.getInstance(PackageDocumentationBuilder::class.java)
+ )
propagateExtensionFunctionsToSubclasses(fragments, resolutionFacade)
}
@@ -189,8 +180,8 @@ fun buildDocumentationModule(injector: Injector,
fun parseJavaPackageDocs(packageDocs: PackageDocs, coreEnvironment: KotlinCoreEnvironment) {
val contentRoots = coreEnvironment.configuration.get(CLIConfigurationKeys.CONTENT_ROOTS)
- ?.filterIsInstance<JavaSourceRoot>()
- ?.map { it.file }
+ ?.filterIsInstance<JavaSourceRoot>()
+ ?.map { it.file }
?: listOf()
contentRoots.forEach { root ->
root.walkTopDown().filter { it.name == "overview.html" }.forEach {
@@ -202,8 +193,8 @@ fun parseJavaPackageDocs(packageDocs: PackageDocs, coreEnvironment: KotlinCoreEn
fun KotlinCoreEnvironment.getJavaSourceFiles(): List<PsiJavaFile> {
val sourceRoots = configuration.get(CLIConfigurationKeys.CONTENT_ROOTS)
- ?.filterIsInstance<JavaSourceRoot>()
- ?.map { it.file }
+ ?.filterIsInstance<JavaSourceRoot>()
+ ?.map { it.file }
?: listOf()
val result = arrayListOf<PsiJavaFile>()