aboutsummaryrefslogtreecommitdiff
path: root/core/src/main/kotlin/Kotlin/DeclarationLinkResolver.kt
diff options
context:
space:
mode:
Diffstat (limited to 'core/src/main/kotlin/Kotlin/DeclarationLinkResolver.kt')
-rw-r--r--core/src/main/kotlin/Kotlin/DeclarationLinkResolver.kt32
1 files changed, 32 insertions, 0 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