From d79f3599e848759d172e5b15142e0aabdc6e9a57 Mon Sep 17 00:00:00 2001 From: Aurimas Liutikas Date: Tue, 4 Feb 2020 14:05:51 -0800 Subject: Attempt to resolve external links for types in as-java. Bug: 136558221 Test: existing tests got updated Change-Id: I0ca983b5ad7d2d3a018efb3bc269a7946f638bb9 --- .../kotlin/Java/JavaPsiDocumentationBuilder.kt | 26 ++++++++++++++++++++-- .../Kotlin/KotlinAsJavaDocumentationBuilder.kt | 4 +++- .../main/kotlin/Kotlin/KotlinLanguageService.kt | 2 +- core/src/main/kotlin/javadoc/docbase.kt | 4 +++- 4 files changed, 31 insertions(+), 5 deletions(-) (limited to 'core/src/main/kotlin') 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) { @@ -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 ? } } -- cgit v1.2.3