diff options
Diffstat (limited to 'src/Kotlin')
-rw-r--r-- | src/Kotlin/CrossReferences.kt | 37 | ||||
-rw-r--r-- | src/Kotlin/DocumentationBuildingVisitor.kt | 2 | ||||
-rw-r--r-- | src/Kotlin/DocumentationContext.kt | 15 | ||||
-rw-r--r-- | src/Kotlin/DocumentationNodeBuilder.kt | 18 |
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 } |