diff options
Diffstat (limited to 'core/src')
-rw-r--r-- | core/src/main/kotlin/Kotlin/DeclarationLinkResolver.kt | 32 | ||||
-rw-r--r-- | core/src/main/kotlin/Kotlin/DocumentationBuilder.kt | 13 | ||||
-rw-r--r-- | core/src/main/kotlin/Model/Content.kt | 6 | ||||
-rw-r--r-- | core/src/main/kotlin/Model/DocumentationNode.kt | 2 | ||||
-rw-r--r-- | core/src/test/kotlin/format/MarkdownFormatTest.kt | 4 |
5 files changed, 53 insertions, 4 deletions
diff --git a/core/src/main/kotlin/Kotlin/DeclarationLinkResolver.kt b/core/src/main/kotlin/Kotlin/DeclarationLinkResolver.kt index 2569bc71..c1c301f2 100644 --- a/core/src/main/kotlin/Kotlin/DeclarationLinkResolver.kt +++ b/core/src/main/kotlin/Kotlin/DeclarationLinkResolver.kt @@ -1,9 +1,15 @@ package org.jetbrains.dokka import com.google.inject.Inject +import com.intellij.psi.PsiMethod import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.idea.kdoc.resolveKDocLink +import org.jetbrains.kotlin.load.java.descriptors.JavaClassDescriptor +import org.jetbrains.kotlin.load.java.descriptors.JavaMethodDescriptor +import org.jetbrains.kotlin.name.Name +import org.jetbrains.kotlin.resolve.DescriptorUtils +import org.jetbrains.kotlin.resolve.source.PsiSourceElement class DeclarationLinkResolver @Inject constructor(val resolutionFacade: DokkaResolutionFacade, @@ -20,6 +26,10 @@ class DeclarationLinkResolver // don't include unresolved links in generated doc // assume that if an href doesn't contain '/', it's not an attempt to reference an external file if (symbol != null) { + val jdkHref = buildJdkLink(symbol) + if (jdkHref != null) { + return ContentExternalLink(jdkHref) + } return ContentNodeLazyLink(href, { -> refGraph.lookup(symbol.signature()) }) } if ("/" in href) { @@ -40,4 +50,26 @@ class DeclarationLinkResolver return symbol } + fun buildJdkLink(symbol: DeclarationDescriptor): String? { + if (symbol is JavaClassDescriptor) { + val fqName = DescriptorUtils.getFqName(symbol) + if (fqName.startsWith(Name.identifier("java")) || fqName.startsWith(Name.identifier("javax"))) { + return javadocRoot + fqName.asString().replace(".", "/") + ".html" + } + } + else if (symbol is JavaMethodDescriptor) { + val containingClass = symbol.containingDeclaration as? JavaClassDescriptor ?: return null + val containingClassLink = buildJdkLink(containingClass) + if (containingClassLink != null) { + val psi = (symbol.original.source as? PsiSourceElement)?.psi as? PsiMethod + if (psi != null) { + val params = psi.parameterList.parameters.joinToString { it.type.canonicalText } + return containingClassLink + "#" + symbol.name + "(" + params + ")" + } + } + } + return null + } + + private val javadocRoot = "http://docs.oracle.com/javase/6/docs/api/" }
\ No newline at end of file diff --git a/core/src/main/kotlin/Kotlin/DocumentationBuilder.kt b/core/src/main/kotlin/Kotlin/DocumentationBuilder.kt index f3b206c6..4694bcdf 100644 --- a/core/src/main/kotlin/Kotlin/DocumentationBuilder.kt +++ b/core/src/main/kotlin/Kotlin/DocumentationBuilder.kt @@ -66,7 +66,8 @@ class DocumentationBuilder val descriptorDocumentationParser: DescriptorDocumentationParser, val options: DocumentationOptions, val refGraph: NodeReferenceGraph, - val logger: DokkaLogger) + val logger: DokkaLogger, + val linkResolver: DeclarationLinkResolver) { val visibleToDocumentation = setOf(Visibilities.PROTECTED, Visibilities.PUBLIC) val boringBuiltinClasses = setOf( @@ -180,8 +181,14 @@ class DocumentationBuilder node.appendTextNode("?", NodeKind.NullabilityModifier) } if (classifierDescriptor != null) { - link(node, classifierDescriptor, - if (classifierDescriptor.isBoringBuiltinClass()) RefKind.HiddenLink else RefKind.Link) + val jdkLink = linkResolver.buildJdkLink(classifierDescriptor) + if (jdkLink != null) { + node.append(DocumentationNode(jdkLink, Content.Empty, NodeKind.ExternalLink), RefKind.Link) + } + else { + link(node, classifierDescriptor, + if (classifierDescriptor.isBoringBuiltinClass()) RefKind.HiddenLink else RefKind.Link) + } } append(node, RefKind.Detail) diff --git a/core/src/main/kotlin/Model/Content.kt b/core/src/main/kotlin/Model/Content.kt index 1bf1da48..4c69f6cb 100644 --- a/core/src/main/kotlin/Model/Content.kt +++ b/core/src/main/kotlin/Model/Content.kt @@ -158,7 +158,11 @@ fun ContentBlock.code(body: ContentBlock.() -> Unit) { } fun ContentBlock.link(to: DocumentationNode, body: ContentBlock.() -> Unit) { - val block = ContentNodeDirectLink(to) + val block = if (to.kind == NodeKind.ExternalLink) + ContentExternalLink(to.name) + else + ContentNodeDirectLink(to) + block.body() append(block) } diff --git a/core/src/main/kotlin/Model/DocumentationNode.kt b/core/src/main/kotlin/Model/DocumentationNode.kt index dcb50e8f..3cedb8e6 100644 --- a/core/src/main/kotlin/Model/DocumentationNode.kt +++ b/core/src/main/kotlin/Model/DocumentationNode.kt @@ -43,6 +43,8 @@ enum class NodeKind { SourceUrl, SourcePosition, + ExternalLink, + /** * A note which is rendered once on a page documenting a group of overloaded functions. * Needs to be generated equally on all overloads. diff --git a/core/src/test/kotlin/format/MarkdownFormatTest.kt b/core/src/test/kotlin/format/MarkdownFormatTest.kt index 427889c5..f306ac74 100644 --- a/core/src/test/kotlin/format/MarkdownFormatTest.kt +++ b/core/src/test/kotlin/format/MarkdownFormatTest.kt @@ -242,6 +242,10 @@ public class MarkdownFormatTest { verifyMarkdownNodeByName("receiverParameterTypeBound", "Foo") } + @Test fun jdkLinks() { + verifyMarkdownNode("jdkLinks", withKotlinRuntime = true) + } + private fun verifyMarkdownPackage(fileName: String, withKotlinRuntime: Boolean = false) { verifyOutput("testdata/format/$fileName.kt", ".package.md", withKotlinRuntime = withKotlinRuntime) { model, output -> markdownService.appendNodes(tempLocation, output, model.members) |