blob: cd5367688960c9c021b74b25d52712d21394d629 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
|
package org.jetbrains.dokka
import com.google.inject.Inject
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
import org.jetbrains.kotlin.idea.kdoc.resolveKDocLink
import org.jetbrains.kotlin.idea.resolve.ResolutionFacade
class DeclarationLinkResolver
@Inject constructor(val resolutionFacade: ResolutionFacade,
val refGraph: NodeReferenceGraph,
val logger: DokkaLogger) {
fun resolveContentLink(fromDescriptor: DeclarationDescriptor, href: String): ContentBlock {
val symbol = try {
val symbols = resolveKDocLink(resolutionFacade, fromDescriptor, null, href.split('.').toList())
findTargetSymbol(symbols)
} catch(e: Exception) {
null
}
// 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) {
return ContentNodeLazyLink(href, { -> refGraph.lookup(symbol.signature()) })
}
if ("/" in href) {
return ContentExternalLink(href)
}
logger.warn("Unresolved link to $href in doc comment of ${fromDescriptor.signatureWithSourceLocation()}")
return ContentExternalLink("#")
}
fun findTargetSymbol(symbols: Collection<DeclarationDescriptor>): DeclarationDescriptor? {
if (symbols.isEmpty()) {
return null
}
val symbol = symbols.first()
if (symbol is CallableMemberDescriptor && symbol.kind == CallableMemberDescriptor.Kind.FAKE_OVERRIDE) {
return symbol.overriddenDescriptors.firstOrNull()
}
return symbol
}
}
|