blob: e7c6518390782c653ff1db48776818e746ce4743 [file] [log] [blame]
package org.jetbrains.dokka
import org.jetbrains.dokka.Formats.nameWithOuterClass
abstract class CommonLanguageService : LanguageService {
protected fun ContentBlock.renderPackage(node: DocumentationNode) {
keyword("package")
nbsp()
identifier(node.name)
}
override fun renderName(node: DocumentationNode): String {
return when (node.kind) {
NodeKind.Constructor -> node.owner!!.name
else -> node.name
}
}
override fun renderNameWithOuterClass(node: DocumentationNode): String {
return when (node.kind) {
NodeKind.Constructor -> node.owner!!.nameWithOuterClass()
else -> node.nameWithOuterClass()
}
}
open fun renderModifier(
block: ContentBlock,
node: DocumentationNode,
renderMode: LanguageService.RenderMode,
nowrap: Boolean = false
) = with(block) {
keyword(node.name)
if (nowrap) {
nbsp()
} else {
text(" ")
}
}
protected fun renderLinked(
block: ContentBlock,
node: DocumentationNode,
body: ContentBlock.(DocumentationNode) -> Unit
) = with(block) {
val to = node.links.firstOrNull()
if (to == null)
body(node)
else
link(to) {
this.body(node)
}
}
protected fun <T> ContentBlock.renderList(
nodes: List<T>, separator: String = ", ",
noWrap: Boolean = false, renderItem: (T) -> Unit
) {
if (nodes.none())
return
renderItem(nodes.first())
nodes.drop(1).forEach {
if (noWrap) {
symbol(separator.removeSuffix(" "))
nbsp()
} else {
symbol(separator)
}
renderItem(it)
}
}
abstract fun showModifierInSummary(node: DocumentationNode): Boolean
protected fun ContentBlock.renderModifiersForNode(
node: DocumentationNode,
renderMode: LanguageService.RenderMode,
nowrap: Boolean = false
) {
val modifiers = node.details(NodeKind.Modifier)
for (it in modifiers) {
if (node.kind == NodeKind.Interface && it.name == "abstract")
continue
if (renderMode == LanguageService.RenderMode.SUMMARY && !showModifierInSummary(it)) {
continue
}
renderModifier(this, it, renderMode, nowrap)
}
}
}