From ded569657d1f16905180313593336963c467f242 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Fri, 30 Oct 2015 19:33:29 +0100 Subject: load KDoc comments when building javadoc --- src/Kotlin/DocumentationBuilder.kt | 13 ++++----- src/Kotlin/KotlinAsJavaDocumentationBuilder.kt | 37 ++++++++++++++++++++------ 2 files changed, 34 insertions(+), 16 deletions(-) (limited to 'src/Kotlin') diff --git a/src/Kotlin/DocumentationBuilder.kt b/src/Kotlin/DocumentationBuilder.kt index 375ca4bd..b5b079de 100644 --- a/src/Kotlin/DocumentationBuilder.kt +++ b/src/Kotlin/DocumentationBuilder.kt @@ -45,11 +45,10 @@ private fun isSamePackage(descriptor1: DeclarationDescriptor, descriptor2: Decla } interface PackageDocumentationBuilder { - fun buildPackageDocumentation(project: Project, + fun buildPackageDocumentation(documentationBuilder: DocumentationBuilder, packageName: FqName, packageNode: DocumentationNode, - declarations: List, - options: DocumentationOptions, refGraph: NodeReferenceGraph, logger: DokkaLogger) + declarations: List) } class DocumentationBuilder(val resolutionFacade: ResolutionFacade, @@ -426,7 +425,7 @@ class DocumentationBuilder(val resolutionFacade: ResolutionFacade, if (options.skipEmptyPackages && declarations.none { it.isDocumented() }) continue logger.info(" package $packageName: ${declarations.count()} declarations") val packageNode = findOrCreatePackageNode(packageName.asString(), packageContent) - packageDocumentationBuilder.buildPackageDocumentation(resolutionFacade.project, packageName, packageNode, declarations, options, refGraph, logger) + packageDocumentationBuilder.buildPackageDocumentation(this@DocumentationBuilder, packageName, packageNode, declarations) } } @@ -666,12 +665,10 @@ class DocumentationBuilder(val resolutionFacade: ResolutionFacade, } inner class KotlinPackageDocumentationBuilder : PackageDocumentationBuilder { - override fun buildPackageDocumentation(project: Project, + override fun buildPackageDocumentation(documentationBuilder: DocumentationBuilder, packageName: FqName, packageNode: DocumentationNode, - declarations: List, - options: DocumentationOptions, - refGraph: NodeReferenceGraph, logger: DokkaLogger) { + declarations: List) { val externalClassNodes = hashMapOf() declarations.forEach { descriptor -> if (descriptor.isDocumented()) { diff --git a/src/Kotlin/KotlinAsJavaDocumentationBuilder.kt b/src/Kotlin/KotlinAsJavaDocumentationBuilder.kt index ae295769..a32e9a1f 100644 --- a/src/Kotlin/KotlinAsJavaDocumentationBuilder.kt +++ b/src/Kotlin/KotlinAsJavaDocumentationBuilder.kt @@ -1,27 +1,48 @@ package org.jetbrains.dokka -import com.intellij.openapi.project.Project import com.intellij.psi.JavaPsiFacade +import com.intellij.psi.PsiNamedElement import org.jetbrains.kotlin.asJava.KotlinLightElement import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.name.FqName +import org.jetbrains.kotlin.psi.KtParameter +import org.jetbrains.kotlin.psi.KtPropertyAccessor class KotlinAsJavaDocumentationBuilder() : PackageDocumentationBuilder { - override fun buildPackageDocumentation(project: Project, + override fun buildPackageDocumentation(documentationBuilder: DocumentationBuilder, packageName: FqName, packageNode: DocumentationNode, - declarations: List, - options: DocumentationOptions, - refGraph: NodeReferenceGraph, - logger: DokkaLogger) { + declarations: List) { + val project = documentationBuilder.resolutionFacade.project val psiPackage = JavaPsiFacade.getInstance(project).findPackage(packageName.asString()) if (psiPackage == null) { - logger.error("Cannot find Java package by qualified name: ${packageName.asString()}") + documentationBuilder.logger.error("Cannot find Java package by qualified name: ${packageName.asString()}") return } - val javaDocumentationBuilder = JavaDocumentationBuilder(options, refGraph) + + val javaDocumentationBuilder = JavaDocumentationBuilder(documentationBuilder.options, + documentationBuilder.refGraph, + KotlinAsJavaDocumentationParser(documentationBuilder)) + psiPackage.classes.filter { it is KotlinLightElement<*, *> }.forEach { javaDocumentationBuilder.appendClasses(packageNode, arrayOf(it)) } } } + +class KotlinAsJavaDocumentationParser(val documentationBuilder: DocumentationBuilder) : JavaDocumentationParser { + override fun parseDocumentation(element: PsiNamedElement): JavadocParseResult { + val kotlinLightElement = element as? KotlinLightElement<*, *> ?: return JavadocParseResult.Empty + val origin = kotlinLightElement.getOrigin() ?: return JavadocParseResult.Empty + if (origin is KtParameter) { + // LazyDeclarationResolver does not support setter parameters + val grandFather = origin.parent?.parent + if (grandFather is KtPropertyAccessor) { + return JavadocParseResult.Empty + } + } + val descriptor = documentationBuilder.session.resolveToDescriptor(origin) + val content = documentationBuilder.parseDocumentation(descriptor) + return JavadocParseResult(content, null) + } +} -- cgit