From 184a24c93e0939c5a9ceb10cf3c3992f11165219 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Wed, 25 Feb 2015 19:03:51 +0100 Subject: resolve references through single map from signature to DocumentationNode (enables cross-language references) --- src/Model/Content.kt | 6 +++--- src/Model/DocumentationReference.kt | 27 +++++++++++++++++++++++++++ 2 files changed, 30 insertions(+), 3 deletions(-) (limited to 'src/Model') diff --git a/src/Model/Content.kt b/src/Model/Content.kt index 01d7b206..5688e2b8 100644 --- a/src/Model/Content.kt +++ b/src/Model/Content.kt @@ -39,7 +39,7 @@ public class ContentCode() : ContentBlock() public class ContentBlockCode() : ContentBlock() public abstract class ContentNodeLink() : ContentBlock() { - abstract val node: DocumentationNode + abstract val node: DocumentationNode? } public class ContentNodeDirectLink(override val node: DocumentationNode): ContentNodeLink() { @@ -50,8 +50,8 @@ public class ContentNodeDirectLink(override val node: DocumentationNode): Conten children.hashCode() * 31 + node.name.hashCode() } -public class ContentNodeLazyLink(val linkText: String, val lazyNode: () -> DocumentationNode): ContentNodeLink() { - override val node: DocumentationNode get() = lazyNode() +public class ContentNodeLazyLink(val linkText: String, val lazyNode: () -> DocumentationNode?): ContentNodeLink() { + override val node: DocumentationNode? get() = lazyNode() override fun equals(other: Any?): Boolean = super.equals(other) && other is ContentNodeLazyLink && linkText == other.linkText diff --git a/src/Model/DocumentationReference.kt b/src/Model/DocumentationReference.kt index 4bc819f6..73d883e6 100644 --- a/src/Model/DocumentationReference.kt +++ b/src/Model/DocumentationReference.kt @@ -26,3 +26,30 @@ class PendingDocumentationReference(val lazyNodeFrom: () -> DocumentationNode?, } } } + +class NodeReferenceGraph() { + private val nodeMap = hashMapOf() + val references = arrayListOf() + + fun register(signature: String, node: DocumentationNode) { + nodeMap.put(signature, node) + } + + fun link(fromNode: DocumentationNode, toSignature: String, kind: DocumentationReference.Kind) { + references.add(PendingDocumentationReference({() -> fromNode}, {() -> nodeMap[toSignature]}, kind)) + } + + fun link(fromSignature: String, toNode: DocumentationNode, kind: DocumentationReference.Kind) { + references.add(PendingDocumentationReference({() -> nodeMap[fromSignature]}, {() -> toNode}, kind)) + } + + fun link(fromSignature: String, toSignature: String, kind: DocumentationReference.Kind) { + references.add(PendingDocumentationReference({() -> nodeMap[fromSignature]}, {() -> nodeMap[toSignature]}, kind)) + } + + fun lookup(signature: String): DocumentationNode? = nodeMap[signature] + + fun resolveReferences() { + references.forEach { it.resolve() } + } +} -- cgit