diff options
author | Aurimas Liutikas <aurimas@google.com> | 2020-02-04 14:05:51 -0800 |
---|---|---|
committer | Aurimas Liutikas <aurimas@google.com> | 2020-02-05 11:40:48 -0800 |
commit | d79f3599e848759d172e5b15142e0aabdc6e9a57 (patch) | |
tree | 6039ff5b19de3b7d7ac2eea71eb895f0a991b5a9 /core/src/main/kotlin | |
parent | 459ec7288a872f7d927fd24cad5dbf33a93e10ac (diff) | |
download | dokka-d79f3599e848759d172e5b15142e0aabdc6e9a57.tar.gz |
Attempt to resolve external links for types in as-java.
Bug: 136558221
Test: existing tests got updated
Change-Id: I0ca983b5ad7d2d3a018efb3bc269a7946f638bb9
Diffstat (limited to 'core/src/main/kotlin')
4 files changed, 31 insertions, 5 deletions
diff --git a/core/src/main/kotlin/Java/JavaPsiDocumentationBuilder.kt b/core/src/main/kotlin/Java/JavaPsiDocumentationBuilder.kt index 846497930..cc9c2c2bf 100644 --- a/core/src/main/kotlin/Java/JavaPsiDocumentationBuilder.kt +++ b/core/src/main/kotlin/Java/JavaPsiDocumentationBuilder.kt @@ -4,6 +4,7 @@ import com.google.inject.Inject import com.intellij.openapi.util.text.StringUtil import com.intellij.psi.* import com.intellij.psi.impl.JavaConstantExpressionEvaluator +import com.intellij.psi.impl.source.PsiClassReferenceType import com.intellij.psi.util.InheritanceUtil import com.intellij.psi.util.PsiTreeUtil import org.jetbrains.kotlin.asJava.elements.KtLightDeclaration @@ -47,6 +48,7 @@ class JavaPsiDocumentationBuilder : JavaDocumentationBuilder { private val options: DocumentationOptions private val refGraph: NodeReferenceGraph private val docParser: JavaDocumentationParser + private val externalDocumentationLinkResolver: ExternalDocumentationLinkResolver @Inject constructor( options: DocumentationOptions, @@ -58,12 +60,19 @@ class JavaPsiDocumentationBuilder : JavaDocumentationBuilder { this.options = options this.refGraph = refGraph this.docParser = JavadocParser(refGraph, logger, signatureProvider, externalDocumentationLinkResolver) + this.externalDocumentationLinkResolver = externalDocumentationLinkResolver } - constructor(options: DocumentationOptions, refGraph: NodeReferenceGraph, docParser: JavaDocumentationParser) { + constructor( + options: DocumentationOptions, + refGraph: NodeReferenceGraph, + docParser: JavaDocumentationParser, + externalDocumentationLinkResolver: ExternalDocumentationLinkResolver + ) { this.options = options this.refGraph = refGraph this.docParser = docParser + this.externalDocumentationLinkResolver = externalDocumentationLinkResolver } override fun appendFile(file: PsiJavaFile, module: DocumentationModule, packageContent: Map<String, Content>) { @@ -309,7 +318,20 @@ class JavaPsiDocumentationBuilder : JavaDocumentationBuilder { if (psiType == null) { return } - append(psiType.build(kind), RefKind.Detail) + + val node = psiType.build(kind) + append(node, RefKind.Detail) + + // Attempt to create an external link if the psiType is one + if (psiType is PsiClassReferenceType) { + val target = psiType.reference.resolve() + if (target != null) { + val externalLink = externalDocumentationLinkResolver.buildExternalDocumentationLink(target) + if (externalLink != null) { + node.append(DocumentationNode(externalLink, Content.Empty, NodeKind.ExternalLink), RefKind.Link) + } + } + } } fun PsiType.build(kind: NodeKind = NodeKind.Type): DocumentationNode { diff --git a/core/src/main/kotlin/Kotlin/KotlinAsJavaDocumentationBuilder.kt b/core/src/main/kotlin/Kotlin/KotlinAsJavaDocumentationBuilder.kt index e1cda8754..c5fb15385 100644 --- a/core/src/main/kotlin/Kotlin/KotlinAsJavaDocumentationBuilder.kt +++ b/core/src/main/kotlin/Kotlin/KotlinAsJavaDocumentationBuilder.kt @@ -30,7 +30,9 @@ class KotlinAsJavaDocumentationBuilder val javaDocumentationBuilder = JavaPsiDocumentationBuilder(documentationBuilder.options, documentationBuilder.refGraph, - kotlinAsJavaDocumentationParser) + kotlinAsJavaDocumentationParser, + documentationBuilder.linkResolver.externalDocumentationLinkResolver + ) psiPackage.classes.filter { it is KtLightElement<*, *> }.filter { it.isVisibleInDocumentation() }.forEach { javaDocumentationBuilder.appendClasses(packageNode, arrayOf(it)) diff --git a/core/src/main/kotlin/Kotlin/KotlinLanguageService.kt b/core/src/main/kotlin/Kotlin/KotlinLanguageService.kt index 22f28da39..757221ce5 100644 --- a/core/src/main/kotlin/Kotlin/KotlinLanguageService.kt +++ b/core/src/main/kotlin/Kotlin/KotlinLanguageService.kt @@ -454,7 +454,7 @@ class KotlinLanguageService : CommonLanguageService() { fun DocumentationNode.qualifiedNameFromType(): String { return details.firstOrNull { it.kind == NodeKind.QualifiedName }?.name - ?: (links.firstOrNull() ?: hiddenLinks.firstOrNull())?.qualifiedName() + ?: (links.firstOrNull { it.kind != NodeKind.ExternalLink } ?: hiddenLinks.firstOrNull())?.qualifiedName() ?: name } diff --git a/core/src/main/kotlin/javadoc/docbase.kt b/core/src/main/kotlin/javadoc/docbase.kt index 76d63383e..12f571bee 100644 --- a/core/src/main/kotlin/javadoc/docbase.kt +++ b/core/src/main/kotlin/javadoc/docbase.kt @@ -185,7 +185,9 @@ open class TypeAdapter(override val module: ModuleNodeAdapter, override val node NodeKind.Exception -> module.classNamed(qualifiedTypeName()) ?: ClassDocumentationNodeAdapter(module, node) else -> when { - node.links.isNotEmpty() -> TypeAdapter(module, node.links.first()).asClassDoc() + node.links.firstOrNull { it.kind != NodeKind.ExternalLink } != null -> { + TypeAdapter(module, node.links.firstOrNull { it.kind != NodeKind.ExternalLink }!!).asClassDoc() + } else -> ClassDocumentationNodeAdapter(module, node) // TODO ? } } |