aboutsummaryrefslogtreecommitdiff
path: root/src/Kotlin
diff options
context:
space:
mode:
Diffstat (limited to 'src/Kotlin')
-rw-r--r--src/Kotlin/CrossReferences.kt37
-rw-r--r--src/Kotlin/DocumentationBuildingVisitor.kt2
-rw-r--r--src/Kotlin/DocumentationContext.kt15
-rw-r--r--src/Kotlin/DocumentationNodeBuilder.kt18
4 files changed, 63 insertions, 9 deletions
diff --git a/src/Kotlin/CrossReferences.kt b/src/Kotlin/CrossReferences.kt
new file mode 100644
index 00000000..7504cebc
--- /dev/null
+++ b/src/Kotlin/CrossReferences.kt
@@ -0,0 +1,37 @@
+package org.jetbrains.dokka
+
+import org.jetbrains.jet.lang.descriptors.ClassKind
+
+/**
+ * Generates cross-references for documentation such as extensions for a type
+ *
+ * $receiver: [DocumentationContext] for node/descriptor resolutions
+ * $node: [DocumentationNode] to visit
+ */
+public fun DocumentationContext.buildCrossReferences(node: DocumentationNode) {
+ node.details(DocumentationNode.Kind.Receiver).forEach { detail ->
+ val receiverType = detail.detail(DocumentationNode.Kind.Type)
+ val descriptor = relations[receiverType]
+ if (descriptor != null) {
+ val typeNode = descriptorToNode[descriptor]
+ // if typeNode is null, extension is to external type like in a library
+ // should we create dummy node here?
+ typeNode?.addReferenceTo(node, DocumentationReference.Kind.Extension)
+ }
+ }
+ node.details(DocumentationNode.Kind.Type).forEach { detail ->
+ val descriptor = relations[detail]
+ if (descriptor != null) {
+ val typeNode = descriptorToNode[descriptor]
+ if (typeNode != null) {
+ // if typeNode is null, type is external to module
+ detail.addReferenceTo(typeNode, DocumentationReference.Kind.Link)
+ }
+ }
+ }
+
+ for (member in node.members) {
+ buildCrossReferences(member)
+ }
+}
+
diff --git a/src/Kotlin/DocumentationBuildingVisitor.kt b/src/Kotlin/DocumentationBuildingVisitor.kt
index 5654903b..754ef8ef 100644
--- a/src/Kotlin/DocumentationBuildingVisitor.kt
+++ b/src/Kotlin/DocumentationBuildingVisitor.kt
@@ -32,7 +32,7 @@ class DocumentationBuildingVisitor(val context: BindingContext,
private fun processCallable(descriptor: CallableDescriptor, data: DocumentationNode): DocumentationNode {
val node = createDocumentation(descriptor, data)
visitChildren(descriptor.getTypeParameters(), node)
- visitChild(descriptor.getReceiverParameter(), node)
+ visitChild(descriptor.getExtensionReceiverParameter(), node)
visitChildren(descriptor.getValueParameters(), node)
return node
}
diff --git a/src/Kotlin/DocumentationContext.kt b/src/Kotlin/DocumentationContext.kt
index ec9e748f..1fada8b3 100644
--- a/src/Kotlin/DocumentationContext.kt
+++ b/src/Kotlin/DocumentationContext.kt
@@ -6,10 +6,23 @@ import org.jetbrains.jet.lang.resolve.scopes.JetScope
import org.jetbrains.jet.lang.descriptors.ModuleDescriptor
import org.jetbrains.jet.lang.resolve.name.FqName
+/**
+ * Context for documentation generation.
+ *
+ * Holds information about relations between nodes and descriptors during documentation generation
+ *
+ * %bindingContext: symbol resolution context
+ */
public class DocumentationContext(val bindingContext: BindingContext) {
val descriptorToNode = hashMapOf<DeclarationDescriptor, DocumentationNode>()
val nodeToDescriptor = hashMapOf<DocumentationNode, DeclarationDescriptor>()
+ val relations = hashMapOf<DocumentationNode, DeclarationDescriptor>()
+
+ fun attach(node: DocumentationNode, descriptor: DeclarationDescriptor) {
+ relations.put(node, descriptor)
+ }
+
fun register(descriptor: DeclarationDescriptor, node: DocumentationNode) {
descriptorToNode.put(descriptor, node)
nodeToDescriptor.put(node, descriptor)
@@ -41,6 +54,8 @@ fun BindingContext.createDocumentationModule(name: String,
pkg!!.accept(DocumentationBuildingVisitor(this, options, visitor), documentationModule)
}
+ context.buildCrossReferences(documentationModule)
+
// TODO: Uncomment for resolve verification
// checkResolveChildren(documentationModule)
return documentationModule
diff --git a/src/Kotlin/DocumentationNodeBuilder.kt b/src/Kotlin/DocumentationNodeBuilder.kt
index 535f037f..66f71bf6 100644
--- a/src/Kotlin/DocumentationNodeBuilder.kt
+++ b/src/Kotlin/DocumentationNodeBuilder.kt
@@ -21,10 +21,11 @@ class DocumentationNodeBuilder(val context: DocumentationContext) : DeclarationD
fun reference(from: DocumentationNode, to: DocumentationNode, kind: DocumentationReference.Kind) {
from.addReferenceTo(to, kind)
- if (kind == DocumentationReference.Kind.Link)
- to.addReferenceTo(from, DocumentationReference.Kind.Link)
- else
- to.addReferenceTo(from, DocumentationReference.Kind.Owner)
+ when (kind) {
+ DocumentationReference.Kind.Detail -> to.addReferenceTo(from, DocumentationReference.Kind.Owner)
+ DocumentationReference.Kind.Member -> to.addReferenceTo(from, DocumentationReference.Kind.Owner)
+ DocumentationReference.Kind.Owner -> to.addReferenceTo(from, DocumentationReference.Kind.Member)
+ }
}
fun addModality(descriptor: MemberDescriptor, data: DocumentationNode) {
@@ -42,15 +43,16 @@ class DocumentationNodeBuilder(val context: DocumentationContext) : DeclarationD
fun addType(descriptor: DeclarationDescriptor, t: JetType?, data: DocumentationNode) {
if (t == null)
return
- val typeConstructor = t.getConstructor()
- val classifierDescriptor = typeConstructor.getDeclarationDescriptor()
+ val classifierDescriptor = t.getConstructor().getDeclarationDescriptor()
val name = when (classifierDescriptor) {
is Named -> classifierDescriptor.getName().asString()
else -> "<anonymous>"
}
val node = DocumentationNode(name, Content.Empty, DocumentationNode.Kind.Type)
- reference(data, node, DocumentationReference.Kind.Detail)
+ if (classifierDescriptor != null)
+ context.attach(node, classifierDescriptor)
+ reference(data, node, DocumentationReference.Kind.Detail)
for (param in t.getArguments())
addType(descriptor, param.getType(), node)
}
@@ -59,7 +61,7 @@ class DocumentationNodeBuilder(val context: DocumentationContext) : DeclarationD
descriptor!!
val doc = context.parseDocumentation(descriptor)
val node = DocumentationNode(descriptor.getName().asString(), doc, DocumentationNode.Kind.Unknown)
- reference(data!!, node, DocumentationReference.Kind.Link)
+ reference(data!!, node, DocumentationReference.Kind.Member)
context.register(descriptor, node)
return node
}