aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/src/main/kotlin/pages/ContentNodes.kt8
-rw-r--r--plugins/base/src/main/kotlin/resolvers/anchors/AnchorsHint.kt9
-rw-r--r--plugins/base/src/main/kotlin/resolvers/local/DefaultLocationProvider.kt16
-rw-r--r--plugins/base/src/main/kotlin/translators/documentables/DefaultPageCreator.kt1
-rw-r--r--plugins/base/src/main/kotlin/translators/documentables/PageContentBuilder.kt5
-rw-r--r--plugins/base/src/test/kotlin/utils/TestOutputWriter.kt1
-rw-r--r--plugins/javadoc/src/main/kotlin/javadoc/pages/JavadocContentNodes.kt4
7 files changed, 36 insertions, 8 deletions
diff --git a/core/src/main/kotlin/pages/ContentNodes.kt b/core/src/main/kotlin/pages/ContentNodes.kt
index 3843bb48..c8b767d3 100644
--- a/core/src/main/kotlin/pages/ContentNodes.kt
+++ b/core/src/main/kotlin/pages/ContentNodes.kt
@@ -2,6 +2,7 @@ package org.jetbrains.dokka.pages
import org.jetbrains.dokka.DokkaConfiguration.DokkaSourceSet
import org.jetbrains.dokka.links.DRI
+import org.jetbrains.dokka.model.WithChildren
import org.jetbrains.dokka.model.properties.PropertyContainer
import org.jetbrains.dokka.model.properties.WithExtraProperties
@@ -9,12 +10,15 @@ data class DCI(val dri: Set<DRI>, val kind: Kind) {
override fun toString() = "$dri[$kind]"
}
-interface ContentNode : WithExtraProperties<ContentNode> {
+interface ContentNode : WithExtraProperties<ContentNode>, WithChildren<ContentNode> {
val dci: DCI
val sourceSets: Set<DokkaSourceSet>
val style: Set<Style>
fun hasAnyContent(): Boolean
+
+ override val children: List<ContentNode>
+ get() = emptyList()
}
/** Simple text */
@@ -112,7 +116,7 @@ data class ContentEmbeddedResource(
/** Logical grouping of [ContentNode]s */
interface ContentComposite : ContentNode {
- val children: List<ContentNode>
+ override val children: List<ContentNode> // overwrite to make it abstract once again
override fun hasAnyContent(): Boolean = children.any { it.hasAnyContent() }
}
diff --git a/plugins/base/src/main/kotlin/resolvers/anchors/AnchorsHint.kt b/plugins/base/src/main/kotlin/resolvers/anchors/AnchorsHint.kt
new file mode 100644
index 00000000..1b741484
--- /dev/null
+++ b/plugins/base/src/main/kotlin/resolvers/anchors/AnchorsHint.kt
@@ -0,0 +1,9 @@
+package org.jetbrains.dokka.base.resolvers.anchors
+
+import org.jetbrains.dokka.model.properties.ExtraProperty
+import org.jetbrains.dokka.pages.ContentNode
+
+// TODO IMPORTANT: https://github.com/Kotlin/dokka/issues/1054
+object SymbolAnchorHint: ExtraProperty<ContentNode>, ExtraProperty.Key<ContentNode, SymbolAnchorHint> {
+ override val key = this
+} \ No newline at end of file
diff --git a/plugins/base/src/main/kotlin/resolvers/local/DefaultLocationProvider.kt b/plugins/base/src/main/kotlin/resolvers/local/DefaultLocationProvider.kt
index ba4523a1..1df0a700 100644
--- a/plugins/base/src/main/kotlin/resolvers/local/DefaultLocationProvider.kt
+++ b/plugins/base/src/main/kotlin/resolvers/local/DefaultLocationProvider.kt
@@ -2,6 +2,7 @@ package org.jetbrains.dokka.base.resolvers.local
import org.jetbrains.dokka.DokkaConfiguration
import org.jetbrains.dokka.DokkaConfiguration.DokkaSourceSet
+import org.jetbrains.dokka.base.resolvers.anchors.SymbolAnchorHint
import org.jetbrains.dokka.base.resolvers.external.ExternalLocationProvider
import org.jetbrains.dokka.links.DRI
import org.jetbrains.dokka.model.withDescendants
@@ -27,6 +28,16 @@ open class DefaultLocationProvider(
if (first) page else throw AssertionError("Multiple pages associated with dri: $dri")
}
+ protected val anchorsIndex = pageGraphRoot.withDescendants().filterIsInstance<ContentPage>()
+ .flatMap { page ->
+ page.content.withDescendants()
+ .filter { it.extra[SymbolAnchorHint] != null }
+ .mapNotNull { it.dci.dri.singleOrNull() }
+ .distinct()
+ .map { it to page }
+ }.toMap()
+
+
protected val pathsIndex: Map<PageNode, List<String>> = IdentityHashMap<PageNode, List<String>>().apply {
fun registerPath(page: PageNode, prefix: List<String>) {
val newPrefix = prefix + page.pathName
@@ -41,9 +52,10 @@ open class DefaultLocationProvider(
pathTo(node, context) + if (!skipExtension) extension else ""
override fun resolve(dri: DRI, sourceSets: Set<DokkaSourceSet>, context: PageNode?): String =
- pagesIndex[dri]?.let { resolve(it, context) } ?:
+ pagesIndex[dri]?.let { resolve(it, context) }
+ ?: anchorsIndex[dri]?.let { resolve(it, context) + "#$dri" }
// Not found in PageGraph, that means it's an external link
- getExternalLocation(dri, sourceSets)
+ ?: getExternalLocation(dri, sourceSets)
override fun resolveRoot(node: PageNode): String =
pathTo(pageGraphRoot, node).removeSuffix(PAGE_WITH_CHILDREN_SUFFIX)
diff --git a/plugins/base/src/main/kotlin/translators/documentables/DefaultPageCreator.kt b/plugins/base/src/main/kotlin/translators/documentables/DefaultPageCreator.kt
index eb2989db..19df2515 100644
--- a/plugins/base/src/main/kotlin/translators/documentables/DefaultPageCreator.kt
+++ b/plugins/base/src/main/kotlin/translators/documentables/DefaultPageCreator.kt
@@ -132,6 +132,7 @@ open class DefaultPageCreator(
ContentKind.Properties,
s.properties,
sourceSets.toSet(),
+ needsAnchors = true,
extra = mainExtra + SimpleAttr.header("Properties")
) {
link(it.name, it.dri, kind = ContentKind.Main)
diff --git a/plugins/base/src/main/kotlin/translators/documentables/PageContentBuilder.kt b/plugins/base/src/main/kotlin/translators/documentables/PageContentBuilder.kt
index babcc1c7..58b384e2 100644
--- a/plugins/base/src/main/kotlin/translators/documentables/PageContentBuilder.kt
+++ b/plugins/base/src/main/kotlin/translators/documentables/PageContentBuilder.kt
@@ -1,6 +1,7 @@
package org.jetbrains.dokka.base.translators.documentables
import org.jetbrains.dokka.DokkaConfiguration.DokkaSourceSet
+import org.jetbrains.dokka.base.resolvers.anchors.SymbolAnchorHint
import org.jetbrains.dokka.base.signatures.SignatureProvider
import org.jetbrains.dokka.base.transformers.pages.comments.CommentsToContentConverter
import org.jetbrains.dokka.links.DRI
@@ -167,6 +168,7 @@ open class PageContentBuilder(
renderWhenEmpty: Boolean = false,
needsSorting: Boolean = true,
headers: List<ContentGroup>? = null,
+ needsAnchors: Boolean = false,
operation: DocumentableContentBuilder.(T) -> Unit
) {
if (renderWhenEmpty || elements.any()) {
@@ -180,7 +182,8 @@ open class PageContentBuilder(
else it
}
.map {
- buildGroup(setOf(it.dri), it.sourceSets.toSet(), kind, styles, extra) {
+ val newExtra = if (needsAnchors) extra + SymbolAnchorHint else extra
+ buildGroup(setOf(it.dri), it.sourceSets.toSet(), kind, styles, newExtra) {
operation(it)
}
},
diff --git a/plugins/base/src/test/kotlin/utils/TestOutputWriter.kt b/plugins/base/src/test/kotlin/utils/TestOutputWriter.kt
index 83f1d180..00b865b4 100644
--- a/plugins/base/src/test/kotlin/utils/TestOutputWriter.kt
+++ b/plugins/base/src/test/kotlin/utils/TestOutputWriter.kt
@@ -20,7 +20,6 @@ class TestOutputWriter(private val failOnOverwrite: Boolean = true) : OutputWrit
val contents: Map<String, String> get() = _contents
private val _contents = mutableMapOf<String, String>()
-
override suspend fun write(path: String, text: String, ext: String) {
val fullPath = "$path$ext"
_contents.putIfAbsent(fullPath, text)?.also {
diff --git a/plugins/javadoc/src/main/kotlin/javadoc/pages/JavadocContentNodes.kt b/plugins/javadoc/src/main/kotlin/javadoc/pages/JavadocContentNodes.kt
index 5b45bdf7..c8593498 100644
--- a/plugins/javadoc/src/main/kotlin/javadoc/pages/JavadocContentNodes.kt
+++ b/plugins/javadoc/src/main/kotlin/javadoc/pages/JavadocContentNodes.kt
@@ -43,7 +43,7 @@ class JavadocContentGroup(
val dri: Set<DRI>,
val kind: Kind,
sourceSets: Set<DokkaSourceSet>,
- val children: List<JavadocContentNode>
+ override val children: List<JavadocContentNode>
) : JavadocContentNode(dri, kind, sourceSets) {
companion object {
@@ -96,7 +96,7 @@ data class TextNode(
class ListNode(
val tabTitle: String,
val colTitle: String,
- val children: List<JavadocListEntry>,
+ val entries: List<JavadocListEntry>,
val dri: Set<DRI>,
val kind: Kind,
sourceSets: Set<DokkaSourceSet>