aboutsummaryrefslogtreecommitdiff
path: root/plugins/base/src/main/kotlin/resolvers/local
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/base/src/main/kotlin/resolvers/local')
-rw-r--r--plugins/base/src/main/kotlin/resolvers/local/BaseLocationProvider.kt141
-rw-r--r--plugins/base/src/main/kotlin/resolvers/local/DefaultLocationProvider.kt232
-rw-r--r--plugins/base/src/main/kotlin/resolvers/local/DokkaLocationProvider.kt103
-rw-r--r--plugins/base/src/main/kotlin/resolvers/local/DokkaLocationProviderFactory.kt (renamed from plugins/base/src/main/kotlin/resolvers/local/DefaultLocationProviderFactory.kt)17
-rw-r--r--plugins/base/src/main/kotlin/resolvers/local/LocationProvider.kt8
-rw-r--r--plugins/base/src/main/kotlin/resolvers/local/LocationProviderFactory.kt7
-rw-r--r--plugins/base/src/main/kotlin/resolvers/local/MultimoduleLocationProvider.kt6
7 files changed, 155 insertions, 359 deletions
diff --git a/plugins/base/src/main/kotlin/resolvers/local/BaseLocationProvider.kt b/plugins/base/src/main/kotlin/resolvers/local/BaseLocationProvider.kt
deleted file mode 100644
index 06730641..00000000
--- a/plugins/base/src/main/kotlin/resolvers/local/BaseLocationProvider.kt
+++ /dev/null
@@ -1,141 +0,0 @@
-package org.jetbrains.dokka.base.resolvers.local
-
-import org.jetbrains.dokka.DokkaConfiguration
-import org.jetbrains.dokka.base.DokkaBase
-import org.jetbrains.dokka.links.DRI
-import org.jetbrains.dokka.model.DisplaySourceSet
-import org.jetbrains.dokka.model.sourceSetIDs
-import org.jetbrains.dokka.plugability.DokkaContext
-import org.jetbrains.dokka.plugability.plugin
-import org.jetbrains.dokka.plugability.query
-import java.net.HttpURLConnection
-import java.net.URL
-import java.net.URLConnection
-import java.util.concurrent.locks.ReentrantReadWriteLock
-import kotlin.concurrent.read
-import kotlin.concurrent.write
-
-abstract class BaseLocationProvider(protected val dokkaContext: DokkaContext) : LocationProvider {
-
- protected val externalLocationProviderFactories =
- dokkaContext.plugin<DokkaBase>().query { externalLocationProviderFactory }
- private val cache: MutableMap<URL, DefaultLocationProvider.LocationInfo> = mutableMapOf()
- private val lock = ReentrantReadWriteLock()
-
- protected fun getExternalLocation(
- dri: DRI,
- sourceSets: Set<DisplaySourceSet>
- ): String? {
- val jdkToExternalDocumentationLinks = dokkaContext.configuration.sourceSets
- .filter { sourceSet -> sourceSet.sourceSetID in sourceSets.sourceSetIDs }
- .groupBy({ it.jdkVersion }, { it.externalDocumentationLinks })
- .map { it.key to it.value.flatten().distinct() }.toMap()
-
- val toResolve: MutableMap<Int, MutableList<DokkaConfiguration.ExternalDocumentationLink>> = mutableMapOf()
- for ((jdk, links) in jdkToExternalDocumentationLinks) {
- for (link in links) {
- val info = lock.read { cache[link.packageListUrl] }
- if (info == null) {
- toResolve.getOrPut(jdk) { mutableListOf() }.add(link)
- } else if (info.packages.contains(dri.packageName)) {
- return link.url.toExternalForm() + getLink(dri, info)
- }
- }
- }
- // Not in cache, resolve packageLists
- for ((jdk, links) in toResolve) {
- for (link in links) {
- if (dokkaContext.configuration.offlineMode && link.packageListUrl.protocol.toLowerCase() != "file")
- continue
- val locationInfo =
- loadPackageList(jdk, link.packageListUrl)
- if (locationInfo.packages.contains(dri.packageName)) {
- return link.url.toExternalForm() + getLink(dri, locationInfo)
- }
- }
- toResolve.remove(jdk)
- }
- return null
- }
-
- private fun getLink(dri: DRI, locationInfo: DefaultLocationProvider.LocationInfo): String =
- locationInfo.locations[dri.packageName + "." + dri.classNames]
- ?: // Not sure if it can be here, previously it shadowed only kotlin/dokka related sources, here it shadows both dokka/javadoc, cause I cannot distinguish what LocationProvider has been hypothetically chosen
- if (locationInfo.externalLocationProvider != null)
- with(locationInfo.externalLocationProvider) {
- dri.toLocation()
- }
- else
- throw IllegalStateException("Have not found any convenient ExternalLocationProvider for $dri DRI!")
-
- private fun loadPackageList(jdk: Int, url: URL): DefaultLocationProvider.LocationInfo = lock.write {
- val packageListStream = url.doOpenConnectionToReadContent().getInputStream()
- val (params, packages) =
- packageListStream
- .bufferedReader()
- .useLines { lines -> lines.partition { it.startsWith(DOKKA_PARAM_PREFIX) } }
-
- val paramsMap = params.asSequence()
- .map { it.removePrefix(DOKKA_PARAM_PREFIX).split(":", limit = 2) }
- .groupBy({ (key, _) -> key }, { (_, value) -> value })
-
- val format = paramsMap["format"]?.singleOrNull() ?: when {
- jdk < 8 -> "javadoc1" // Covers JDK 1 - 7
- jdk < 10 -> "javadoc8" // Covers JDK 8 - 9
- else -> "javadoc10" // Covers JDK 10+
- }
-
- val locations = paramsMap["location"].orEmpty()
- .map { it.split("\u001f", limit = 2) }
- .map { (key, value) -> key to value }
- .toMap()
-
- val externalLocationProvider =
- externalLocationProviderFactories.asSequence().map { it.getExternalLocationProvider(format) }
- .filterNotNull().take(1).firstOrNull()
-
- val info = DefaultLocationProvider.LocationInfo(
- externalLocationProvider,
- packages.toSet(),
- locations
- )
- cache[url] = info
- return info
- }
-
- private fun URL.doOpenConnectionToReadContent(timeout: Int = 10000, redirectsAllowed: Int = 16): URLConnection {
- val connection = this.openConnection().apply {
- connectTimeout = timeout
- readTimeout = timeout
- }
-
- when (connection) {
- is HttpURLConnection -> {
- return when (connection.responseCode) {
- in 200..299 -> {
- connection
- }
- HttpURLConnection.HTTP_MOVED_PERM,
- HttpURLConnection.HTTP_MOVED_TEMP,
- HttpURLConnection.HTTP_SEE_OTHER -> {
- if (redirectsAllowed > 0) {
- val newUrl = connection.getHeaderField("Location")
- URL(newUrl).doOpenConnectionToReadContent(timeout, redirectsAllowed - 1)
- } else {
- throw RuntimeException("Too many redirects")
- }
- }
- else -> {
- throw RuntimeException("Unhandled http code: ${connection.responseCode}")
- }
- }
- }
- else -> return connection
- }
- }
-
- companion object {
- const val DOKKA_PARAM_PREFIX = "\$dokka."
- }
-
-}
diff --git a/plugins/base/src/main/kotlin/resolvers/local/DefaultLocationProvider.kt b/plugins/base/src/main/kotlin/resolvers/local/DefaultLocationProvider.kt
index 1c27959f..1e20dc7e 100644
--- a/plugins/base/src/main/kotlin/resolvers/local/DefaultLocationProvider.kt
+++ b/plugins/base/src/main/kotlin/resolvers/local/DefaultLocationProvider.kt
@@ -1,217 +1,51 @@
package org.jetbrains.dokka.base.resolvers.local
-import org.jetbrains.dokka.DokkaConfiguration
+import org.jetbrains.dokka.DokkaConfiguration.DokkaSourceSet
+import org.jetbrains.dokka.base.DokkaBase
import org.jetbrains.dokka.base.resolvers.anchors.SymbolAnchorHint
import org.jetbrains.dokka.base.resolvers.external.ExternalLocationProvider
+import org.jetbrains.dokka.base.resolvers.shared.ExternalDocumentationInfo
+import org.jetbrains.dokka.base.resolvers.shared.PackageList
import org.jetbrains.dokka.links.DRI
import org.jetbrains.dokka.model.DisplaySourceSet
import org.jetbrains.dokka.model.withDescendants
import org.jetbrains.dokka.pages.*
import org.jetbrains.dokka.plugability.DokkaContext
-import java.net.HttpURLConnection
-import java.net.URL
-import java.net.URLConnection
+import org.jetbrains.dokka.plugability.plugin
+import org.jetbrains.dokka.plugability.query
import java.util.*
-private const val PAGE_WITH_CHILDREN_SUFFIX = "index"
-
-open class DefaultLocationProvider(
+abstract class DefaultLocationProvider(
protected val pageGraphRoot: RootPageNode,
- dokkaContext: DokkaContext
-) : BaseLocationProvider(dokkaContext) {
- protected open val extension = ".html"
-
- protected val pagesIndex: Map<DRI, ContentPage> = pageGraphRoot.withDescendants().filterIsInstance<ContentPage>()
- .map { it.dri.map { dri -> dri to it } }.flatten()
- .groupingBy { it.first }
- .aggregate { dri, _, (_, page), first ->
- 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
- put(page, newPrefix)
- page.children.forEach { registerPath(it, newPrefix) }
- }
- put(pageGraphRoot, emptyList())
- pageGraphRoot.children.forEach { registerPath(it, emptyList()) }
- }
-
- override fun resolve(node: PageNode, context: PageNode?, skipExtension: Boolean) =
- pathTo(node, context) + if (!skipExtension) extension else ""
-
- override fun resolve(dri: DRI, sourceSets: Set<DisplaySourceSet>, context: PageNode?) =
- 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)
-
- override fun resolveRoot(node: PageNode): String =
- pathTo(pageGraphRoot, node).removeSuffix(PAGE_WITH_CHILDREN_SUFFIX)
-
- override fun ancestors(node: PageNode): List<PageNode> =
- generateSequence(node) { it.parent() }.toList()
-
- protected open fun pathTo(node: PageNode, context: PageNode?): String {
- fun pathFor(page: PageNode) = pathsIndex[page] ?: throw AssertionError(
- "${page::class.simpleName}(${page.name}) does not belong to current page graph so it is impossible to compute its path"
- )
-
- val contextNode =
- if (context !is ClasslikePageNode && context?.children?.isEmpty() == true && context.parent() != null) context.parent() else context
- val nodePath = pathFor(node)
- val contextPath = contextNode?.let { pathFor(it) }.orEmpty()
-
- val commonPathElements = nodePath.asSequence().zip(contextPath.asSequence())
- .takeWhile { (a, b) -> a == b }.count()
-
- return (List(contextPath.size - commonPathElements) { ".." } + nodePath.drop(commonPathElements) +
- if (node is ClasslikePageNode || node.children.isNotEmpty())
- listOf(PAGE_WITH_CHILDREN_SUFFIX)
- else
- emptyList()
- ).joinToString("/")
- }
-
- private fun PageNode.parent() = pageGraphRoot.parentMap[this]
-
- private val cache: MutableMap<URL, LocationInfo> = mutableMapOf()
-
- private fun getLocation(
- dri: DRI,
- jdkToExternalDocumentationLinks: Map<Int, List<DokkaConfiguration.ExternalDocumentationLink>>
- ): String {
- val toResolve: MutableMap<Int, MutableList<DokkaConfiguration.ExternalDocumentationLink>> = mutableMapOf()
- for ((jdk, links) in jdkToExternalDocumentationLinks) {
- for (link in links) {
- val info = cache[link.packageListUrl]
- if (info == null) {
- toResolve.getOrPut(jdk) { mutableListOf() }.add(link)
- } else if (info.packages.contains(dri.packageName)) {
- return link.url.toExternalForm() + getLink(dri, info)
- }
- }
- }
- // Not in cache, resolve packageLists
- for ((jdk, links) in toResolve) {
- for (link in links) {
- if(dokkaContext.configuration.offlineMode && link.packageListUrl.protocol.toLowerCase() != "file")
- continue
- val locationInfo =
- loadPackageList(jdk, link.packageListUrl)
- if (locationInfo.packages.contains(dri.packageName)) {
- return link.url.toExternalForm() + getLink(dri, locationInfo)
- }
+ protected val dokkaContext: DokkaContext,
+ protected val extension: String
+) : LocationProvider {
+ protected val externalLocationProviderFactories =
+ dokkaContext.plugin<DokkaBase>().query { externalLocationProviderFactory }
+
+ protected val packagesIndex: Map<String, ExternalLocationProvider?> = dokkaContext
+ .configuration
+ .sourceSets
+ .flatMap { sourceSet ->
+ sourceSet.externalDocumentationLinks.map {
+ PackageList.load(it.packageListUrl, sourceSet.jdkVersion, dokkaContext)
+ ?.let { packageList -> ExternalDocumentationInfo(it.url, packageList) }
}
- toResolve.remove(jdk)
- }
- return ""
- }
-
- private fun getLink(dri: DRI, locationInfo: LocationInfo): String =
- locationInfo.locations[dri.packageName + "." + dri.classNames]
- ?: // Not sure if it can be here, previously it shadowed only kotlin/dokka related sources, here it shadows both dokka/javadoc, cause I cannot distinguish what LocationProvider has been hypothetically chosen
- if (locationInfo.externalLocationProvider != null)
- with(locationInfo.externalLocationProvider) {
- dri.toLocation()
- }
- else
- throw IllegalStateException("Have not found any convenient ExternalLocationProvider for $dri DRI!")
-
- private fun loadPackageList(jdk: Int, url: URL): LocationInfo {
- val packageListStream = url.doOpenConnectionToReadContent().getInputStream()
- val (params, packages) =
- packageListStream
- .bufferedReader()
- .useLines { lines -> lines.partition { it.startsWith(DOKKA_PARAM_PREFIX) } }
-
- val paramsMap = params.asSequence()
- .map { it.removePrefix(DOKKA_PARAM_PREFIX).split(":", limit = 2) }
- .groupBy({ (key, _) -> key }, { (_, value) -> value })
-
- val format = paramsMap["format"]?.singleOrNull() ?: when {
- jdk < 8 -> "javadoc1" // Covers JDK 1 - 7
- jdk < 10 -> "javadoc8" // Covers JDK 8 - 9
- else -> "javadoc10" // Covers JDK 10+
}
-
- val locations = paramsMap["location"].orEmpty()
- .map { it.split("\u001f", limit = 2) }
- .map { (key, value) -> key to value }
- .toMap()
-
- val externalLocationProvider =
- externalLocationProviderFactories.asSequence().map { it.getExternalLocationProvider(format) }
- .filterNotNull().take(1).firstOrNull()
-
- val info = LocationInfo(
- externalLocationProvider,
- packages.toSet(),
- locations
- )
- cache[url] = info
- return info
- }
-
- private fun URL.doOpenConnectionToReadContent(timeout: Int = 10000, redirectsAllowed: Int = 16): URLConnection {
- val connection = this.openConnection().apply {
- connectTimeout = timeout
- readTimeout = timeout
- }
-
- when (connection) {
- is HttpURLConnection -> {
- return when (connection.responseCode) {
- in 200..299 -> {
- connection
- }
- HttpURLConnection.HTTP_MOVED_PERM,
- HttpURLConnection.HTTP_MOVED_TEMP,
- HttpURLConnection.HTTP_SEE_OTHER -> {
- if (redirectsAllowed > 0) {
- val newUrl = connection.getHeaderField("Location")
- URL(newUrl).doOpenConnectionToReadContent(timeout, redirectsAllowed - 1)
- } else {
- throw RuntimeException("Too many redirects")
- }
- }
- else -> {
- throw RuntimeException("Unhandled http code: ${connection.responseCode}")
- }
- }
+ .filterNotNull()
+ .flatMap { extDocInfo ->
+ extDocInfo.packageList.packages.map { packageName ->
+ val externalLocationProvider = (externalLocationProviderFactories.asSequence()
+ .mapNotNull { it.getExternalLocationProvider(extDocInfo) }.firstOrNull()
+ ?: run { dokkaContext.logger.error("No ExternalLocationProvider for '${extDocInfo.packageList.url}' found"); null })
+ run { null }
+ packageName to externalLocationProvider
}
- else -> return connection
}
- }
-
- data class LocationInfo(
- val externalLocationProvider: ExternalLocationProvider?,
- val packages: Set<String>,
- val locations: Map<String, String>
- )
-}
-
-private val reservedFilenames = setOf("index", "con", "aux", "lst", "prn", "nul", "eof", "inp", "out")
+ .toMap()
+ .filterKeys(String::isNotBlank)
-internal fun identifierToFilename(name: String): String {
- if (name.isEmpty()) return "--root--"
- val escaped = name.replace("<|>".toRegex(), "-")
- val lowercase = escaped.replace("[A-Z]".toRegex()) { matchResult -> "-" + matchResult.value.toLowerCase() }
- return if (lowercase in reservedFilenames) "--$lowercase--" else lowercase
-}
+ protected open fun getExternalLocation(dri: DRI, sourceSets: Set<DokkaSourceSet>): String? =
+ packagesIndex[dri.packageName]?.resolve(dri)
-private val PageNode.pathName: String
- get() = if (this is PackagePageNode) name else identifierToFilename(
- name
- )
+} \ No newline at end of file
diff --git a/plugins/base/src/main/kotlin/resolvers/local/DokkaLocationProvider.kt b/plugins/base/src/main/kotlin/resolvers/local/DokkaLocationProvider.kt
new file mode 100644
index 00000000..4233ffa1
--- /dev/null
+++ b/plugins/base/src/main/kotlin/resolvers/local/DokkaLocationProvider.kt
@@ -0,0 +1,103 @@
+package org.jetbrains.dokka.base.resolvers.local
+
+import org.jetbrains.dokka.DokkaConfiguration.DokkaSourceSet
+import org.jetbrains.dokka.base.DokkaBase
+import org.jetbrains.dokka.base.resolvers.anchors.SymbolAnchorHint
+import org.jetbrains.dokka.base.resolvers.external.ExternalLocationProvider
+import org.jetbrains.dokka.base.resolvers.shared.ExternalDocumentationInfo
+import org.jetbrains.dokka.base.resolvers.shared.PackageList
+import org.jetbrains.dokka.links.DRI
+import org.jetbrains.dokka.model.withDescendants
+import org.jetbrains.dokka.pages.*
+import org.jetbrains.dokka.plugability.DokkaContext
+import org.jetbrains.dokka.plugability.plugin
+import org.jetbrains.dokka.plugability.query
+import java.util.*
+
+open class DokkaLocationProvider(
+ pageGraphRoot: RootPageNode,
+ dokkaContext: DokkaContext,
+ extension: String = ".html"
+) : DefaultLocationProvider(pageGraphRoot, dokkaContext, extension) {
+ protected open val PAGE_WITH_CHILDREN_SUFFIX = "index"
+
+ protected open val pathsIndex: Map<PageNode, List<String>> = IdentityHashMap<PageNode, List<String>>().apply {
+ fun registerPath(page: PageNode, prefix: List<String>) {
+ val newPrefix = prefix + page.pathName
+ put(page, newPrefix)
+ page.children.forEach { registerPath(it, newPrefix) }
+ }
+ put(pageGraphRoot, emptyList())
+ pageGraphRoot.children.forEach { registerPath(it, emptyList()) }
+ }
+
+ protected open val pagesIndex: Map<DRI, ContentPage> = pageGraphRoot.withDescendants().filterIsInstance<ContentPage>()
+ .flatMap { it.dri.map { dri -> dri to it } }
+ .groupingBy { it.first }
+ .aggregate { dri, _, (_, page), first ->
+ if (first) page else throw AssertionError("Multiple pages associated with dri: $dri")
+ }
+
+ protected open 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()
+
+ override fun resolve(node: PageNode, context: PageNode?, skipExtension: Boolean) =
+ pathTo(node, context) + if (!skipExtension) extension else ""
+
+ override fun resolve(dri: DRI, sourceSets: Set<DokkaSourceSet>, context: PageNode?) =
+ 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)
+
+ override fun pathToRoot(from: PageNode): String =
+ pathTo(pageGraphRoot, from).removeSuffix(PAGE_WITH_CHILDREN_SUFFIX)
+
+ override fun ancestors(node: PageNode): List<PageNode> =
+ generateSequence(node) { it.parent() }.toList()
+
+ protected open fun pathTo(node: PageNode, context: PageNode?): String {
+ fun pathFor(page: PageNode) = pathsIndex[page] ?: throw AssertionError(
+ "${page::class.simpleName}(${page.name}) does not belong to current page graph so it is impossible to compute its path"
+ )
+
+ val contextNode =
+ if (context !is ClasslikePageNode && context?.children?.isEmpty() == true && context.parent() != null) context.parent() else context
+ val nodePath = pathFor(node)
+ val contextPath = contextNode?.let { pathFor(it) }.orEmpty()
+
+ val commonPathElements = nodePath.asSequence().zip(contextPath.asSequence())
+ .takeWhile { (a, b) -> a == b }.count()
+
+ return (List(contextPath.size - commonPathElements) { ".." } + nodePath.drop(commonPathElements) +
+ if (node is ClasslikePageNode || node.children.isNotEmpty())
+ listOf(PAGE_WITH_CHILDREN_SUFFIX)
+ else
+ emptyList()
+ ).joinToString("/")
+ }
+
+ private fun PageNode.parent() = pageGraphRoot.parentMap[this]
+
+ private val PageNode.pathName: String
+ get() = if (this is PackagePageNode) name else identifierToFilename(name)
+
+ companion object {
+ internal val reservedFilenames = setOf("index", "con", "aux", "lst", "prn", "nul", "eof", "inp", "out")
+
+ internal fun identifierToFilename(name: String): String {
+ if (name.isEmpty()) return "--root--"
+ val escaped = name.replace("[<>]".toRegex(), "-")
+ val lowercase = escaped.replace("[A-Z]".toRegex()) { matchResult -> "-" + matchResult.value.toLowerCase() }
+ return if (lowercase in reservedFilenames) "--$lowercase--" else lowercase
+ }
+ }
+}
+
+
diff --git a/plugins/base/src/main/kotlin/resolvers/local/DefaultLocationProviderFactory.kt b/plugins/base/src/main/kotlin/resolvers/local/DokkaLocationProviderFactory.kt
index 442d2e6d..99cc0687 100644
--- a/plugins/base/src/main/kotlin/resolvers/local/DefaultLocationProviderFactory.kt
+++ b/plugins/base/src/main/kotlin/resolvers/local/DokkaLocationProviderFactory.kt
@@ -3,21 +3,18 @@ package org.jetbrains.dokka.base.resolvers.local
import org.jetbrains.dokka.pages.MultimoduleRootPageNode
import org.jetbrains.dokka.pages.RootPageNode
import org.jetbrains.dokka.plugability.DokkaContext
-import java.util.*
import java.util.concurrent.ConcurrentHashMap
-class DefaultLocationProviderFactory(private val context: DokkaContext) : LocationProviderFactory {
-
+class DokkaLocationProviderFactory(private val context: DokkaContext) : LocationProviderFactory {
private val cache = ConcurrentHashMap<CacheWrapper, LocationProvider>()
override fun getLocationProvider(pageNode: RootPageNode) = cache.computeIfAbsent(CacheWrapper(pageNode)) {
if (pageNode.children.first() is MultimoduleRootPageNode) MultimoduleLocationProvider(pageNode, context)
- else DefaultLocationProvider(pageNode, context)
+ else DokkaLocationProvider(pageNode, context)
}
-}
-
-private class CacheWrapper(val pageNode: RootPageNode) {
- override fun equals(other: Any?) = other is CacheWrapper && other.pageNode == this.pageNode
- override fun hashCode() = System.identityHashCode(pageNode)
-} \ No newline at end of file
+ private class CacheWrapper(val pageNode: RootPageNode) {
+ override fun equals(other: Any?) = other is CacheWrapper && other.pageNode == this.pageNode
+ override fun hashCode() = System.identityHashCode(pageNode)
+ }
+}
diff --git a/plugins/base/src/main/kotlin/resolvers/local/LocationProvider.kt b/plugins/base/src/main/kotlin/resolvers/local/LocationProvider.kt
index 391af004..3775e94e 100644
--- a/plugins/base/src/main/kotlin/resolvers/local/LocationProvider.kt
+++ b/plugins/base/src/main/kotlin/resolvers/local/LocationProvider.kt
@@ -3,16 +3,10 @@ package org.jetbrains.dokka.base.resolvers.local
import org.jetbrains.dokka.links.DRI
import org.jetbrains.dokka.model.DisplaySourceSet
import org.jetbrains.dokka.pages.PageNode
-import org.jetbrains.dokka.pages.RootPageNode
interface LocationProvider {
fun resolve(dri: DRI, sourceSets: Set<DisplaySourceSet>, context: PageNode? = null): String?
fun resolve(node: PageNode, context: PageNode? = null, skipExtension: Boolean = false): String?
- fun resolveRoot(node: PageNode): String
+ fun pathToRoot(from: PageNode): String
fun ancestors(node: PageNode): List<PageNode>
}
-
-interface LocationProviderFactory {
- fun getLocationProvider(pageNode: RootPageNode): LocationProvider
-}
-
diff --git a/plugins/base/src/main/kotlin/resolvers/local/LocationProviderFactory.kt b/plugins/base/src/main/kotlin/resolvers/local/LocationProviderFactory.kt
new file mode 100644
index 00000000..fb72fc60
--- /dev/null
+++ b/plugins/base/src/main/kotlin/resolvers/local/LocationProviderFactory.kt
@@ -0,0 +1,7 @@
+package org.jetbrains.dokka.base.resolvers.local
+
+import org.jetbrains.dokka.pages.RootPageNode
+
+interface LocationProviderFactory {
+ fun getLocationProvider(pageNode: RootPageNode): LocationProvider
+}
diff --git a/plugins/base/src/main/kotlin/resolvers/local/MultimoduleLocationProvider.kt b/plugins/base/src/main/kotlin/resolvers/local/MultimoduleLocationProvider.kt
index 5d2a96d5..f8c8fc6c 100644
--- a/plugins/base/src/main/kotlin/resolvers/local/MultimoduleLocationProvider.kt
+++ b/plugins/base/src/main/kotlin/resolvers/local/MultimoduleLocationProvider.kt
@@ -1,5 +1,7 @@
package org.jetbrains.dokka.base.resolvers.local
+import org.jetbrains.dokka.DokkaConfiguration.DokkaSourceSet
+import org.jetbrains.dokka.base.resolvers.local.DokkaLocationProvider.Companion.identifierToFilename
import org.jetbrains.dokka.links.DRI
import org.jetbrains.dokka.model.DisplaySourceSet
import org.jetbrains.dokka.pages.PageNode
@@ -8,7 +10,7 @@ import org.jetbrains.dokka.plugability.DokkaContext
class MultimoduleLocationProvider(private val root: RootPageNode, context: DokkaContext) : LocationProvider {
- private val defaultLocationProvider = DefaultLocationProvider(root, context)
+ private val defaultLocationProvider = DokkaLocationProvider(root, context)
val paths = context.configuration.modules.map {
it.name to it.path
@@ -22,7 +24,7 @@ class MultimoduleLocationProvider(private val root: RootPageNode, context: Dokka
override fun resolve(node: PageNode, context: PageNode?, skipExtension: Boolean) =
defaultLocationProvider.resolve(node, context, skipExtension)
- override fun resolveRoot(node: PageNode): String = defaultLocationProvider.resolveRoot(node)
+ override fun pathToRoot(from: PageNode): String = defaultLocationProvider.pathToRoot(from)
override fun ancestors(node: PageNode): List<PageNode> = listOf(root)