aboutsummaryrefslogtreecommitdiff
path: root/plugins/javadoc/src/main/kotlin
diff options
context:
space:
mode:
authorMarcin Aman <marcin.aman@gmail.com>2020-06-18 12:00:46 +0200
committerBłażej Kardyś <bkardys@virtuslab.com>2020-06-23 02:57:40 +0200
commit0206be47827e5b072dac3deb9ccc1792ba95b13c (patch)
treee00704bbb2a872e64b575c5f11ade21551a86535 /plugins/javadoc/src/main/kotlin
parentef2db3b74d2653c2f84eda4d7058ffcb546dae1d (diff)
downloaddokka-0206be47827e5b072dac3deb9ccc1792ba95b13c.tar.gz
dokka-0206be47827e5b072dac3deb9ccc1792ba95b13c.tar.bz2
dokka-0206be47827e5b072dac3deb9ccc1792ba95b13c.zip
Javadoc classlikes and function pages
All implemented interfaces, first attempt at inherited methods
Diffstat (limited to 'plugins/javadoc/src/main/kotlin')
-rw-r--r--plugins/javadoc/src/main/kotlin/javadoc/JavadocLocationProvider.kt2
-rw-r--r--plugins/javadoc/src/main/kotlin/javadoc/JavadocPageCreator.kt81
-rw-r--r--plugins/javadoc/src/main/kotlin/javadoc/KorteJavadocRenderer.kt114
-rw-r--r--plugins/javadoc/src/main/kotlin/javadoc/pages/JavadocContentNodes.kt23
-rw-r--r--plugins/javadoc/src/main/kotlin/javadoc/pages/JavadocPageNodes.kt112
-rw-r--r--plugins/javadoc/src/main/kotlin/javadoc/pages/OverviewSummary.kt161
6 files changed, 300 insertions, 193 deletions
diff --git a/plugins/javadoc/src/main/kotlin/javadoc/JavadocLocationProvider.kt b/plugins/javadoc/src/main/kotlin/javadoc/JavadocLocationProvider.kt
index 520486f6..a92320dd 100644
--- a/plugins/javadoc/src/main/kotlin/javadoc/JavadocLocationProvider.kt
+++ b/plugins/javadoc/src/main/kotlin/javadoc/JavadocLocationProvider.kt
@@ -91,7 +91,7 @@ class JavadocLocationProvider(pageRoot: RootPageNode, private val context: Dokka
}
}?.joinToString("/")?.let {if (skipExtension) "$it.html" else it}?.let {
Paths.get(dir).relativize(Paths.get(it)).toString()
- } ?: run {throw IllegalStateException("Page for ${link.name} not found")}
+ } ?: run {""} //TODO just a glue to compile it on HMPP
override fun resolveRoot(node: PageNode): String {
TODO("Not yet implemented")
diff --git a/plugins/javadoc/src/main/kotlin/javadoc/JavadocPageCreator.kt b/plugins/javadoc/src/main/kotlin/javadoc/JavadocPageCreator.kt
index 64fc539f..a3bef099 100644
--- a/plugins/javadoc/src/main/kotlin/javadoc/JavadocPageCreator.kt
+++ b/plugins/javadoc/src/main/kotlin/javadoc/JavadocPageCreator.kt
@@ -3,14 +3,21 @@ package javadoc
import javadoc.pages.*
import org.jetbrains.dokka.Platform
import org.jetbrains.dokka.base.signatures.SignatureProvider
+import org.jetbrains.dokka.base.signatures.function
import org.jetbrains.dokka.base.transformers.pages.comments.CommentsToContentConverter
import org.jetbrains.dokka.base.transformers.pages.comments.DocTagToContentConverter
import org.jetbrains.dokka.model.*
import org.jetbrains.dokka.model.doc.Description
+import org.jetbrains.dokka.model.doc.Param
+import org.jetbrains.dokka.model.doc.TagWrapper
+import org.jetbrains.dokka.model.doc.Text
+import org.jetbrains.dokka.model.properties.PropertyContainer
+import org.jetbrains.dokka.model.properties.WithExtraProperties
import org.jetbrains.dokka.pages.ContentKind
import org.jetbrains.dokka.pages.DCI
import org.jetbrains.dokka.utilities.DokkaLogger
import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstanceOrNull
+import org.jetbrains.kotlin.utils.addToStdlib.safeAs
open class JavadocPageCreator(
commentsToContentConverter: CommentsToContentConverter,
@@ -28,21 +35,28 @@ open class JavadocPageCreator(
fun pageForPackage(p: DPackage) =
JavadocPackagePageNode(p.name, contentForPackage(p), setOf(p.dri), p,
- p.classlikes.map { pageForClasslike(it) } // TODO: nested classlikes
- ).also {
- it
- }
+ p.classlikes.mapNotNull { pageForClasslike(it) } // TODO: nested classlikes
+ )
- fun pageForClasslike(c: DClasslike): JavadocClasslikePageNode {
- val constructors = when (c) {
- is DClass -> c.constructors
- is DEnum -> c.constructors
- else -> emptyList()
+ fun pageForClasslike(c: DClasslike): JavadocClasslikePageNode? =
+ c.sourceSets.firstOrNull { it.platform == Platform.jvm }?.let {jvm ->
+ JavadocClasslikePageNode(
+ name = c.name.orEmpty(),
+ content = contentForClasslike(c),
+ dri = setOf(c.dri),
+ modifiers = listOfNotNull(c.visibility[jvm]?.name),
+ signature = signatureProvider.signature(c),
+ description = c.description(jvm),
+ constructors = c.safeAs<WithConstructors>()?.constructors?.map { it.toJavadocFunction(jvm) }.orEmpty(),
+ methods = c.functions.map { it.toJavadocFunction(jvm) },
+ entries = c.safeAs<DEnum>()?.entries?.map { JavadocEntryNode(signatureProvider.signature(it), it.description(jvm)) }.orEmpty(),
+ classlikes = c.classlikes.mapNotNull { pageForClasslike(it) },
+ properties = c.properties.map { JavadocPropertyNode(signatureProvider.signature(it), TextNode(it.description(jvm), setOf(jvm))) },
+ documentable = c,
+ extras = c.safeAs<WithExtraProperties<Documentable>>()?.extra ?: PropertyContainer.empty()
+ )
}
- return JavadocClasslikePageNode(c.name.orEmpty(), contentForClasslike(c), setOf(c.dri), c, emptyList())
- }
-
fun contentForModule(m: DModule): JavadocContentNode =
JavadocContentGroup(
setOf(m.dri),
@@ -96,5 +110,48 @@ open class JavadocPageCreator(
kind = JavadocContentKind.Class
)
}
+
+ private fun signatureForProjection(p: Projection): String =
+ when (p) {
+ is OtherParameter -> p.name
+ is TypeConstructor -> if (p.function)
+ "TODO"
+ else {
+ val other = if(p.projections.isNotEmpty()){
+ p.projections.joinToString(prefix = "<", postfix = ">") { signatureForProjection(it) }
+ } else {
+ ""
+ }
+ "${p.dri.classNames.orEmpty()} $other"
+ }
+
+ is Variance -> "${p.kind} ${signatureForProjection(p.inner)}"
+ is Star -> "*"
+ is Nullable -> "${signatureForProjection(p.inner)}?"
+ is JavaObject -> "Object"
+ is Void -> "Void"
+ is PrimitiveJavaType -> p.name
+ is Dynamic -> "dynamic"
+ is UnresolvedBound -> p.name
+ }
+
+ private fun DFunction.toJavadocFunction(sourceSetData: SourceSetData) = JavadocFunctionNode(
+ name = name,
+ signature = signatureProvider.signature(this),
+ brief = TextNode(description(sourceSetData), setOf(sourceSetData)),
+ parameters = parameters.map {
+ JavadocParameterNode(
+ name = it.name.orEmpty(),
+ type = signatureForProjection(it.type),
+ description = TextNode(it.findNodeInDocumentation<Param>(sourceSetData), setOf(sourceSetData))
+ )
+ },
+ extras = extra
+ )
+
+ private fun Documentable.description(sourceSetData: SourceSetData): String = findNodeInDocumentation<Description>(sourceSetData)
+
+ private inline fun <reified T: TagWrapper> Documentable.findNodeInDocumentation(sourceSetData: SourceSetData): String =
+ documentation[sourceSetData]?.children?.firstIsInstanceOrNull<T>()?.root?.children?.firstIsInstanceOrNull<Text>()?.body.orEmpty()
}
diff --git a/plugins/javadoc/src/main/kotlin/javadoc/KorteJavadocRenderer.kt b/plugins/javadoc/src/main/kotlin/javadoc/KorteJavadocRenderer.kt
index aa7c2dfe..1026ea5c 100644
--- a/plugins/javadoc/src/main/kotlin/javadoc/KorteJavadocRenderer.kt
+++ b/plugins/javadoc/src/main/kotlin/javadoc/KorteJavadocRenderer.kt
@@ -8,13 +8,19 @@ import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
import org.jetbrains.dokka.base.renderers.OutputWriter
import org.jetbrains.dokka.links.DRI
+import org.jetbrains.dokka.links.sureClassNames
+import org.jetbrains.dokka.model.ImplementedInterfaces
+import org.jetbrains.dokka.model.InheritedFunction
import org.jetbrains.dokka.pages.*
import org.jetbrains.dokka.plugability.DokkaContext
import org.jetbrains.dokka.renderers.Renderer
+import org.jetbrains.kotlin.utils.addToStdlib.safeAs
import java.nio.file.Path
import java.nio.file.Paths
import java.time.LocalDate
+typealias PageContent = Map<String, Any?>
+
class KorteJavadocRenderer(val outputWriter: OutputWriter, val context: DokkaContext, val resourceDir: String) :
Renderer {
private lateinit var locationProvider: JavadocLocationProvider
@@ -67,8 +73,7 @@ class KorteJavadocRenderer(val outputWriter: OutputWriter, val context: DokkaCon
"docName" to "docName", // todo docname
"pathToRoot" to pathToRoot,
"dir" to dir
- ) + node.contentMap
-// DokkaConsoleLogger.info("${node::class.java.canonicalName}::${node.name} - $link")
+ ) + renderContentNodes(node)
writeFromTemplate(outputWriter, link, templateForNode(node), contentMap.toList())
node.children.forEach { renderNode(it, link.toNormalized()) }
}
@@ -120,11 +125,11 @@ class KorteJavadocRenderer(val outputWriter: OutputWriter, val context: DokkaCon
)
}
- private fun renderContentNode(content: ContentNode) = when(content) {
- is ContentText -> content.text
- is ContentComposite -> renderContent(content.children)
- else -> ""
- }
+// private fun renderContentNode(content: ContentNode) = when(content) {
+// is ContentText -> content.text
+// is ContentComposite -> renderContent(content.children)
+// else -> ""
+// }
private fun renderContent(content: List<ContentNode>): String =
content.joinToString("") { renderContentNode(it) }
@@ -179,7 +184,10 @@ class KorteJavadocRenderer(val outputWriter: OutputWriter, val context: DokkaCon
}
rootNodes.joinToString{ drawRec(it) }
},
- Filter("length") { subject.dynamicLength() }
+ Filter("length") { subject.dynamicLength() },
+ TeFunction("hasAnyDescription"){ args ->
+ args.first().safeAs<List<HashMap<String, String>>>()?.any { it["description"]?.trim()?.isNotEmpty() ?: false }
+ }
).forEach {
when (it) {
is TeFunction -> config.register(it)
@@ -197,4 +205,94 @@ class KorteJavadocRenderer(val outputWriter: OutputWriter, val context: DokkaCon
javaClass.classLoader.getResourceAsStream("$basePath/$template")?.bufferedReader()?.lines()?.toArray()
?.joinToString("\n") ?: throw IllegalStateException("Template not found: $basePath/$template")
}
+
+ private fun renderContentNodes(node: JavadocPageNode): PageContent =
+ when(node){
+ is JavadocClasslikePageNode -> renderClasslikeNode(node)
+ is JavadocFunctionNode -> renderFunctionNode(node)
+ else -> node.contentMap
+ }
+
+ private fun renderFunctionNode(node: JavadocFunctionNode): PageContent {
+ val (modifiers, signature) = node.modifiersAndSignature
+ return mapOf(
+ "signature" to renderContentNode(node.signature),
+ "brief" to renderContentNode(node.brief),
+ "parameters" to node.parameters.map { renderParameterNode(it) },
+ "inlineParameters" to node.parameters.joinToString { "${it.type} ${it.name}" },
+ "modifiers" to renderContentNode(modifiers),
+ "signatureWithoutModifiers" to renderContentNode(signature)) + node.contentMap
+ }
+
+ private fun renderParameterNode(node: JavadocParameterNode): PageContent =
+ mapOf(
+ "description" to renderContentNode(node.description),
+ ) + node.contentMap
+
+ private fun renderClasslikeNode(node: JavadocClasslikePageNode): PageContent =
+ mapOf(
+ "constructors" to node.constructors.map { renderContentNodes(it) },
+ "signature" to renderContentNode(node.signature),
+ "methods" to renderClasslikeMethods(node.methods),
+ "entries" to node.entries.map { renderEntryNode(it) },
+ "properties" to node.properties.map { renderPropertyNode(it)},
+ "classlikes" to node.classlikes.map { renderNestedClasslikeNode(it) },
+ "implementedInterfaces" to renderImplementedInterfaces(node)
+ ) + node.contentMap
+
+ private fun renderImplementedInterfaces(node: JavadocClasslikePageNode) =
+ node.extras[ImplementedInterfaces]?.interfaces?.map { it.displayable() }.orEmpty()
+
+ private fun renderClasslikeMethods(nodes: List<JavadocFunctionNode>): PageContent {
+ val (inherited, own) = nodes.partition { it.extras[InheritedFunction]?.isInherited ?: false }
+ return mapOf(
+ "own" to own.map { renderContentNodes(it) },
+ "inherited" to inherited.map { renderInheritedMethod(it) }.groupBy { it["inheritedFrom"] as String }.entries.map {
+ mapOf("inheritedFrom" to it.key, "names" to it.value.map{ it["name"] as String }.sorted().joinToString() )
+ }
+ )
+ }
+
+ private fun renderInheritedMethod(node: JavadocFunctionNode): PageContent {
+ val inheritedFrom = node.extras[InheritedFunction]?.inheritedFrom
+ return mapOf(
+ "inheritedFrom" to inheritedFrom?.displayable().orEmpty(),
+ "name" to node.name
+ )
+ }
+
+ private fun renderNestedClasslikeNode(node: JavadocClasslikePageNode): PageContent {
+ return mapOf(
+ "modifiers" to (node.modifiers + "static" + node.contentMap["kind"]).joinToString(separator = " "),
+ "signature" to node.name,
+ "description" to node.description
+ )
+ }
+
+ private fun renderPropertyNode(node: JavadocPropertyNode): PageContent {
+ val (modifiers, signature) = node.modifiersAndSignature
+ return mapOf(
+ "modifiers" to renderContentNode(modifiers),
+ "signature" to renderContentNode(signature),
+ "description" to renderContentNode(node.brief)
+ )
+ }
+
+ private fun renderEntryNode(node: JavadocEntryNode): PageContent =
+ mapOf(
+ "signature" to renderContentNode(node.signature),
+ ) + node.contentMap
+
+
+ //TODO is it possible to use html renderer?
+ private fun renderContentNode(node: ContentNode): String =
+ when(node){
+ is ContentGroup -> node.children.joinToString(separator = "") { renderContentNode(it) }
+ is ContentText -> node.text
+ is TextNode -> node.text
+ is ContentLink -> """<a href="TODO">${node.children.joinToString { renderContentNode(it) }} </a>"""
+ else -> ""
+ }
+
+ private fun DRI.displayable(): String = "${packageName}.${sureClassNames}"
} \ No newline at end of file
diff --git a/plugins/javadoc/src/main/kotlin/javadoc/pages/JavadocContentNodes.kt b/plugins/javadoc/src/main/kotlin/javadoc/pages/JavadocContentNodes.kt
index 031ce970..1c42adb3 100644
--- a/plugins/javadoc/src/main/kotlin/javadoc/pages/JavadocContentNodes.kt
+++ b/plugins/javadoc/src/main/kotlin/javadoc/pages/JavadocContentNodes.kt
@@ -37,6 +37,8 @@ class EmptyNode(
override fun withNewExtras(newExtras: PropertyContainer<ContentNode>): ContentNode =
EmptyNode(dci.dri.first(), dci.kind, sourceSets, newExtras)
+
+ override fun hasAnyContent(): Boolean = false
}
class JavadocContentGroup(
@@ -56,6 +58,8 @@ class JavadocContentGroup(
): JavadocContentGroup =
JavadocContentGroup(dri, kind, sourceSets, JavaContentGroupBuilder(sourceSets).apply(block).list)
}
+
+ override fun hasAnyContent(): Boolean = children.isNotEmpty()
}
class JavaContentGroupBuilder(val sourceSets: Set<SourceSetData>) {
@@ -71,6 +75,8 @@ class TitleNode(
sourceSets: Set<SourceSetData>
) : JavadocContentNode(dri, kind, sourceSets) {
+ override fun hasAnyContent(): Boolean = !title.isBlank() || !version.isBlank()
+
override val contentMap: Map<String, Any?> by lazy {
mapOf(
"title" to title,
@@ -78,8 +84,6 @@ class TitleNode(
"packageName" to parent
)
}
-
-// override fun withNewExtras(newExtras: PropertyContainer<ContentNode>): ContentNode = TODO()
}
fun JavaContentGroupBuilder.title(
@@ -92,6 +96,18 @@ fun JavaContentGroupBuilder.title(
list.add(TitleNode(title, version, parent, dri, kind, sourceSets))
}
+data class TextNode(
+ val text: String,
+ override val sourceSets: Set<SourceSetData>
+) : JavadocContentNode(emptySet(), ContentKind.Main, sourceSets) {
+
+ override fun hasAnyContent(): Boolean = !text.isBlank()
+
+ override val contentMap: Map<String, Any?> = mapOf(
+ "text" to text,
+ )
+}
+
class ListNode(
val tabTitle: String,
val colTitle: String,
@@ -100,6 +116,9 @@ class ListNode(
val kind: Kind,
sourceSets: Set<SourceSetData>
) : JavadocContentNode(dri, kind, sourceSets) {
+
+ override fun hasAnyContent(): Boolean = children.isNotEmpty()
+
override val contentMap: Map<String, Any?> by lazy {
mapOf(
"tabTitle" to tabTitle,
diff --git a/plugins/javadoc/src/main/kotlin/javadoc/pages/JavadocPageNodes.kt b/plugins/javadoc/src/main/kotlin/javadoc/pages/JavadocPageNodes.kt
index 118bc4d3..7f6abb15 100644
--- a/plugins/javadoc/src/main/kotlin/javadoc/pages/JavadocPageNodes.kt
+++ b/plugins/javadoc/src/main/kotlin/javadoc/pages/JavadocPageNodes.kt
@@ -6,10 +6,12 @@ import org.jetbrains.dokka.Platform
import org.jetbrains.dokka.base.renderers.platforms
import org.jetbrains.dokka.links.DRI
import org.jetbrains.dokka.model.*
+import org.jetbrains.dokka.model.properties.PropertyContainer
import org.jetbrains.dokka.pages.*
import org.jetbrains.kotlin.descriptors.ClassDescriptor
import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.resolve.DescriptorUtils.getClassDescriptorForType
+import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstance
interface JavadocPageNode : ContentPage {
val contentMap: Map<String, Any?>
@@ -79,20 +81,98 @@ class JavadocPackagePageNode(
)
}
+data class JavadocEntryNode(
+ val signature: ContentNode,
+ val brief: String
+) {
+ val contentMap: Map<String, Any?> = mapOf(
+ "brief" to brief
+ )
+}
+
+data class JavadocParameterNode(
+ val name: String,
+ val type: String,
+ val description: ContentNode
+) {
+ val contentMap: Map<String, Any?> = mapOf(
+ "name" to name,
+ "type" to type
+ )
+}
+
+data class JavadocPropertyNode(
+ val signature: ContentNode,
+ val brief: ContentNode
+){
+ val modifiersAndSignature: Pair<ContentNode, ContentNode>
+ get() = (signature as ContentGroup).splitSignatureIntoModifiersAndName()
+}
+
+data class JavadocFunctionNode(
+ val signature: ContentNode,
+ val brief: ContentNode,
+ val parameters: List<JavadocParameterNode>,
+ override val name: String,
+ override val dri: Set<DRI> = emptySet(),
+ override val content: ContentNode = EmptyNode(DRI.topLevel, ContentKind.Classlikes, emptySet()),
+ override val children: List<PageNode> = emptyList(),
+ override val documentable: Documentable? = null,
+ override val embeddedResources: List<String> = emptyList(),
+ val extras: PropertyContainer<DFunction> = PropertyContainer.empty()
+): JavadocPageNode {
+ override val contentMap: Map<String, Any?> = mapOf(
+ "name" to name
+ )
+
+ override fun modified(
+ name: String,
+ children: List<PageNode>
+ ): PageNode = TODO()
+
+ override fun modified(
+ name: String,
+ content: ContentNode,
+ dri: Set<DRI>,
+ embeddedResources: List<String>,
+ children: List<PageNode>
+ ): ContentPage = TODO()
+
+ val modifiersAndSignature: Pair<ContentNode, ContentNode>
+ get() = (signature as ContentGroup).splitSignatureIntoModifiersAndName()
+
+}
+
class JavadocClasslikePageNode(
override val name: String,
override val content: JavadocContentNode,
override val dri: Set<DRI>,
-
+ val modifiers: List<String>,
+ val signature: ContentNode,
+ val description: String,
+ val constructors: List<JavadocFunctionNode>,
+ val methods: List<JavadocFunctionNode>,
+ val entries: List<JavadocEntryNode>,
+ val classlikes: List<JavadocClasslikePageNode>,
+ val properties: List<JavadocPropertyNode>,
override val documentable: Documentable? = null,
override val children: List<PageNode> = emptyList(),
- override val embeddedResources: List<String> = listOf()
+ override val embeddedResources: List<String> = listOf(),
+ val extras: PropertyContainer<Documentable>,
) : JavadocPageNode {
- override val contentMap: Map<String, Any?> by lazy { mapOf("kind" to "class") + content.contentMap }
+ override val contentMap: Map<String, Any?> by lazy {
+ mapOf(
+ "kind" to documentable?.kind(),
+ "name" to name,
+ "package" to dri.first().packageName,
+ "classlikeDocumentation" to description
+ ) + content.contentMap
+ }
+
override fun modified(
name: String,
children: List<PageNode>
- ): PageNode = JavadocClasslikePageNode(name, content, dri, documentable, children, embeddedResources)
+ ): PageNode = JavadocClasslikePageNode(name, content, dri, modifiers, signature, description, constructors, methods, entries, classlikes, properties, documentable, children, embeddedResources, extras)
override fun modified(
name: String,
@@ -101,7 +181,7 @@ class JavadocClasslikePageNode(
embeddedResources: List<String>,
children: List<PageNode>
): ContentPage =
- JavadocClasslikePageNode(name, content as JavadocContentNode, dri, documentable, children, embeddedResources)
+ JavadocClasslikePageNode(name, content as JavadocContentNode, dri, modifiers, signature, description, constructors, methods, entries, classlikes, properties, documentable, children, embeddedResources, extras)
}
class AllClassesPage(val classes: List<JavadocClasslikePageNode>) : JavadocPageNode {
@@ -295,10 +375,8 @@ class TreeViewPage(
descriptorInheritanceTree.forEach { addToMap(it, mergeMap) }
psiInheritanceTree.forEach { addToMap(it, mergeMap) }
- val g = mergeMap.entries.find { it.key.classNames == "Any" || it.key.classNames == "Object" }?.value?.dri?.let(::collect)
- val rootClasses = listOf("Any", "Object")
val rootNodes = mergeMap.entries.filter {
- it.key.classNames in rootClasses //TODO: Probably should be matched by DRI, not just className
+ it.key.classNames in setOf("Any", "Object") //TODO: Probably should be matched by DRI, not just className
}.map {
collect(it.value.dri)
}
@@ -350,4 +428,20 @@ class TreeViewPage(
interface ContentValue
data class StringValue(val text: String) : ContentValue
-data class ListValue(val list: List<String>) : ContentValue \ No newline at end of file
+data class ListValue(val list: List<String>) : ContentValue
+
+private fun ContentGroup.splitSignatureIntoModifiersAndName(): Pair<ContentNode, ContentNode> {
+ val signature = children.firstIsInstance<ContentGroup>()
+ val modifiers = signature.children.takeWhile { it !is ContentLink }
+ return Pair(signature.copy(children = modifiers), signature.copy(children = signature.children.drop(modifiers.size)))
+}
+
+private fun Documentable.kind(): String? =
+ when(this){
+ is DClass -> "class"
+ is DEnum -> "enum"
+ is DAnnotation -> "annotation"
+ is DObject -> "object"
+ is DInterface -> "interface"
+ else -> null
+ } \ No newline at end of file
diff --git a/plugins/javadoc/src/main/kotlin/javadoc/pages/OverviewSummary.kt b/plugins/javadoc/src/main/kotlin/javadoc/pages/OverviewSummary.kt
deleted file mode 100644
index ae573007..00000000
--- a/plugins/javadoc/src/main/kotlin/javadoc/pages/OverviewSummary.kt
+++ /dev/null
@@ -1,161 +0,0 @@
-package javadoc.pages
-
-import java.time.LocalDate
-
-internal fun overviewSummary(title: String, version: String) = """
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-<!-- NewPage -->
-<html lang="en">
-<head>
-<title>Overview ($title $version API)</title>
-<meta name="date" content="${LocalDate.now()}">
-<link rel="stylesheet" type="text/css" href="stylesheet.css" title="Style">
-<script type="text/javascript" src="script.js"></script>
-</head>
-<body>
-<script type="text/javascript"><!--
- try {
- if (location.href.indexOf('is-external=true') == -1) {
- parent.document.title="Overview ($title $version API)";
- }
- }
- catch(err) {
- }
-//-->
-</script>
-<noscript>
-<div>JavaScript is disabled on your browser.</div>
-</noscript>
-<!-- ========= START OF TOP NAVBAR ======= -->
-<div class="topNav"><a name="navbar.top">
-<!-- -->
-</a>
-<div class="skipNav"><a href="#skip.navbar.top" title="Skip navigation links">Skip navigation links</a></div>
-<a name="navbar.top.firstrow">
-<!-- -->
-</a>
-<ul class="navList" title="Navigation">
-<li class="navBarCell1Rev">Overview</li>
-<li>Package</li>
-<li>Class</li>
-<li><a href="overview-tree.html">Tree</a></li>
-<li><a href="deprecated-list.html">Deprecated</a></li>
-<li><a href="index-all.html">Index</a></li>
-<li><a href="help-doc.html">Help</a></li>
-</ul>
-</div>
-<div class="subNav">
-<ul class="navList">
-<li>Prev</li>
-<li>Next</li>
-</ul>
-<ul class="navList">
-<li><a href="index.html?overview-summary.html" target="_top">Frames</a></li>
-<li><a href="overview-summary.html" target="_top">No&nbsp;Frames</a></li>
-</ul>
-<ul class="navList" id="allclasses_navbar_top">
-<li><a href="allclasses-noframe.html">All&nbsp;Classes</a></li>
-</ul>
-<div>
-<script type="text/javascript"><!--
- allClassesLink = document.getElementById("allclasses_navbar_top");
- if(window==top) {
- allClassesLink.style.display = "block";
- }
- else {
- allClassesLink.style.display = "none";
- }
- //-->
-</script>
-</div>
-<a name="skip.navbar.top">
-<!-- -->
-</a></div>
-<!-- ========= END OF TOP NAVBAR ========= -->
-<div class="header">
-<h1 class="title">terrain-generator 0.0.1 API</h1>
-</div>
-<div class="contentContainer">
-<table class="overviewSummary" border="0" cellpadding="3" cellspacing="0" summary="Packages table, listing packages, and an explanation">
-<caption><span>Packages</span><span class="tabEnd">&nbsp;</span></caption>
-<tr>
-<th class="colFirst" scope="col">Package</th>
-<th class="colLast" scope="col">Description</th>
-</tr>
-<tbody>
-<tr class="altColor">
-<td class="colFirst"><a href="adaptation/package-summary.html">adaptation</a></td>
-<td class="colLast">&nbsp;</td>
-</tr>
-<tr class="rowColor">
-<td class="colFirst"><a href="app/package-summary.html">app</a></td>
-<td class="colLast">&nbsp;</td>
-</tr>
-<tr class="altColor">
-<td class="colFirst"><a href="common/package-summary.html">common</a></td>
-<td class="colLast">&nbsp;</td>
-</tr>
-<tr class="rowColor">
-<td class="colFirst"><a href="model/package-summary.html">model</a></td>
-<td class="colLast">&nbsp;</td>
-</tr>
-<tr class="altColor">
-<td class="colFirst"><a href="processor/package-summary.html">processor</a></td>
-<td class="colLast">&nbsp;</td>
-</tr>
-<tr class="rowColor">
-<td class="colFirst"><a href="transformation/package-summary.html">transformation</a></td>
-<td class="colLast">&nbsp;</td>
-</tr>
-</tbody>
-</table>
-</div>
-<!-- ======= START OF BOTTOM NAVBAR ====== -->
-<div class="bottomNav"><a name="navbar.bottom">
-<!-- -->
-</a>
-<div class="skipNav"><a href="#skip.navbar.bottom" title="Skip navigation links">Skip navigation links</a></div>
-<a name="navbar.bottom.firstrow">
-<!-- -->
-</a>
-<ul class="navList" title="Navigation">
-<li class="navBarCell1Rev">Overview</li>
-<li>Package</li>
-<li>Class</li>
-<li><a href="overview-tree.html">Tree</a></li>
-<li><a href="deprecated-list.html">Deprecated</a></li>
-<li><a href="index-all.html">Index</a></li>
-<li><a href="help-doc.html">Help</a></li>
-</ul>
-</div>
-<div class="subNav">
-<ul class="navList">
-<li>Prev</li>
-<li>Next</li>
-</ul>
-<ul class="navList">
-<li><a href="index.html?overview-summary.html" target="_top">Frames</a></li>
-<li><a href="overview-summary.html" target="_top">No&nbsp;Frames</a></li>
-</ul>
-<ul class="navList" id="allclasses_navbar_bottom">
-<li><a href="allclasses-noframe.html">All&nbsp;Classes</a></li>
-</ul>
-<div>
-<script type="text/javascript"><!--
- allClassesLink = document.getElementById("allclasses_navbar_bottom");
- if(window==top) {
- allClassesLink.style.display = "block";
- }
- else {
- allClassesLink.style.display = "none";
- }
- //-->
-</script>
-</div>
-<a name="skip.navbar.bottom">
-<!-- -->
-</a></div>
-<!-- ======== END OF BOTTOM NAVBAR ======= -->
-</body>
-</html>
-""" \ No newline at end of file