aboutsummaryrefslogtreecommitdiff
path: root/plugins/base
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/base')
-rw-r--r--plugins/base/src/test/kotlin/basic/DRITest.kt5
-rw-r--r--plugins/base/src/test/kotlin/basic/DokkaBasicTests.kt9
-rw-r--r--plugins/base/src/test/kotlin/enums/EnumsTest.kt20
-rw-r--r--plugins/base/src/test/kotlin/expect/AbstractExpectTest.kt104
-rw-r--r--plugins/base/src/test/kotlin/expect/ExpectGenerator.kt15
-rw-r--r--plugins/base/src/test/kotlin/expect/ExpectTest.kt70
-rw-r--r--plugins/base/src/test/kotlin/expect/ExpectUtils.kt28
-rw-r--r--plugins/base/src/test/kotlin/issues/IssuesTest.kt2
-rw-r--r--plugins/base/src/test/kotlin/markdown/KDocTest.kt4
-rw-r--r--plugins/base/src/test/kotlin/markdown/ParserTest.kt761
-rw-r--r--plugins/base/src/test/kotlin/model/ClassesTest.kt6
-rw-r--r--plugins/base/src/test/kotlin/model/CommentTest.kt2
-rw-r--r--plugins/base/src/test/kotlin/model/FunctionsTest.kt2
-rw-r--r--plugins/base/src/test/kotlin/model/InheritorsTest.kt2
-rw-r--r--plugins/base/src/test/kotlin/model/JavaTest.kt6
-rw-r--r--plugins/base/src/test/kotlin/model/PackagesTest.kt2
-rw-r--r--plugins/base/src/test/kotlin/model/PropertyTest.kt2
-rw-r--r--plugins/base/src/test/kotlin/multiplatform/BasicMultiplatformTest.kt4
-rw-r--r--plugins/base/src/test/kotlin/pageMerger/PageNodeMergerTest.kt19
-rw-r--r--plugins/base/src/test/kotlin/renderers/html/GroupWrappingTest.kt2
-rw-r--r--plugins/base/src/test/kotlin/renderers/html/PlatformDependentHintTest.kt5
-rw-r--r--plugins/base/src/test/resources/expect/annotatedFunction/out/html/-search.html (renamed from plugins/base/src/test/resources/expect/test/out/-search.html)0
-rw-r--r--plugins/base/src/test/resources/expect/annotatedFunction/out/html/navigation.html10
-rw-r--r--plugins/base/src/test/resources/expect/annotatedFunction/out/html/root/f.html20
-rw-r--r--plugins/base/src/test/resources/expect/annotatedFunction/out/html/root/index.html31
-rw-r--r--plugins/base/src/test/resources/expect/annotatedFunction/src/annotatedFunction.kt2
-rw-r--r--plugins/base/src/test/resources/expect/annotatedFunctionWithAnnotationParameters/out/html/-search.html23
-rw-r--r--plugins/base/src/test/resources/expect/annotatedFunctionWithAnnotationParameters/out/html/navigation.html25
-rw-r--r--plugins/base/src/test/resources/expect/annotatedFunctionWithAnnotationParameters/out/html/root/-fancy/-init-.html30
-rw-r--r--plugins/base/src/test/resources/expect/annotatedFunctionWithAnnotationParameters/out/html/root/-fancy/equals.html30
-rw-r--r--plugins/base/src/test/resources/expect/annotatedFunctionWithAnnotationParameters/out/html/root/-fancy/hash-code.html20
-rw-r--r--plugins/base/src/test/resources/expect/annotatedFunctionWithAnnotationParameters/out/html/root/-fancy/index.html61
-rw-r--r--plugins/base/src/test/resources/expect/annotatedFunctionWithAnnotationParameters/out/html/root/-fancy/to-string.html20
-rw-r--r--plugins/base/src/test/resources/expect/annotatedFunctionWithAnnotationParameters/out/html/root/f.html20
-rw-r--r--plugins/base/src/test/resources/expect/annotatedFunctionWithAnnotationParameters/out/html/root/index.html42
-rw-r--r--plugins/base/src/test/resources/expect/annotatedFunctionWithAnnotationParameters/src/annotatedFunctionWithAnnotationParameters.kt7
-rw-r--r--plugins/base/src/test/resources/expect/function/out/html/-search.html23
-rw-r--r--plugins/base/src/test/resources/expect/function/out/html/navigation.html (renamed from plugins/base/src/test/resources/expect/test/out/navigation.html)0
-rw-r--r--plugins/base/src/test/resources/expect/function/out/html/root/fn.html (renamed from plugins/base/src/test/resources/expect/test/out/root/fn.html)0
-rw-r--r--plugins/base/src/test/resources/expect/function/out/html/root/index.html (renamed from plugins/base/src/test/resources/expect/test/out/root/index.html)0
-rw-r--r--plugins/base/src/test/resources/expect/function/src/function.kt (renamed from plugins/base/src/test/resources/expect/test/src/function.kt)0
-rw-r--r--plugins/base/src/test/resources/expect/functionWithAnnotatedParam/out/html/-search.html23
-rw-r--r--plugins/base/src/test/resources/expect/functionWithAnnotatedParam/out/html/navigation.html25
-rw-r--r--plugins/base/src/test/resources/expect/functionWithAnnotatedParam/out/html/root/-fancy/-init-.html20
-rw-r--r--plugins/base/src/test/resources/expect/functionWithAnnotatedParam/out/html/root/-fancy/equals.html30
-rw-r--r--plugins/base/src/test/resources/expect/functionWithAnnotatedParam/out/html/root/-fancy/hash-code.html20
-rw-r--r--plugins/base/src/test/resources/expect/functionWithAnnotatedParam/out/html/root/-fancy/index.html51
-rw-r--r--plugins/base/src/test/resources/expect/functionWithAnnotatedParam/out/html/root/-fancy/to-string.html20
-rw-r--r--plugins/base/src/test/resources/expect/functionWithAnnotatedParam/out/html/root/function.html30
-rw-r--r--plugins/base/src/test/resources/expect/functionWithAnnotatedParam/out/html/root/index.html42
-rw-r--r--plugins/base/src/test/resources/expect/functionWithAnnotatedParam/src/functionWithAnnotatedParam.kt7
-rw-r--r--plugins/base/src/test/resources/expect/functionWithDefaultParameter/out/html/-search.html23
-rw-r--r--plugins/base/src/test/resources/expect/functionWithDefaultParameter/out/html/navigation.html10
-rw-r--r--plugins/base/src/test/resources/expect/functionWithDefaultParameter/out/html/root/f.html30
-rw-r--r--plugins/base/src/test/resources/expect/functionWithDefaultParameter/out/html/root/index.html31
-rw-r--r--plugins/base/src/test/resources/expect/functionWithDefaultParameter/src/functionWithDefaultParameter.kt1
-rw-r--r--plugins/base/src/test/resources/expect/functionWithNoinlineParam/out/html/-search.html23
-rw-r--r--plugins/base/src/test/resources/expect/functionWithNoinlineParam/out/html/navigation.html10
-rw-r--r--plugins/base/src/test/resources/expect/functionWithNoinlineParam/out/html/root/function.html30
-rw-r--r--plugins/base/src/test/resources/expect/functionWithNoinlineParam/out/html/root/index.html31
-rw-r--r--plugins/base/src/test/resources/expect/functionWithNoinlineParam/src/functionWithNoinlineParam.kt2
-rw-r--r--plugins/base/src/test/resources/expect/functionWithNotDocumentedAnnotation/out/html/-search.html23
-rw-r--r--plugins/base/src/test/resources/expect/functionWithNotDocumentedAnnotation/out/html/navigation.html10
-rw-r--r--plugins/base/src/test/resources/expect/functionWithNotDocumentedAnnotation/out/html/root/f.html20
-rw-r--r--plugins/base/src/test/resources/expect/functionWithNotDocumentedAnnotation/out/html/root/index.html31
-rw-r--r--plugins/base/src/test/resources/expect/functionWithNotDocumentedAnnotation/src/functionWithNotDocumentedAnnotation.kt2
-rw-r--r--plugins/base/src/test/resources/expect/functionWithParams/out/html/-search.html23
-rw-r--r--plugins/base/src/test/resources/expect/functionWithParams/out/html/navigation.html10
-rw-r--r--plugins/base/src/test/resources/expect/functionWithParams/out/html/root/function.html34
-rw-r--r--plugins/base/src/test/resources/expect/functionWithParams/out/html/root/index.html31
-rw-r--r--plugins/base/src/test/resources/expect/functionWithParams/src/functionWithParams.kt8
-rw-r--r--plugins/base/src/test/resources/expect/functionWithReceiver/out/html/-search.html23
-rw-r--r--plugins/base/src/test/resources/expect/functionWithReceiver/out/html/navigation.html10
-rw-r--r--plugins/base/src/test/resources/expect/functionWithReceiver/out/html/root/fn.html38
-rw-r--r--plugins/base/src/test/resources/expect/functionWithReceiver/out/html/root/index.html36
-rw-r--r--plugins/base/src/test/resources/expect/functionWithReceiver/src/functionWithReceiver.kt11
-rw-r--r--plugins/base/src/test/resources/expect/genericFunction/out/html/-search.html23
-rw-r--r--plugins/base/src/test/resources/expect/genericFunction/out/html/navigation.html10
-rw-r--r--plugins/base/src/test/resources/expect/genericFunction/out/html/root/generic.html23
-rw-r--r--plugins/base/src/test/resources/expect/genericFunction/out/html/root/index.html31
-rw-r--r--plugins/base/src/test/resources/expect/genericFunction/src/genericFunction.kt5
-rw-r--r--plugins/base/src/test/resources/expect/genericFunctionWithConstraints/out/html/-search.html23
-rw-r--r--plugins/base/src/test/resources/expect/genericFunctionWithConstraints/out/html/navigation.html10
-rw-r--r--plugins/base/src/test/resources/expect/genericFunctionWithConstraints/out/html/root/generic.html23
-rw-r--r--plugins/base/src/test/resources/expect/genericFunctionWithConstraints/out/html/root/index.html31
-rw-r--r--plugins/base/src/test/resources/expect/genericFunctionWithConstraints/src/genericFunctionWithConstraints.kt6
-rw-r--r--plugins/base/src/test/resources/expect/inlineFunction/out/html/-search.html23
-rw-r--r--plugins/base/src/test/resources/expect/inlineFunction/out/html/navigation.html10
-rw-r--r--plugins/base/src/test/resources/expect/inlineFunction/out/html/root/f.html30
-rw-r--r--plugins/base/src/test/resources/expect/inlineFunction/out/html/root/index.html31
-rw-r--r--plugins/base/src/test/resources/expect/inlineFunction/src/inlineFunction.kt2
-rw-r--r--plugins/base/src/test/resources/expect/inlineSuspendFunction/out/html/-search.html23
-rw-r--r--plugins/base/src/test/resources/expect/inlineSuspendFunction/out/html/navigation.html10
-rw-r--r--plugins/base/src/test/resources/expect/inlineSuspendFunction/out/html/root/f.html30
-rw-r--r--plugins/base/src/test/resources/expect/inlineSuspendFunction/out/html/root/index.html31
-rw-r--r--plugins/base/src/test/resources/expect/inlineSuspendFunction/src/inlineSuspendFunction.kt2
-rw-r--r--plugins/base/src/test/resources/expect/sinceKotlin/out/html/-search.html23
-rw-r--r--plugins/base/src/test/resources/expect/sinceKotlin/out/html/navigation.html10
-rw-r--r--plugins/base/src/test/resources/expect/sinceKotlin/out/html/root/available-since1.1.html23
-rw-r--r--plugins/base/src/test/resources/expect/sinceKotlin/out/html/root/index.html31
-rw-r--r--plugins/base/src/test/resources/expect/sinceKotlin/src/sinceKotlin.kt5
-rw-r--r--plugins/base/src/test/resources/expect/suspendFunction/out/html/-search.html23
-rw-r--r--plugins/base/src/test/resources/expect/suspendFunction/out/html/navigation.html10
-rw-r--r--plugins/base/src/test/resources/expect/suspendFunction/out/html/root/f.html20
-rw-r--r--plugins/base/src/test/resources/expect/suspendFunction/out/html/root/index.html31
-rw-r--r--plugins/base/src/test/resources/expect/suspendFunction/src/suspendFunction.kt2
-rw-r--r--plugins/base/src/test/resources/expect/suspendInlineFunction/out/html/-search.html23
-rw-r--r--plugins/base/src/test/resources/expect/suspendInlineFunction/out/html/navigation.html10
-rw-r--r--plugins/base/src/test/resources/expect/suspendInlineFunction/out/html/root/f.html30
-rw-r--r--plugins/base/src/test/resources/expect/suspendInlineFunction/out/html/root/index.html31
-rw-r--r--plugins/base/src/test/resources/expect/suspendInlineFunction/src/suspendInlineFunction.kt2
-rw-r--r--plugins/base/src/test/resources/expect/test/out/images/arrow_down.svg3
-rw-r--r--plugins/base/src/test/resources/expect/test/out/images/logo-icon.svg3
-rw-r--r--plugins/base/src/test/resources/expect/test/out/images/logo-text.svg6
-rw-r--r--plugins/base/src/test/resources/expect/test/out/scripts/navigationLoader.js12
-rw-r--r--plugins/base/src/test/resources/expect/test/out/scripts/pages.js5
-rw-r--r--plugins/base/src/test/resources/expect/test/out/scripts/scripts.js11
-rw-r--r--plugins/base/src/test/resources/expect/test/out/scripts/search.js5
-rw-r--r--plugins/base/src/test/resources/expect/test/out/styles/style.css353
119 files changed, 2461 insertions, 791 deletions
diff --git a/plugins/base/src/test/kotlin/basic/DRITest.kt b/plugins/base/src/test/kotlin/basic/DRITest.kt
index ca8e4bad..0e1f095e 100644
--- a/plugins/base/src/test/kotlin/basic/DRITest.kt
+++ b/plugins/base/src/test/kotlin/basic/DRITest.kt
@@ -3,10 +3,11 @@ package basic
import org.jetbrains.dokka.links.*
import org.jetbrains.dokka.pages.ContentPage
import org.jetbrains.dokka.pages.asSequence
-import org.junit.Assert.assertEquals
-import org.junit.Test
+import org.junit.jupiter.api.Assertions.assertEquals
import org.jetbrains.dokka.testApi.testRunner.AbstractCoreTest
+import org.junit.jupiter.api.Test
+
class DRITest : AbstractCoreTest() {
@Test
fun `#634`() {
diff --git a/plugins/base/src/test/kotlin/basic/DokkaBasicTests.kt b/plugins/base/src/test/kotlin/basic/DokkaBasicTests.kt
index 0405b91c..dae1b2be 100644
--- a/plugins/base/src/test/kotlin/basic/DokkaBasicTests.kt
+++ b/plugins/base/src/test/kotlin/basic/DokkaBasicTests.kt
@@ -2,7 +2,8 @@ package basic
import org.jetbrains.dokka.pages.ClasslikePageNode
import org.jetbrains.dokka.pages.ModulePageNode
-import org.junit.Test
+import org.junit.jupiter.api.Assertions.assertTrue
+import org.junit.jupiter.api.Test
import org.jetbrains.dokka.testApi.testRunner.AbstractCoreTest
class DokkaBasicTests : AbstractCoreTest() {
@@ -31,11 +32,11 @@ class DokkaBasicTests : AbstractCoreTest() {
) {
pagesGenerationStage = {
println(it.dri)
- assert(it.getClasslikeToMemberMap().filterKeys { it.name == "Test" }.entries.firstOrNull()?.value?.size == 5)
+ assertTrue(it.getClasslikeToMemberMap().filterKeys { it.name == "Test" }.entries.firstOrNull()?.value?.size == 5)
}
}
}
- fun ModulePageNode.getClasslikeToMemberMap() =
- this.parentMap.filterValues { it is ClasslikePageNode }.entries.groupBy ({it.value}){it.key}
+ private fun ModulePageNode.getClasslikeToMemberMap() =
+ this.parentMap.filterValues { it is ClasslikePageNode }.entries.groupBy({ it.value }) { it.key }
} \ No newline at end of file
diff --git a/plugins/base/src/test/kotlin/enums/EnumsTest.kt b/plugins/base/src/test/kotlin/enums/EnumsTest.kt
index 34e92d82..55ad0fbc 100644
--- a/plugins/base/src/test/kotlin/enums/EnumsTest.kt
+++ b/plugins/base/src/test/kotlin/enums/EnumsTest.kt
@@ -3,9 +3,9 @@ package enums
import org.jetbrains.dokka.model.DEnum
import org.jetbrains.dokka.pages.ClasslikePageNode
import org.jetbrains.dokka.pages.ModulePageNode
-import org.junit.Assert.*
-import org.junit.Test
+import org.junit.jupiter.api.Test
import org.jetbrains.dokka.testApi.testRunner.AbstractCoreTest
+import org.junit.jupiter.api.Assertions.*
class EnumsTest : AbstractCoreTest() {
@@ -65,11 +65,11 @@ class EnumsTest : AbstractCoreTest() {
configuration
) {
documentablesCreationStage = {m ->
- assertTrue("Module list cannot be empty", m.isNotEmpty())
+ assertTrue(m.isNotEmpty(), "Module list cannot be empty")
m.first().packages.let { p ->
- assertTrue("Package list cannot be empty", p.isNotEmpty())
+ assertTrue(p.isNotEmpty(), "Package list cannot be empty")
p.first().classlikes.let { c ->
- assertTrue("Classlikes list cannot be empty", c.isNotEmpty())
+ assertTrue(c.isNotEmpty(), "Classlikes list cannot be empty")
val enum = c.first() as DEnum
assertEquals(enum.name, "Test")
@@ -78,12 +78,12 @@ class EnumsTest : AbstractCoreTest() {
}
}
}
- pagesGenerationStage = {
- val map = it.getClasslikeToMemberMap()
+ pagesGenerationStage = { module ->
+ val map = module.getClasslikeToMemberMap()
val test = map.filterKeys { it.name == "Test" }.values.firstOrNull()
- assert(test != null) { "Test not found" }
- assert(test!!.any { it.name == "E1" } && test.any { it.name == "E2" }) { "Enum entries missing in parent" }
- assert(map.keys.any { it.name == "E1" } && map.keys.any { it.name == "E2" }) { "Enum entries missing" }
+ assertNotNull(test, "Test not found")
+ assertTrue(test!!.any { it.name == "E1" } && test.any { it.name == "E2" }) { "Enum entries missing in parent" }
+ assertTrue(map.keys.any { it.name == "E1" } && map.keys.any { it.name == "E2" }) { "Enum entries missing" }
}
}
}
diff --git a/plugins/base/src/test/kotlin/expect/AbstractExpectTest.kt b/plugins/base/src/test/kotlin/expect/AbstractExpectTest.kt
new file mode 100644
index 00000000..ef97b04c
--- /dev/null
+++ b/plugins/base/src/test/kotlin/expect/AbstractExpectTest.kt
@@ -0,0 +1,104 @@
+package expect
+
+import org.jetbrains.dokka.testApi.testRunner.AbstractCoreTest
+import org.junit.jupiter.api.Assertions.assertTrue
+import java.nio.file.Files
+import java.nio.file.Path
+import java.nio.file.Paths
+import java.util.concurrent.TimeUnit
+
+abstract class AbstractExpectTest(
+ val testDir: Path? = Paths.get("src/test", "resources", "expect"),
+ val formats: List<String> = listOf("html")
+) : AbstractCoreTest() {
+
+ protected fun generateOutput(path: Path, outFormat: String): Path? {
+ val config = dokkaConfiguration {
+ format = outFormat
+ passes {
+ pass {
+ sourceRoots = listOf(path.asString())
+ }
+ }
+ }
+
+ var result: Path? = null
+ testFromData(config, cleanupOutput = false) {
+ renderingStage = { _, context -> result = Paths.get(context.configuration.outputDir) }
+ }
+ return result
+ }
+
+ protected fun compareOutput(expected: Path, obtained: Path?, gitTimeout: Long = 500) {
+ obtained?.let { path ->
+ val gitCompare = ProcessBuilder(
+ "git",
+ "--no-pager",
+ "diff",
+ expected.asString(),
+ path.asString()
+ ).also { logger.info("git diff command: ${it.command().joinToString(" ")}") }
+ .also { it.redirectErrorStream() }.start()
+
+ assertTrue(gitCompare.waitFor(gitTimeout, TimeUnit.MILLISECONDS)) { "Git timed out after $gitTimeout" }
+ gitCompare.inputStream.bufferedReader().lines().forEach { logger.info(it) }
+ assertTrue(gitCompare.exitValue() == 0) { "${path.fileName}: outputs don't match" }
+ } ?: throw AssertionError("obtained path is null")
+ }
+
+ protected fun compareOutputWithExcludes(
+ expected: Path,
+ obtained: Path?,
+ excludes: List<String>,
+ timeout: Long = 500
+ ) {
+ obtained?.let { path ->
+ val (res, out, err) = runDiff(expected, obtained, excludes, timeout)
+ assertTrue(res == 0, "Outputs differ:\nstdout - $out\n\nstderr - ${err ?: ""}")
+ } ?: throw AssertionError("obtained path is null")
+ }
+
+ protected fun runDiff(exp: Path, obt: Path, excludes: List<String>, timeout: Long): ProcessResult =
+ ProcessBuilder().command(
+ listOf("diff", "-ru") + excludes.flatMap { listOf("-x", it) } + listOf("--", exp.asString(), obt.asString())
+ ).also {
+ it.redirectErrorStream()
+ }.start().also { assertTrue(it.waitFor(timeout, TimeUnit.MILLISECONDS), "diff timed out") }.let {
+ ProcessResult(it.exitValue(), it.inputStream.bufferResult())
+ }
+
+
+ protected fun testOutput(p: Path, outFormat: String) {
+ val expectOut = p.resolve("out/$outFormat")
+ val testOut = generateOutput(p.resolve("src"), outFormat)
+ .also { logger.info("Test out: ${it?.asString()}") }
+
+ compareOutput(expectOut.toAbsolutePath(), testOut?.toAbsolutePath())
+ testOut?.deleteRecursively()
+ }
+
+ protected fun testOutputWithExcludes(
+ p: Path,
+ outFormat: String,
+ ignores: List<String> = emptyList(),
+ timeout: Long = 500
+ ) {
+ val expected = p.resolve("out/$outFormat")
+ generateOutput(p.resolve("src"), outFormat)
+ ?.let { obtained ->
+ compareOutputWithExcludes(expected, obtained, ignores, timeout)
+
+ obtained.deleteRecursively()
+ } ?: throw AssertionError("Output not generated for ${p.fileName}")
+ }
+
+ protected fun generateExpect(p: Path, outFormat: String) {
+ val out = p.resolve("out/$outFormat/")
+ Files.createDirectories(out)
+
+ val ret = generateOutput(p.resolve("src"), outFormat)
+ Files.list(out).forEach { it.deleteRecursively() }
+ ret?.let { Files.list(it).forEach { f -> f.copyRecursively(out.resolve(f.fileName)) } }
+ }
+
+} \ No newline at end of file
diff --git a/plugins/base/src/test/kotlin/expect/ExpectGenerator.kt b/plugins/base/src/test/kotlin/expect/ExpectGenerator.kt
new file mode 100644
index 00000000..667fc249
--- /dev/null
+++ b/plugins/base/src/test/kotlin/expect/ExpectGenerator.kt
@@ -0,0 +1,15 @@
+package expect
+
+import org.junit.jupiter.api.Disabled
+import org.junit.jupiter.api.Test
+import java.nio.file.Files
+import java.nio.file.Path
+
+class ExpectGenerator : AbstractExpectTest() {
+
+ @Disabled
+ @Test
+ fun generateAll() = testDir?.dirsWithFormats(formats).orEmpty().forEach { (p, f) ->
+ generateExpect(p, f)
+ }
+} \ No newline at end of file
diff --git a/plugins/base/src/test/kotlin/expect/ExpectTest.kt b/plugins/base/src/test/kotlin/expect/ExpectTest.kt
index c6c252ed..0423a5b4 100644
--- a/plugins/base/src/test/kotlin/expect/ExpectTest.kt
+++ b/plugins/base/src/test/kotlin/expect/ExpectTest.kt
@@ -1,62 +1,18 @@
package expect
-import org.junit.Test
-import org.jetbrains.dokka.testApi.testRunner.AbstractCoreTest
-import java.nio.file.Files
-import java.nio.file.Path
-import java.nio.file.Paths
-import java.util.concurrent.TimeUnit
-
-class ExpectTest : AbstractCoreTest() {
-
- private fun generateOutput(path: Path): Path? {
- val config = dokkaConfiguration {
- passes {
- pass {
- sourceRoots = listOf(path.asString())
- }
- }
- }
-
- var result: Path? = null
- testFromData(config, cleanupOutput = false) {
- renderingStage = { _, context -> result = Paths.get(context.configuration.outputDir) }
- }
- return result
- }
-
- private fun compareOutput(expected: Path, obtained: Path?, gitTimeout: Long = 500) {
- obtained?.let { path ->
- val gitCompare = ProcessBuilder(
- "git",
- "--no-pager",
- "diff",
- expected.asString(),
- path.asString()
- ).also { logger.info("git diff command: ${it.command().joinToString(" ")}") }
- .start()
-
- assert(gitCompare.waitFor(gitTimeout, TimeUnit.MILLISECONDS)) { "Git timed out after $gitTimeout" }
- gitCompare.inputStream.bufferedReader().lines().forEach { logger.info(it) }
- gitCompare.errorStream.bufferedReader().lines().forEach { logger.info(it) }
- assert(gitCompare.exitValue() == 0) { "${path.fileName}: outputs don't match" }
- } ?: throw AssertionError("obtained path is null")
+import org.junit.jupiter.api.DynamicTest.dynamicTest
+import org.junit.jupiter.api.TestFactory
+
+class ExpectTest : AbstractExpectTest() {
+ private val ignores: List<String> = listOf(
+ "*.js",
+ "*.css",
+ "*.svg"
+ )
+
+ @TestFactory
+ fun expectTest() = testDir?.dirsWithFormats(formats).orEmpty().map { (p, f) ->
+ dynamicTest("${p.fileName}-$f") { testOutputWithExcludes(p, f, ignores) }
}
- @Test
- fun expectTest() {
- val sources = Paths.get("src/test", "resources", "expect")
-
- Files.list(sources).forEach { p ->
- val expectOut = p.resolve("out")
- val testOut = generateOutput(p.resolve("src"))
- .also { logger.info("Test out: ${it?.asString()}") }
-
- compareOutput(expectOut, testOut)
- testOut?.toFile()?.deleteRecursively()
- }
- }
-
- fun Path.asString() = toAbsolutePath().normalize().toString()
-
} \ No newline at end of file
diff --git a/plugins/base/src/test/kotlin/expect/ExpectUtils.kt b/plugins/base/src/test/kotlin/expect/ExpectUtils.kt
new file mode 100644
index 00000000..4ea46dda
--- /dev/null
+++ b/plugins/base/src/test/kotlin/expect/ExpectUtils.kt
@@ -0,0 +1,28 @@
+package expect
+
+import java.io.InputStream
+import java.nio.file.Files
+import java.nio.file.Path
+import kotlin.streams.toList
+
+data class ProcessResult(val code: Int, val out: String, val err: String? = null)
+
+internal fun Path.dirsWithFormats(formats: List<String>): List<Pair<Path, String>> =
+ Files.list(this).toList().flatMap { p -> formats.map { p to it } }
+
+internal fun Path.asString() = normalize().toString()
+internal fun Path.deleteRecursively() = toFile().deleteRecursively()
+
+internal fun Path.copyRecursively(target: Path) = toFile().copyRecursively(target.toFile())
+
+internal fun Path.listRecursively(filter: (Path) -> Boolean): List<Path> = when {
+ Files.isDirectory(this) -> listOfNotNull(takeIf(filter)) + Files.list(this).toList().flatMap {
+ it.listRecursively(
+ filter
+ )
+ }
+ Files.isRegularFile(this) -> listOfNotNull(this.takeIf(filter))
+ else -> emptyList()
+ }
+
+internal fun InputStream.bufferResult(): String = this.bufferedReader().lines().toList().joinToString("\n") \ No newline at end of file
diff --git a/plugins/base/src/test/kotlin/issues/IssuesTest.kt b/plugins/base/src/test/kotlin/issues/IssuesTest.kt
index 1ad7a97b..41fc2632 100644
--- a/plugins/base/src/test/kotlin/issues/IssuesTest.kt
+++ b/plugins/base/src/test/kotlin/issues/IssuesTest.kt
@@ -2,7 +2,7 @@ package issues
import org.jetbrains.dokka.model.DClass
import org.jetbrains.dokka.model.DFunction
-import org.junit.Test
+import org.junit.jupiter.api.Test
import utils.AbstractModelTest
import utils.name
diff --git a/plugins/base/src/test/kotlin/markdown/KDocTest.kt b/plugins/base/src/test/kotlin/markdown/KDocTest.kt
index fa538c3e..a904f725 100644
--- a/plugins/base/src/test/kotlin/markdown/KDocTest.kt
+++ b/plugins/base/src/test/kotlin/markdown/KDocTest.kt
@@ -3,7 +3,7 @@ package markdown
import org.jetbrains.dokka.model.DPackage
import org.jetbrains.dokka.model.doc.DocumentationNode
import org.jetbrains.dokka.pages.ModulePageNode
-import org.junit.Assert
+import org.junit.jupiter.api.Assertions.*
import org.jetbrains.dokka.testApi.testRunner.AbstractCoreTest
open class KDocTest : AbstractCoreTest() {
@@ -37,7 +37,7 @@ open class KDocTest : AbstractCoreTest() {
configuration
) {
pagesGenerationStage = {
- Assert.assertEquals(
+ assertEquals(
expectedDocumentationNode,
actualDocumentationNode(it)
)
diff --git a/plugins/base/src/test/kotlin/markdown/ParserTest.kt b/plugins/base/src/test/kotlin/markdown/ParserTest.kt
index dee8e907..332c9766 100644
--- a/plugins/base/src/test/kotlin/markdown/ParserTest.kt
+++ b/plugins/base/src/test/kotlin/markdown/ParserTest.kt
@@ -2,13 +2,14 @@ package org.jetbrains.dokka.tests
import markdown.KDocTest
import org.jetbrains.dokka.model.doc.*
-import org.junit.Ignore
-import org.junit.Test
+import org.junit.jupiter.api.Disabled
+import org.junit.jupiter.api.Test
class ParserTest : KDocTest() {
- @Test fun `Simple text`() {
+ @Test
+ fun `Simple text`() {
val kdoc = """
| This is simple test of string
| Next line
@@ -23,7 +24,8 @@ class ParserTest : KDocTest() {
executeTest(kdoc, expectedDocumentationNode)
}
- @Test fun `Simple text with new line`() {
+ @Test
+ fun `Simple text with new line`() {
val kdoc = """
| This is simple test of string\
| Next line
@@ -31,18 +33,21 @@ class ParserTest : KDocTest() {
val expectedDocumentationNode = DocumentationNode(
listOf(
Description(
- P(listOf(
- Text("This is simple test of string"),
- Br,
- Text("Next line")
- ))
+ P(
+ listOf(
+ Text("This is simple test of string"),
+ Br,
+ Text("Next line")
+ )
+ )
)
)
)
executeTest(kdoc, expectedDocumentationNode)
}
- @Test fun `Text with Bold and Emphasis decorators`() {
+ @Test
+ fun `Text with Bold and Emphasis decorators`() {
val kdoc = """
| This is **simple** test of _string_
| Next **_line_**
@@ -66,7 +71,8 @@ class ParserTest : KDocTest() {
executeTest(kdoc, expectedDocumentationNode)
}
- @Test fun `Text with Colon`() {
+ @Test
+ fun `Text with Colon`() {
val kdoc = """
| This is simple text with: colon!
""".trimMargin()
@@ -80,7 +86,8 @@ class ParserTest : KDocTest() {
executeTest(kdoc, expectedDocumentationNode)
}
- @Test fun `Multilined text`() {
+ @Test
+ fun `Multilined text`() {
val kdoc = """
| Text
| and
@@ -96,7 +103,8 @@ class ParserTest : KDocTest() {
executeTest(kdoc, expectedDocumentationNode)
}
- @Test fun `Paragraphs`() {
+ @Test
+ fun `Paragraphs`() {
val kdoc = """
| Paragraph number
| one
@@ -119,7 +127,8 @@ class ParserTest : KDocTest() {
executeTest(kdoc, expectedDocumentationNode)
}
- @Test fun `Emphasis with star`() {
+ @Test
+ fun `Emphasis with star`() {
val kdoc = " *text*"
val expectedDocumentationNode = DocumentationNode(
listOf(
@@ -131,7 +140,8 @@ class ParserTest : KDocTest() {
executeTest(kdoc, expectedDocumentationNode)
}
- @Test fun `Underscores that are not Emphasis`() {
+ @Test
+ fun `Underscores that are not Emphasis`() {
val kdoc = "text_with_underscores"
val expectedDocumentationNode = DocumentationNode(
listOf(
@@ -143,7 +153,8 @@ class ParserTest : KDocTest() {
executeTest(kdoc, expectedDocumentationNode)
}
- @Test fun `Emphasis with underscores`() {
+ @Test
+ fun `Emphasis with underscores`() {
val kdoc = "_text_"
val expectedDocumentationNode = DocumentationNode(
listOf(
@@ -155,7 +166,8 @@ class ParserTest : KDocTest() {
executeTest(kdoc, expectedDocumentationNode)
}
- @Test fun `Embedded star`() {
+ @Test
+ fun `Embedded star`() {
val kdoc = "Embedded*Star"
val expectedDocumentationNode = DocumentationNode(
listOf(
@@ -168,7 +180,8 @@ class ParserTest : KDocTest() {
}
- @Test fun `Unordered list`() {
+ @Test
+ fun `Unordered list`() {
val kdoc = """
| * list item 1
| * list item 2
@@ -188,7 +201,8 @@ class ParserTest : KDocTest() {
executeTest(kdoc, expectedDocumentationNode)
}
- @Test fun `Unordered list with multilines`() {
+ @Test
+ fun `Unordered list with multilines`() {
val kdoc = """
| * list item 1
| continue 1
@@ -210,7 +224,8 @@ class ParserTest : KDocTest() {
executeTest(kdoc, expectedDocumentationNode)
}
- @Test fun `Unordered list with Bold`() {
+ @Test
+ fun `Unordered list with Bold`() {
val kdoc = """
| * list **item** 1
| continue 1
@@ -220,25 +235,40 @@ class ParserTest : KDocTest() {
val expectedDocumentationNode = DocumentationNode(
listOf(
Description(
- Ul(listOf(
- Li(listOf(P(listOf(
- Text("list "),
- B(listOf(Text("item"))),
- Text(" 1 continue 1")
- )))),
- Li(listOf(P(listOf(
- Text("list "),
- B(listOf(Text("item"))),
- Text(" 2 continue 2")
- ))))
- ))
+ Ul(
+ listOf(
+ Li(
+ listOf(
+ P(
+ listOf(
+ Text("list "),
+ B(listOf(Text("item"))),
+ Text(" 1 continue 1")
+ )
+ )
+ )
+ ),
+ Li(
+ listOf(
+ P(
+ listOf(
+ Text("list "),
+ B(listOf(Text("item"))),
+ Text(" 2 continue 2")
+ )
+ )
+ )
+ )
+ )
+ )
)
)
)
executeTest(kdoc, expectedDocumentationNode)
}
- @Test fun `Unordered list with nested bullets`() {
+ @Test
+ fun `Unordered list with nested bullets`() {
val kdoc = """
| * Outer first
| Outer next line
@@ -255,29 +285,38 @@ class ParserTest : KDocTest() {
val expectedDocumentationNode = DocumentationNode(
listOf(
Description(
- P(listOf(
- Ul(listOf(
- Li(listOf(P(listOf(Text("Outer first Outer next line"))))),
- Li(listOf(P(listOf(Text("Outer second"))))),
- Ul(listOf(
- Li(listOf(P(listOf(Text("Middle first Middle next line"))))),
- Li(listOf(P(listOf(Text("Middle second"))))),
- Ul(listOf(
- Li(listOf(P(listOf(Text("Inner first Inner next line")))))
- )),
- Li(listOf(P(listOf(Text("Middle third")))))
- )),
- Li(listOf(P(listOf(Text("Outer third")))))
- )),
- P(listOf(Text("New paragraph")))
- ))
+ P(
+ listOf(
+ Ul(
+ listOf(
+ Li(listOf(P(listOf(Text("Outer first Outer next line"))))),
+ Li(listOf(P(listOf(Text("Outer second"))))),
+ Ul(
+ listOf(
+ Li(listOf(P(listOf(Text("Middle first Middle next line"))))),
+ Li(listOf(P(listOf(Text("Middle second"))))),
+ Ul(
+ listOf(
+ Li(listOf(P(listOf(Text("Inner first Inner next line")))))
+ )
+ ),
+ Li(listOf(P(listOf(Text("Middle third")))))
+ )
+ ),
+ Li(listOf(P(listOf(Text("Outer third")))))
+ )
+ ),
+ P(listOf(Text("New paragraph")))
+ )
+ )
)
)
)
executeTest(kdoc, expectedDocumentationNode)
}
- @Test fun `Ordered list`() {
+ @Test
+ fun `Ordered list`() {
val kdoc = """
| 1. list item 1
| 2. list item 2
@@ -299,7 +338,8 @@ class ParserTest : KDocTest() {
}
- @Test fun `Ordered list beginning from other number`() {
+ @Test
+ fun `Ordered list beginning from other number`() {
val kdoc = """
| 9. list item 1
| 12. list item 2
@@ -320,7 +360,8 @@ class ParserTest : KDocTest() {
executeTest(kdoc, expectedDocumentationNode)
}
- @Test fun `Ordered list with multilines`() {
+ @Test
+ fun `Ordered list with multilines`() {
val kdoc = """
| 2. list item 1
| continue 1
@@ -343,7 +384,8 @@ class ParserTest : KDocTest() {
executeTest(kdoc, expectedDocumentationNode)
}
- @Test fun `Ordered list with Bold`() {
+ @Test
+ fun `Ordered list with Bold`() {
val kdoc = """
| 1. list **item** 1
| continue 1
@@ -353,17 +395,30 @@ class ParserTest : KDocTest() {
val expectedDocumentationNode = DocumentationNode(
listOf(
Description(
- Ol(listOf(
- Li(listOf(P(listOf(
- Text("list "),
- B(listOf(Text("item"))),
- Text(" 1 continue 1")
- )))),
- Li(listOf(P(listOf(
- Text("list "),
- B(listOf(Text("item"))),
- Text(" 2 continue 2")
- ))))
+ Ol(
+ listOf(
+ Li(
+ listOf(
+ P(
+ listOf(
+ Text("list "),
+ B(listOf(Text("item"))),
+ Text(" 1 continue 1")
+ )
+ )
+ )
+ ),
+ Li(
+ listOf(
+ P(
+ listOf(
+ Text("list "),
+ B(listOf(Text("item"))),
+ Text(" 2 continue 2")
+ )
+ )
+ )
+ )
),
mapOf("start" to "1")
)
@@ -373,7 +428,8 @@ class ParserTest : KDocTest() {
executeTest(kdoc, expectedDocumentationNode)
}
- @Test fun `Ordered list with nested bullets`() {
+ @Test
+ fun `Ordered list with nested bullets`() {
val kdoc = """
| 1. Outer first
| Outer next line
@@ -390,35 +446,41 @@ class ParserTest : KDocTest() {
val expectedDocumentationNode = DocumentationNode(
listOf(
Description(
- P(listOf(
- Ol(listOf(
- Li(listOf(P(listOf(Text("Outer first Outer next line"))))),
- Li(listOf(P(listOf(Text("Outer second"))))),
- Ol(listOf(
- Li(listOf(P(listOf(Text("Middle first Middle next line"))))),
- Li(listOf(P(listOf(Text("Middle second"))))),
- Ol(listOf(
- Li(listOf(P(listOf(Text("Inner first Inner next line")))))
+ P(
+ listOf(
+ Ol(
+ listOf(
+ Li(listOf(P(listOf(Text("Outer first Outer next line"))))),
+ Li(listOf(P(listOf(Text("Outer second"))))),
+ Ol(
+ listOf(
+ Li(listOf(P(listOf(Text("Middle first Middle next line"))))),
+ Li(listOf(P(listOf(Text("Middle second"))))),
+ Ol(
+ listOf(
+ Li(listOf(P(listOf(Text("Inner first Inner next line")))))
+ ),
+ mapOf("start" to "1")
+ ),
+ Li(listOf(P(listOf(Text("Middle third")))))
+ ),
+ mapOf("start" to "1")
),
- mapOf("start" to "1")
- ),
- Li(listOf(P(listOf(Text("Middle third")))))
+ Li(listOf(P(listOf(Text("Outer third")))))
),
mapOf("start" to "1")
),
- Li(listOf(P(listOf(Text("Outer third")))))
- ),
- mapOf("start" to "1")
- ),
- P(listOf(Text("New paragraph")))
- ))
+ P(listOf(Text("New paragraph")))
+ )
+ )
)
)
)
executeTest(kdoc, expectedDocumentationNode)
}
- @Test fun `Ordered nested in Unordered nested in Ordered list`() {
+ @Test
+ fun `Ordered nested in Unordered nested in Ordered list`() {
val kdoc = """
| 1. Outer first
| Outer next line
@@ -435,33 +497,40 @@ class ParserTest : KDocTest() {
val expectedDocumentationNode = DocumentationNode(
listOf(
Description(
- P(listOf(
- Ol(listOf(
- Li(listOf(P(listOf(Text("Outer first Outer next line"))))),
- Li(listOf(P(listOf(Text("Outer second"))))),
- Ul(listOf(
- Li(listOf(P(listOf(Text("Middle first Middle next line"))))),
- Li(listOf(P(listOf(Text("Middle second"))))),
- Ol(listOf(
- Li(listOf(P(listOf(Text("Inner first Inner next line")))))
- ),
- mapOf("start" to "1")
+ P(
+ listOf(
+ Ol(
+ listOf(
+ Li(listOf(P(listOf(Text("Outer first Outer next line"))))),
+ Li(listOf(P(listOf(Text("Outer second"))))),
+ Ul(
+ listOf(
+ Li(listOf(P(listOf(Text("Middle first Middle next line"))))),
+ Li(listOf(P(listOf(Text("Middle second"))))),
+ Ol(
+ listOf(
+ Li(listOf(P(listOf(Text("Inner first Inner next line")))))
+ ),
+ mapOf("start" to "1")
+ ),
+ Li(listOf(P(listOf(Text("Middle third")))))
+ )
+ ),
+ Li(listOf(P(listOf(Text("Outer third")))))
),
- Li(listOf(P(listOf(Text("Middle third")))))
- )),
- Li(listOf(P(listOf(Text("Outer third")))))
- ),
- mapOf("start" to "1")
- ),
- P(listOf(Text("New paragraph")))
- ))
+ mapOf("start" to "1")
+ ),
+ P(listOf(Text("New paragraph")))
+ )
+ )
)
)
)
executeTest(kdoc, expectedDocumentationNode)
}
- @Test fun `Header and two paragraphs`() {
+ @Test
+ fun `Header and two paragraphs`() {
val kdoc = """
| # Header 1
| Following text
@@ -471,19 +540,22 @@ class ParserTest : KDocTest() {
val expectedDocumentationNode = DocumentationNode(
listOf(
Description(
- P(listOf(
- H1(listOf(Text("Header 1"))),
- P(listOf(Text("Following text"))),
- P(listOf(Text("New paragraph")))
- ))
+ P(
+ listOf(
+ H1(listOf(Text("Header 1"))),
+ P(listOf(Text("Following text"))),
+ P(listOf(Text("New paragraph")))
+ )
+ )
)
)
)
executeTest(kdoc, expectedDocumentationNode)
}
- @Ignore //TODO: ATX_2 to ATX_6 and sometimes ATX_1 from jetbrains parser consumes white space. Need to handle it in their library
- @Test fun `All headers`() {
+ @Disabled //TODO: ATX_2 to ATX_6 and sometimes ATX_1 from jetbrains parser consumes white space. Need to handle it in their library
+ @Test
+ fun `All headers`() {
val kdoc = """
| # Header 1
| Text 1
@@ -501,27 +573,30 @@ class ParserTest : KDocTest() {
val expectedDocumentationNode = DocumentationNode(
listOf(
Description(
- P(listOf(
- H1(listOf(Text("Header 1"))),
- P(listOf(Text("Text 1"))),
- H2(listOf(Text("Header 2"))),
- P(listOf(Text("Text 2"))),
- H3(listOf(Text("Header 3"))),
- P(listOf(Text("Text 3"))),
- H4(listOf(Text("Header 4"))),
- P(listOf(Text("Text 4"))),
- H5(listOf(Text("Header 5"))),
- P(listOf(Text("Text 5"))),
- H6(listOf(Text("Header 6"))),
- P(listOf(Text("Text 6")))
- ))
+ P(
+ listOf(
+ H1(listOf(Text("Header 1"))),
+ P(listOf(Text("Text 1"))),
+ H2(listOf(Text("Header 2"))),
+ P(listOf(Text("Text 2"))),
+ H3(listOf(Text("Header 3"))),
+ P(listOf(Text("Text 3"))),
+ H4(listOf(Text("Header 4"))),
+ P(listOf(Text("Text 4"))),
+ H5(listOf(Text("Header 5"))),
+ P(listOf(Text("Text 5"))),
+ H6(listOf(Text("Header 6"))),
+ P(listOf(Text("Text 6")))
+ )
+ )
)
)
)
executeTest(kdoc, expectedDocumentationNode)
}
- @Test fun `Bold New Line Bold`() {
+ @Test
+ fun `Bold New Line Bold`() {
val kdoc = """
| **line 1**\
| **line 2**
@@ -529,18 +604,21 @@ class ParserTest : KDocTest() {
val expectedDocumentationNode = DocumentationNode(
listOf(
Description(
- P(listOf(
- B(listOf(Text("line 1"))),
- Br,
- B(listOf(Text("line 2")))
- ))
+ P(
+ listOf(
+ B(listOf(Text("line 1"))),
+ Br,
+ B(listOf(Text("line 2")))
+ )
+ )
)
)
)
executeTest(kdoc, expectedDocumentationNode)
}
- @Test fun `Horizontal rule`() {
+ @Test
+ fun `Horizontal rule`() {
val kdoc = """
| ***
| text 1
@@ -555,24 +633,27 @@ class ParserTest : KDocTest() {
val expectedDocumentationNode = DocumentationNode(
listOf(
Description(
- P(listOf(
- HorizontalRule,
- P(listOf(Text("text 1"))),
- HorizontalRule,
- P(listOf(Text("text 2"))),
- HorizontalRule,
- P(listOf(Text("text 3"))),
- HorizontalRule,
- P(listOf(Text("text 4"))),
- HorizontalRule
- ))
+ P(
+ listOf(
+ HorizontalRule,
+ P(listOf(Text("text 1"))),
+ HorizontalRule,
+ P(listOf(Text("text 2"))),
+ HorizontalRule,
+ P(listOf(Text("text 3"))),
+ HorizontalRule,
+ P(listOf(Text("text 4"))),
+ HorizontalRule
+ )
+ )
)
)
)
executeTest(kdoc, expectedDocumentationNode)
}
- @Test fun `Blockquote`() {
+ @Test
+ fun `Blockquote`() {
val kdoc = """
| > Blockquotes are very handy in email to emulate reply text.
| > This line is part of the same quote.
@@ -584,17 +665,25 @@ class ParserTest : KDocTest() {
val expectedDocumentationNode = DocumentationNode(
listOf(
Description(
- P(listOf(
- BlockQuote(listOf(
- P(listOf(
- Text("Blockquotes are very handy in email to emulate reply text. This line is part of the same quote.")
- ))
- )),
- P(listOf(Text("Quote break."))),
- BlockQuote(listOf(
- P(listOf(Text("Quote")))
- ))
- ))
+ P(
+ listOf(
+ BlockQuote(
+ listOf(
+ P(
+ listOf(
+ Text("Blockquotes are very handy in email to emulate reply text. This line is part of the same quote.")
+ )
+ )
+ )
+ ),
+ P(listOf(Text("Quote break."))),
+ BlockQuote(
+ listOf(
+ P(listOf(Text("Quote")))
+ )
+ )
+ )
+ )
)
)
)
@@ -602,7 +691,8 @@ class ParserTest : KDocTest() {
}
- @Test fun `Blockquote nested`() {
+ @Test
+ fun `Blockquote nested`() {
val kdoc = """
| > text 1
| > text 2
@@ -618,27 +708,36 @@ class ParserTest : KDocTest() {
val expectedDocumentationNode = DocumentationNode(
listOf(
Description(
- P(listOf(
- BlockQuote(listOf(
- P(listOf(Text("text 1 text 2"))),
- BlockQuote(listOf(
- P(listOf(Text("text 3 text 4")))
- )),
- P(listOf(Text("text 5")))
- )),
- P(listOf(Text("Quote break."))),
- BlockQuote(listOf(
- P(listOf(Text("Quote")))
- ))
- ))
+ P(
+ listOf(
+ BlockQuote(
+ listOf(
+ P(listOf(Text("text 1 text 2"))),
+ BlockQuote(
+ listOf(
+ P(listOf(Text("text 3 text 4")))
+ )
+ ),
+ P(listOf(Text("text 5")))
+ )
+ ),
+ P(listOf(Text("Quote break."))),
+ BlockQuote(
+ listOf(
+ P(listOf(Text("Quote")))
+ )
+ )
+ )
+ )
)
)
)
executeTest(kdoc, expectedDocumentationNode)
}
- @Ignore //TODO: Again ATX_1 consumes white space
- @Test fun `Blockquote nested with fancy text enhancement`() {
+ @Disabled //TODO: Again ATX_1 consumes white space
+ @Test
+ fun `Blockquote nested with fancy text enhancement`() {
val kdoc = """
| > text **1**
| > text 2
@@ -655,36 +754,51 @@ class ParserTest : KDocTest() {
val expectedDocumentationNode = DocumentationNode(
listOf(
Description(
- P(listOf(
- BlockQuote(listOf(
- P(listOf(
- Text("text "),
- B(listOf(Text("1"))),
- Text("\ntext 2")
- )),
- BlockQuote(listOf(
- H1(listOf(Text("text 3"))),
- Ul(listOf(
- Li(listOf(P(listOf(Text("text 4"))))),
- Ul(listOf(
- Li(listOf(P(listOf(Text("text 5")))))
- )
- )))
- )),
- P(listOf(Text("text 6")))
- )),
- P(listOf(Text("Quote break."))),
- BlockQuote(listOf(
- P(listOf(Text("Quote")))
- ))
- ))
+ P(
+ listOf(
+ BlockQuote(
+ listOf(
+ P(
+ listOf(
+ Text("text "),
+ B(listOf(Text("1"))),
+ Text("\ntext 2")
+ )
+ ),
+ BlockQuote(
+ listOf(
+ H1(listOf(Text("text 3"))),
+ Ul(
+ listOf(
+ Li(listOf(P(listOf(Text("text 4"))))),
+ Ul(
+ listOf(
+ Li(listOf(P(listOf(Text("text 5")))))
+ )
+ )
+ )
+ )
+ )
+ ),
+ P(listOf(Text("text 6")))
+ )
+ ),
+ P(listOf(Text("Quote break."))),
+ BlockQuote(
+ listOf(
+ P(listOf(Text("Quote")))
+ )
+ )
+ )
+ )
)
)
)
executeTest(kdoc, expectedDocumentationNode)
}
- @Test fun `Simple Code Block`() {
+ @Test
+ fun `Simple Code Block`() {
val kdoc = """
| `Some code`
| Sample text
@@ -692,17 +806,20 @@ class ParserTest : KDocTest() {
val expectedDocumentationNode = DocumentationNode(
listOf(
Description(
- P(listOf(
- Code(listOf(Text("Some code"))),
- Text(" Sample text")
- ))
+ P(
+ listOf(
+ Code(listOf(Text("Some code"))),
+ Text(" Sample text")
+ )
+ )
)
)
)
executeTest(kdoc, expectedDocumentationNode)
}
- @Test fun `Multilined Code Block`() {
+ @Test
+ fun `Multilined Code Block`() {
val kdoc = """
| ```kotlin
| val x: Int = 0
@@ -718,20 +835,22 @@ class ParserTest : KDocTest() {
val expectedDocumentationNode = DocumentationNode(
listOf(
Description(
- P(listOf(
- Code(
- listOf(
- Text("val x: Int = 0"), Br,
- Text("val y: String = \"Text\""), Br, Br,
- Text(" val z: Boolean = true"), Br,
- Text("for(i in 0..10) {"), Br,
- Text(" println(i)"), Br,
- Text("}")
+ P(
+ listOf(
+ Code(
+ listOf(
+ Text("val x: Int = 0"), Br,
+ Text("val y: String = \"Text\""), Br, Br,
+ Text(" val z: Boolean = true"), Br,
+ Text("for(i in 0..10) {"), Br,
+ Text(" println(i)"), Br,
+ Text("}")
+ ),
+ mapOf("lang" to "kotlin")
),
- mapOf("lang" to "kotlin")
- ),
- P(listOf(Text("Sample text")))
- ))
+ P(listOf(Text("Sample text")))
+ )
+ )
)
)
)
@@ -739,41 +858,52 @@ class ParserTest : KDocTest() {
}
- @Test fun `Inline link`() {
+ @Test
+ fun `Inline link`() {
val kdoc = """
| [I'm an inline-style link](https://www.google.com)
""".trimMargin()
val expectedDocumentationNode = DocumentationNode(
listOf(
Description(
- P(listOf(A(
- listOf(Text("I'm an inline-style link")),
- mapOf("href" to "https://www.google.com")
- )))
+ P(
+ listOf(
+ A(
+ listOf(Text("I'm an inline-style link")),
+ mapOf("href" to "https://www.google.com")
+ )
+ )
+ )
)
)
)
executeTest(kdoc, expectedDocumentationNode)
}
- @Test fun `Inline link with title`() {
+ @Test
+ fun `Inline link with title`() {
val kdoc = """
| [I'm an inline-style link with title](https://www.google.com "Google's Homepage")
""".trimMargin()
val expectedDocumentationNode = DocumentationNode(
listOf(
Description(
- P(listOf(A(
- listOf(Text("I'm an inline-style link with title")),
- mapOf("href" to "https://www.google.com", "title" to "Google's Homepage")
- )))
+ P(
+ listOf(
+ A(
+ listOf(Text("I'm an inline-style link with title")),
+ mapOf("href" to "https://www.google.com", "title" to "Google's Homepage")
+ )
+ )
+ )
)
)
)
executeTest(kdoc, expectedDocumentationNode)
}
- @Test fun `Full reference link`() {
+ @Test
+ fun `Full reference link`() {
val kdoc = """
| [I'm a reference-style link][Arbitrary case-insensitive reference text]
|
@@ -782,17 +912,26 @@ class ParserTest : KDocTest() {
val expectedDocumentationNode = DocumentationNode(
listOf(
Description(
- P(listOf(P(listOf(A(
- listOf(Text("I'm a reference-style link")),
- mapOf("href" to "https://www.mozilla.org")
- )))))
+ P(
+ listOf(
+ P(
+ listOf(
+ A(
+ listOf(Text("I'm a reference-style link")),
+ mapOf("href" to "https://www.mozilla.org")
+ )
+ )
+ )
+ )
+ )
)
)
)
executeTest(kdoc, expectedDocumentationNode)
}
- @Test fun `Full reference link with number`() {
+ @Test
+ fun `Full reference link with number`() {
val kdoc = """
| [You can use numbers for reference-style link definitions][1]
|
@@ -801,17 +940,26 @@ class ParserTest : KDocTest() {
val expectedDocumentationNode = DocumentationNode(
listOf(
Description(
- P(listOf(P(listOf(A(
- listOf(Text("You can use numbers for reference-style link definitions")),
- mapOf("href" to "http://slashdot.org")
- )))))
+ P(
+ listOf(
+ P(
+ listOf(
+ A(
+ listOf(Text("You can use numbers for reference-style link definitions")),
+ mapOf("href" to "http://slashdot.org")
+ )
+ )
+ )
+ )
+ )
)
)
)
executeTest(kdoc, expectedDocumentationNode)
}
- @Test fun `Short reference link`() {
+ @Test
+ fun `Short reference link`() {
val kdoc = """
| Or leave it empty and use the [link text itself].
|
@@ -820,21 +968,28 @@ class ParserTest : KDocTest() {
val expectedDocumentationNode = DocumentationNode(
listOf(
Description(
- P(listOf(P(listOf(
- Text("Or leave it empty and use the "),
- A(
- listOf(Text("link text itself")),
- mapOf("href" to "http://www.reddit.com")
- ),
- Text(".")
- ))))
+ P(
+ listOf(
+ P(
+ listOf(
+ Text("Or leave it empty and use the "),
+ A(
+ listOf(Text("link text itself")),
+ mapOf("href" to "http://www.reddit.com")
+ ),
+ Text(".")
+ )
+ )
+ )
+ )
)
)
)
executeTest(kdoc, expectedDocumentationNode)
}
- @Test fun `Autolink`() {
+ @Test
+ fun `Autolink`() {
val kdoc = """
| URLs and URLs in angle brackets will automatically get turned into links.
| http://www.example.com or <http://www.example.com> and sometimes
@@ -843,21 +998,24 @@ class ParserTest : KDocTest() {
val expectedDocumentationNode = DocumentationNode(
listOf(
Description(
- P(listOf(
- Text("URLs and URLs in angle brackets will automatically get turned into links. http://www.example.com or "),
- A(
- listOf(Text("http://www.example.com")),
- mapOf("href" to "http://www.example.com")
- ),
- Text(" and sometimes example.com (but not on Github, for example).")
- ))
+ P(
+ listOf(
+ Text("URLs and URLs in angle brackets will automatically get turned into links. http://www.example.com or "),
+ A(
+ listOf(Text("http://www.example.com")),
+ mapOf("href" to "http://www.example.com")
+ ),
+ Text(" and sometimes example.com (but not on Github, for example).")
+ )
+ )
)
)
)
executeTest(kdoc, expectedDocumentationNode)
}
- @Test fun `Various links`() {
+ @Test
+ fun `Various links`() {
val kdoc = """
| [I'm an inline-style link](https://www.google.com)
|
@@ -882,55 +1040,80 @@ class ParserTest : KDocTest() {
val expectedDocumentationNode = DocumentationNode(
listOf(
Description(
- P(listOf(
- P(listOf(A(
- listOf(Text("I'm an inline-style link")),
- mapOf("href" to "https://www.google.com")
- ))),
- P(listOf(A(
- listOf(Text("I'm an inline-style link with title")),
- mapOf("href" to "https://www.google.com", "title" to "Google's Homepage")
- ))),
- P(listOf(A(
- listOf(Text("I'm a reference-style link")),
- mapOf("href" to "https://www.mozilla.org")
- ))),
- P(listOf(A(
- listOf(Text("You can use numbers for reference-style link definitions")),
- mapOf("href" to "http://slashdot.org")
- ))),
- P(listOf(
- Text("Or leave it empty and use the "),
- A(
- listOf(Text("link text itself")),
- mapOf("href" to "http://www.reddit.com")
+ P(
+ listOf(
+ P(
+ listOf(
+ A(
+ listOf(Text("I'm an inline-style link")),
+ mapOf("href" to "https://www.google.com")
+ )
+ )
),
- Text(".")
- )),
- P(listOf(
- Text("URLs and URLs in angle brackets will automatically get turned into links. http://www.example.com or "),
- A(
- listOf(Text("http://www.example.com")),
- mapOf("href" to "http://www.example.com")
+ P(
+ listOf(
+ A(
+ listOf(Text("I'm an inline-style link with title")),
+ mapOf("href" to "https://www.google.com", "title" to "Google's Homepage")
+ )
+ )
),
- Text(" and sometimes example.com (but not on Github, for example).")
- )),
- P(listOf(Text("Some text to show that the reference links can follow later.")))
- ))
+ P(
+ listOf(
+ A(
+ listOf(Text("I'm a reference-style link")),
+ mapOf("href" to "https://www.mozilla.org")
+ )
+ )
+ ),
+ P(
+ listOf(
+ A(
+ listOf(Text("You can use numbers for reference-style link definitions")),
+ mapOf("href" to "http://slashdot.org")
+ )
+ )
+ ),
+ P(
+ listOf(
+ Text("Or leave it empty and use the "),
+ A(
+ listOf(Text("link text itself")),
+ mapOf("href" to "http://www.reddit.com")
+ ),
+ Text(".")
+ )
+ ),
+ P(
+ listOf(
+ Text("URLs and URLs in angle brackets will automatically get turned into links. http://www.example.com or "),
+ A(
+ listOf(Text("http://www.example.com")),
+ mapOf("href" to "http://www.example.com")
+ ),
+ Text(" and sometimes example.com (but not on Github, for example).")
+ )
+ ),
+ P(listOf(Text("Some text to show that the reference links can follow later.")))
+ )
+ )
)
)
)
executeTest(kdoc, expectedDocumentationNode)
}
- @Test fun `Windows Carriage Return Line Feed`() {
+ @Test
+ fun `Windows Carriage Return Line Feed`() {
val kdoc = "text\r\ntext"
val expectedDocumentationNode = DocumentationNode(
listOf(
Description(
- P(listOf(
- Text("text text")
- ))
+ P(
+ listOf(
+ Text("text text")
+ )
+ )
)
)
)
diff --git a/plugins/base/src/test/kotlin/model/ClassesTest.kt b/plugins/base/src/test/kotlin/model/ClassesTest.kt
index 4855056c..2f83d8c0 100644
--- a/plugins/base/src/test/kotlin/model/ClassesTest.kt
+++ b/plugins/base/src/test/kotlin/model/ClassesTest.kt
@@ -1,9 +1,9 @@
package model
import org.jetbrains.dokka.model.*
-import org.jetbrains.dokka.model.KotlinModifier.*
import org.jetbrains.dokka.model.DFunction
-import org.junit.Test
+import org.jetbrains.dokka.model.KotlinModifier.*
+import org.junit.jupiter.api.Test
import utils.AbstractModelTest
import utils.assertNotNull
import utils.name
@@ -151,7 +151,7 @@ class ClassesTest : AbstractModelTest("/src/main/kotlin/classes/Test.kt", "class
name equals "Klass"
visibility.values allEquals KotlinVisibility.Public
with(extra[AdditionalModifiers.AdditionalKey].assertNotNull("Extras")) {
- content.find{it == ExtraModifiers.DATA}.assertNotNull("data modifier")
+ content.find { it == ExtraModifiers.DATA }.assertNotNull("data modifier")
}
}
}
diff --git a/plugins/base/src/test/kotlin/model/CommentTest.kt b/plugins/base/src/test/kotlin/model/CommentTest.kt
index 055892af..b1faa07f 100644
--- a/plugins/base/src/test/kotlin/model/CommentTest.kt
+++ b/plugins/base/src/test/kotlin/model/CommentTest.kt
@@ -3,7 +3,7 @@ package model
import org.jetbrains.dokka.model.DProperty
import org.jetbrains.dokka.model.doc.CustomWrapperTag
import org.jetbrains.dokka.model.doc.Text
-import org.junit.Test
+import org.junit.jupiter.api.Test
import utils.*
class CommentTest : AbstractModelTest("/src/main/kotlin/comment/Test.kt", "comment") {
diff --git a/plugins/base/src/test/kotlin/model/FunctionsTest.kt b/plugins/base/src/test/kotlin/model/FunctionsTest.kt
index 97d6b237..c8b8f2ba 100644
--- a/plugins/base/src/test/kotlin/model/FunctionsTest.kt
+++ b/plugins/base/src/test/kotlin/model/FunctionsTest.kt
@@ -2,7 +2,7 @@ package model
import org.jetbrains.dokka.model.DFunction
import org.jetbrains.dokka.model.DPackage
-import org.junit.Test
+import org.junit.jupiter.api.Test
import utils.*
class FunctionTest : AbstractModelTest("/src/main/kotlin/function/Test.kt", "function") {
diff --git a/plugins/base/src/test/kotlin/model/InheritorsTest.kt b/plugins/base/src/test/kotlin/model/InheritorsTest.kt
index b3d7bf92..da128803 100644
--- a/plugins/base/src/test/kotlin/model/InheritorsTest.kt
+++ b/plugins/base/src/test/kotlin/model/InheritorsTest.kt
@@ -7,7 +7,7 @@ import org.jetbrains.dokka.base.transformers.documentables.InheritorsInfo
import org.jetbrains.dokka.model.DInterface
import org.jetbrains.dokka.model.DPackage
import org.jetbrains.dokka.plugability.DokkaPlugin
-import org.junit.Test
+import org.junit.jupiter.api.Test
import utils.AbstractModelTest
import utils.assertNotNull
diff --git a/plugins/base/src/test/kotlin/model/JavaTest.kt b/plugins/base/src/test/kotlin/model/JavaTest.kt
index 1e33d6fd..c6d111a4 100644
--- a/plugins/base/src/test/kotlin/model/JavaTest.kt
+++ b/plugins/base/src/test/kotlin/model/JavaTest.kt
@@ -3,8 +3,8 @@ package model
import org.jetbrains.dokka.model.*
import org.jetbrains.dokka.model.DEnum
import org.jetbrains.dokka.model.DFunction
-import org.junit.Assert.assertTrue
-import org.junit.Test
+import org.junit.jupiter.api.Assertions.assertTrue
+import org.junit.jupiter.api.Test
import utils.AbstractModelTest
import utils.assertNotNull
import utils.name
@@ -112,8 +112,8 @@ class JavaTest : AbstractModelTest("/src/main/kotlin/java/Test.java", "java") {
with((this / "java" / "Foo").cast<DClass>()) {
val sups = listOf("Exception", "Cloneable")
assertTrue(
- "Foo must extend ${sups.joinToString(", ")}",
sups.all { s -> supertypes.map.values.flatten().any { it.classNames == s } })
+ "Foo must extend ${sups.joinToString(", ")}"
}
}
}
diff --git a/plugins/base/src/test/kotlin/model/PackagesTest.kt b/plugins/base/src/test/kotlin/model/PackagesTest.kt
index 008ae14d..8885dae0 100644
--- a/plugins/base/src/test/kotlin/model/PackagesTest.kt
+++ b/plugins/base/src/test/kotlin/model/PackagesTest.kt
@@ -1,7 +1,7 @@
package model
import org.jetbrains.dokka.model.DPackage
-import org.junit.Test
+import org.junit.jupiter.api.Test
import utils.AbstractModelTest
class PackagesTest : AbstractModelTest("/src/main/kotlin/packages/Test.kt", "packages") {
diff --git a/plugins/base/src/test/kotlin/model/PropertyTest.kt b/plugins/base/src/test/kotlin/model/PropertyTest.kt
index 4af4ee5a..f391df4e 100644
--- a/plugins/base/src/test/kotlin/model/PropertyTest.kt
+++ b/plugins/base/src/test/kotlin/model/PropertyTest.kt
@@ -3,7 +3,7 @@ package model
import org.jetbrains.dokka.model.KotlinVisibility
import org.jetbrains.dokka.model.DPackage
import org.jetbrains.dokka.model.DProperty
-import org.junit.Test
+import org.junit.jupiter.api.Test
import utils.AbstractModelTest
import utils.assertNotNull
import utils.name
diff --git a/plugins/base/src/test/kotlin/multiplatform/BasicMultiplatformTest.kt b/plugins/base/src/test/kotlin/multiplatform/BasicMultiplatformTest.kt
index e9605c5f..0111e8fb 100644
--- a/plugins/base/src/test/kotlin/multiplatform/BasicMultiplatformTest.kt
+++ b/plugins/base/src/test/kotlin/multiplatform/BasicMultiplatformTest.kt
@@ -1,7 +1,7 @@
package multiplatform
-import org.junit.Assert.assertEquals
-import org.junit.Test
+import org.junit.jupiter.api.Assertions.assertEquals
+import org.junit.jupiter.api.Test
import org.jetbrains.dokka.testApi.testRunner.AbstractCoreTest
class BasicMultiplatformTest : AbstractCoreTest() {
diff --git a/plugins/base/src/test/kotlin/pageMerger/PageNodeMergerTest.kt b/plugins/base/src/test/kotlin/pageMerger/PageNodeMergerTest.kt
index 4b90604e..15dc5581 100644
--- a/plugins/base/src/test/kotlin/pageMerger/PageNodeMergerTest.kt
+++ b/plugins/base/src/test/kotlin/pageMerger/PageNodeMergerTest.kt
@@ -1,13 +1,10 @@
package pageMerger
-import org.jetbrains.dokka.CoreExtensions
import org.jetbrains.dokka.pages.ContentPage
import org.jetbrains.dokka.pages.PageNode
-import org.jetbrains.dokka.plugability.DokkaPlugin
-import org.jetbrains.dokka.base.transformers.pages.merger.SameMethodNamePageMergerStrategy
-import org.jetbrains.dokka.utilities.DokkaLogger
-import org.junit.Ignore
-import org.junit.Test
+import org.junit.jupiter.api.Assertions.assertTrue
+import org.junit.jupiter.api.Disabled
+import org.junit.jupiter.api.Test
import org.jetbrains.dokka.testApi.testRunner.AbstractCoreTest
class PageNodeMergerTest : AbstractCoreTest() {
@@ -70,16 +67,16 @@ class PageNodeMergerTest : AbstractCoreTest() {
val testT = allChildren.filter { it.name == "testT" }
val test = allChildren.filter { it.name == "test" }
- assert(testT.size == 1) { "There can be only one testT page" }
- assert(testT.first().dri.size == 2) { "testT page should have 2 DRI, but has ${testT.first().dri.size}" }
+ assertTrue(testT.size == 1) { "There can be only one testT page" }
+ assertTrue(testT.first().dri.size == 2) { "testT page should have 2 DRI, but has ${testT.first().dri.size}" }
- assert(test.size == 1) { "There can be only one test page" }
- assert(test.first().dri.size == 2) { "test page should have 2 DRI, but has ${test.first().dri.size}" }
+ assertTrue(test.size == 1) { "There can be only one test page" }
+ assertTrue(test.first().dri.size == 2) { "test page should have 2 DRI, but has ${test.first().dri.size}" }
}
}
}
- @Ignore("TODO: reenable when we have infrastructure for turning off extensions")
+ @Disabled("TODO: reenable when we have infrastructure for turning off extensions")
@Test
fun defaultStrategyTest() {
val strList: MutableList<String> = mutableListOf()
diff --git a/plugins/base/src/test/kotlin/renderers/html/GroupWrappingTest.kt b/plugins/base/src/test/kotlin/renderers/html/GroupWrappingTest.kt
index e98b97c0..f39d845a 100644
--- a/plugins/base/src/test/kotlin/renderers/html/GroupWrappingTest.kt
+++ b/plugins/base/src/test/kotlin/renderers/html/GroupWrappingTest.kt
@@ -2,7 +2,7 @@ package renderers.html
import org.jetbrains.dokka.base.renderers.html.HtmlRenderer
import org.jetbrains.dokka.pages.TextStyle
-import org.junit.Test
+import org.junit.jupiter.api.Test
import renderers.RenderingOnlyTestBase
import renderers.TestPage
diff --git a/plugins/base/src/test/kotlin/renderers/html/PlatformDependentHintTest.kt b/plugins/base/src/test/kotlin/renderers/html/PlatformDependentHintTest.kt
index 2fda1ee1..f1d50007 100644
--- a/plugins/base/src/test/kotlin/renderers/html/PlatformDependentHintTest.kt
+++ b/plugins/base/src/test/kotlin/renderers/html/PlatformDependentHintTest.kt
@@ -3,13 +3,12 @@ package renderers.html
import org.jetbrains.dokka.Platform
import org.jetbrains.dokka.base.renderers.html.HtmlRenderer
import org.jetbrains.dokka.pages.PlatformData
-import org.jetbrains.dokka.pages.Style
import org.jetbrains.dokka.pages.TextStyle
-import org.junit.Test
+import org.junit.jupiter.api.Test
import renderers.RenderingOnlyTestBase
import renderers.TestPage
-class PlatformDependentHintTest: RenderingOnlyTestBase() {
+class PlatformDependentHintTest : RenderingOnlyTestBase() {
private val pl1 = PlatformData("pl1", Platform.js, listOf("pl1"))
private val pl2 = PlatformData("pl2", Platform.jvm, listOf("pl2"))
private val pl3 = PlatformData("pl3", Platform.native, listOf("pl3"))
diff --git a/plugins/base/src/test/resources/expect/test/out/-search.html b/plugins/base/src/test/resources/expect/annotatedFunction/out/html/-search.html
index 1ee812bb..1ee812bb 100644
--- a/plugins/base/src/test/resources/expect/test/out/-search.html
+++ b/plugins/base/src/test/resources/expect/annotatedFunction/out/html/-search.html
diff --git a/plugins/base/src/test/resources/expect/annotatedFunction/out/html/navigation.html b/plugins/base/src/test/resources/expect/annotatedFunction/out/html/navigation.html
new file mode 100644
index 00000000..ad2005c3
--- /dev/null
+++ b/plugins/base/src/test/resources/expect/annotatedFunction/out/html/navigation.html
@@ -0,0 +1,10 @@
+<div class="sideMenuPart" id="nav-submenu">
+ <div class="overview"><a href="root/index.html">root</a><span class="navButton" onclick="document.getElementById(&quot;nav-submenu&quot;).classList.toggle(&quot;hidden&quot;);"><span class="navButtonContent"></span></span></div>
+ <div class="sideMenuPart" id="nav-submenu-0">
+ <div class="overview"><a href="root//index.html"></a><span class="navButton" onclick="document.getElementById(&quot;nav-submenu-0&quot;).classList.toggle(&quot;hidden&quot;);"><span class="navButtonContent"></span></span></div>
+ <div class="sideMenuPart" id="nav-submenu-0-0">
+ <div class="overview"><a href="root//f.html">f</a></div>
+ </div>
+ </div>
+</div>
+
diff --git a/plugins/base/src/test/resources/expect/annotatedFunction/out/html/root/f.html b/plugins/base/src/test/resources/expect/annotatedFunction/out/html/root/f.html
new file mode 100644
index 00000000..7900fb98
--- /dev/null
+++ b/plugins/base/src/test/resources/expect/annotatedFunction/out/html/root/f.html
@@ -0,0 +1,20 @@
+<html>
+ <head>
+ <title>f</title>
+ <link href="../../styles/style.css" rel="Stylesheet">
+ <script type="text/javascript" src="../../scripts/navigationLoader.js" async="async"></script>
+ <script>var pathToRoot = "../../";</script>
+ </head>
+ <body>
+ <div id="navigation">
+ <div id="searchBar">
+ <form action="../../-search.html" method="get" id="searchForm"><input type="search" name="query"><input type="submit" value="Search"></form>
+ </div>
+ <div id="sideMenu"></div>
+ </div>
+ <div id="content">//<a href="../index.html">root</a>/<a href="index.html"></a>/<a href="f.html">f</a>
+ <h1>f</h1>
+final fun <a href="f.html">f</a>()</div>
+ </body>
+</html>
+
diff --git a/plugins/base/src/test/resources/expect/annotatedFunction/out/html/root/index.html b/plugins/base/src/test/resources/expect/annotatedFunction/out/html/root/index.html
new file mode 100644
index 00000000..867d7faa
--- /dev/null
+++ b/plugins/base/src/test/resources/expect/annotatedFunction/out/html/root/index.html
@@ -0,0 +1,31 @@
+<html>
+ <head>
+ <title></title>
+ <link href="../../styles/style.css" rel="Stylesheet">
+ <script type="text/javascript" src="../../scripts/navigationLoader.js" async="async"></script>
+ <script>var pathToRoot = "../../";</script>
+ </head>
+ <body>
+ <div id="navigation">
+ <div id="searchBar">
+ <form action="../../-search.html" method="get" id="searchForm"><input type="search" name="query"><input type="submit" value="Search"></form>
+ </div>
+ <div id="sideMenu"></div>
+ </div>
+ <div id="content">//<a href="../index.html">root</a>/<a href="index.html"></a>
+ <h1>Package </h1>
+ <h2>Functions</h2>
+ <table>
+ <thead></thead>
+ <tbody>
+ <tr>
+ <td><a href="f.html">f</a></td>
+ <td>final fun <a href="f.html">f</a>()</td>
+ <td></td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ </body>
+</html>
+
diff --git a/plugins/base/src/test/resources/expect/annotatedFunction/src/annotatedFunction.kt b/plugins/base/src/test/resources/expect/annotatedFunction/src/annotatedFunction.kt
new file mode 100644
index 00000000..f7abbf6c
--- /dev/null
+++ b/plugins/base/src/test/resources/expect/annotatedFunction/src/annotatedFunction.kt
@@ -0,0 +1,2 @@
+@Strictfp fun f() {
+}
diff --git a/plugins/base/src/test/resources/expect/annotatedFunctionWithAnnotationParameters/out/html/-search.html b/plugins/base/src/test/resources/expect/annotatedFunctionWithAnnotationParameters/out/html/-search.html
new file mode 100644
index 00000000..1ee812bb
--- /dev/null
+++ b/plugins/base/src/test/resources/expect/annotatedFunctionWithAnnotationParameters/out/html/-search.html
@@ -0,0 +1,23 @@
+<html>
+ <head>
+ <title>Search</title>
+ <link href="styles/style.css" rel="Stylesheet">
+ <script type="text/javascript" src="scripts/pages.js" async="async"></script>
+ <script>var pathToRoot = "";</script>
+ </head>
+ <body>
+ <div id="navigation">
+ <div id="searchBar">
+ <form action="-search.html" method="get" id="searchForm"><input type="search" name="query"><input type="submit" value="Search"></form>
+ </div>
+ <div id="sideMenu"></div>
+ </div>
+ <div id="content">
+ <h1 id="searchTitle">Search results for </h1>
+ <table>
+ <tbody id="searchTable"></tbody>
+ </table>
+ </div>
+ </body>
+</html>
+
diff --git a/plugins/base/src/test/resources/expect/annotatedFunctionWithAnnotationParameters/out/html/navigation.html b/plugins/base/src/test/resources/expect/annotatedFunctionWithAnnotationParameters/out/html/navigation.html
new file mode 100644
index 00000000..fe9e499e
--- /dev/null
+++ b/plugins/base/src/test/resources/expect/annotatedFunctionWithAnnotationParameters/out/html/navigation.html
@@ -0,0 +1,25 @@
+<div class="sideMenuPart" id="nav-submenu">
+ <div class="overview"><a href="root/index.html">root</a><span class="navButton" onclick="document.getElementById(&quot;nav-submenu&quot;).classList.toggle(&quot;hidden&quot;);"><span class="navButtonContent"></span></span></div>
+ <div class="sideMenuPart" id="nav-submenu-0">
+ <div class="overview"><a href="root//index.html"></a><span class="navButton" onclick="document.getElementById(&quot;nav-submenu-0&quot;).classList.toggle(&quot;hidden&quot;);"><span class="navButtonContent"></span></span></div>
+ <div class="sideMenuPart" id="nav-submenu-0-0">
+ <div class="overview"><a href="root//-fancy/index.html">Fancy</a><span class="navButton" onclick="document.getElementById(&quot;nav-submenu-0-0&quot;).classList.toggle(&quot;hidden&quot;);"><span class="navButtonContent"></span></span></div>
+ <div class="sideMenuPart" id="nav-submenu-0-0-0">
+ <div class="overview"><a href="root//-fancy/-init-.html">&lt;init&gt;</a></div>
+ </div>
+ <div class="sideMenuPart" id="nav-submenu-0-0-1">
+ <div class="overview"><a href="root//-fancy/equals.html">equals</a></div>
+ </div>
+ <div class="sideMenuPart" id="nav-submenu-0-0-2">
+ <div class="overview"><a href="root//-fancy/hash-code.html">hashCode</a></div>
+ </div>
+ <div class="sideMenuPart" id="nav-submenu-0-0-3">
+ <div class="overview"><a href="root//-fancy/to-string.html">toString</a></div>
+ </div>
+ </div>
+ <div class="sideMenuPart" id="nav-submenu-0-1">
+ <div class="overview"><a href="root//f.html">f</a></div>
+ </div>
+ </div>
+</div>
+
diff --git a/plugins/base/src/test/resources/expect/annotatedFunctionWithAnnotationParameters/out/html/root/-fancy/-init-.html b/plugins/base/src/test/resources/expect/annotatedFunctionWithAnnotationParameters/out/html/root/-fancy/-init-.html
new file mode 100644
index 00000000..5ae21e5b
--- /dev/null
+++ b/plugins/base/src/test/resources/expect/annotatedFunctionWithAnnotationParameters/out/html/root/-fancy/-init-.html
@@ -0,0 +1,30 @@
+<html>
+ <head>
+ <title>&lt;init&gt;</title>
+ <link href="../../../styles/style.css" rel="Stylesheet">
+ <script type="text/javascript" src="../../../scripts/navigationLoader.js" async="async"></script>
+ <script>var pathToRoot = "../../../";</script>
+ </head>
+ <body>
+ <div id="navigation">
+ <div id="searchBar">
+ <form action="../../../-search.html" method="get" id="searchForm"><input type="search" name="query"><input type="submit" value="Search"></form>
+ </div>
+ <div id="sideMenu"></div>
+ </div>
+ <div id="content">//<a href="../../index.html">root</a>/<a href="../index.html"></a>/<a href="index.html">Fancy</a>/<a href="-init-.html">&lt;init&gt;</a>
+ <h1>&lt;init&gt;</h1>
+final fun <a href="-init-.html">&lt;init&gt;</a>(<a href="">size</a>: <a href="">Int</a>)
+ <h2>Parameters</h2>
+ <table>
+ <thead></thead>
+ <tbody>
+ <tr>
+ <td>size</td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ </body>
+</html>
+
diff --git a/plugins/base/src/test/resources/expect/annotatedFunctionWithAnnotationParameters/out/html/root/-fancy/equals.html b/plugins/base/src/test/resources/expect/annotatedFunctionWithAnnotationParameters/out/html/root/-fancy/equals.html
new file mode 100644
index 00000000..004f5344
--- /dev/null
+++ b/plugins/base/src/test/resources/expect/annotatedFunctionWithAnnotationParameters/out/html/root/-fancy/equals.html
@@ -0,0 +1,30 @@
+<html>
+ <head>
+ <title>equals</title>
+ <link href="../../../styles/style.css" rel="Stylesheet">
+ <script type="text/javascript" src="../../../scripts/navigationLoader.js" async="async"></script>
+ <script>var pathToRoot = "../../../";</script>
+ </head>
+ <body>
+ <div id="navigation">
+ <div id="searchBar">
+ <form action="../../../-search.html" method="get" id="searchForm"><input type="search" name="query"><input type="submit" value="Search"></form>
+ </div>
+ <div id="sideMenu"></div>
+ </div>
+ <div id="content">//<a href="../../index.html">root</a>/<a href="../index.html"></a>/<a href="index.html">Fancy</a>/<a href="equals.html">equals</a>
+ <h1>equals</h1>
+open fun <a href="equals.html">equals</a>(<a href="">other</a>: <a href="">Any</a>): <a href="">Boolean</a>
+ <h2>Parameters</h2>
+ <table>
+ <thead></thead>
+ <tbody>
+ <tr>
+ <td>other</td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ </body>
+</html>
+
diff --git a/plugins/base/src/test/resources/expect/annotatedFunctionWithAnnotationParameters/out/html/root/-fancy/hash-code.html b/plugins/base/src/test/resources/expect/annotatedFunctionWithAnnotationParameters/out/html/root/-fancy/hash-code.html
new file mode 100644
index 00000000..b395dcda
--- /dev/null
+++ b/plugins/base/src/test/resources/expect/annotatedFunctionWithAnnotationParameters/out/html/root/-fancy/hash-code.html
@@ -0,0 +1,20 @@
+<html>
+ <head>
+ <title>hashCode</title>
+ <link href="../../../styles/style.css" rel="Stylesheet">
+ <script type="text/javascript" src="../../../scripts/navigationLoader.js" async="async"></script>
+ <script>var pathToRoot = "../../../";</script>
+ </head>
+ <body>
+ <div id="navigation">
+ <div id="searchBar">
+ <form action="../../../-search.html" method="get" id="searchForm"><input type="search" name="query"><input type="submit" value="Search"></form>
+ </div>
+ <div id="sideMenu"></div>
+ </div>
+ <div id="content">//<a href="../../index.html">root</a>/<a href="../index.html"></a>/<a href="index.html">Fancy</a>/<a href="hash-code.html">hashCode</a>
+ <h1>hashCode</h1>
+open fun <a href="hash-code.html">hashCode</a>(): <a href="">Int</a></div>
+ </body>
+</html>
+
diff --git a/plugins/base/src/test/resources/expect/annotatedFunctionWithAnnotationParameters/out/html/root/-fancy/index.html b/plugins/base/src/test/resources/expect/annotatedFunctionWithAnnotationParameters/out/html/root/-fancy/index.html
new file mode 100644
index 00000000..3da5f79b
--- /dev/null
+++ b/plugins/base/src/test/resources/expect/annotatedFunctionWithAnnotationParameters/out/html/root/-fancy/index.html
@@ -0,0 +1,61 @@
+<html>
+ <head>
+ <title>Fancy</title>
+ <link href="../../../styles/style.css" rel="Stylesheet">
+ <script type="text/javascript" src="../../../scripts/navigationLoader.js" async="async"></script>
+ <script>var pathToRoot = "../../../";</script>
+ </head>
+ <body>
+ <div id="navigation">
+ <div id="searchBar">
+ <form action="../../../-search.html" method="get" id="searchForm"><input type="search" name="query"><input type="submit" value="Search"></form>
+ </div>
+ <div id="sideMenu"></div>
+ </div>
+ <div id="content">//<a href="../../index.html">root</a>/<a href="../index.html"></a>/<a href="index.html">Fancy</a>Final class Fancy : <a href="">Annotation</a>
+ <h2>Constructors</h2>
+ <table>
+ <thead></thead>
+ <tbody>
+ <tr>
+ <td><a href="-init-.html">&lt;init&gt;</a></td>
+ <td>final fun <a href="-init-.html">&lt;init&gt;</a>(<a href="">size</a>: <a href="">Int</a>)</td>
+ <td></td>
+ </tr>
+ </tbody>
+ </table>
+ <h2>Functions</h2>
+ <table>
+ <thead></thead>
+ <tbody>
+ <tr>
+ <td><a href="equals.html">equals</a></td>
+ <td>open fun <a href="equals.html">equals</a>(<a href="">other</a>: <a href="">Any</a>): <a href="">Boolean</a></td>
+ <td></td>
+ </tr>
+ <tr>
+ <td><a href="hash-code.html">hashCode</a></td>
+ <td>open fun <a href="hash-code.html">hashCode</a>(): <a href="">Int</a></td>
+ <td></td>
+ </tr>
+ <tr>
+ <td><a href="to-string.html">toString</a></td>
+ <td>open fun <a href="to-string.html">toString</a>(): <a href="">String</a></td>
+ <td></td>
+ </tr>
+ </tbody>
+ </table>
+ <h2>Properties</h2>
+ <table>
+ <thead></thead>
+ <tbody>
+ <tr>
+ <td><a href="">size</a></td>
+ <td></td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ </body>
+</html>
+
diff --git a/plugins/base/src/test/resources/expect/annotatedFunctionWithAnnotationParameters/out/html/root/-fancy/to-string.html b/plugins/base/src/test/resources/expect/annotatedFunctionWithAnnotationParameters/out/html/root/-fancy/to-string.html
new file mode 100644
index 00000000..84da7873
--- /dev/null
+++ b/plugins/base/src/test/resources/expect/annotatedFunctionWithAnnotationParameters/out/html/root/-fancy/to-string.html
@@ -0,0 +1,20 @@
+<html>
+ <head>
+ <title>toString</title>
+ <link href="../../../styles/style.css" rel="Stylesheet">
+ <script type="text/javascript" src="../../../scripts/navigationLoader.js" async="async"></script>
+ <script>var pathToRoot = "../../../";</script>
+ </head>
+ <body>
+ <div id="navigation">
+ <div id="searchBar">
+ <form action="../../../-search.html" method="get" id="searchForm"><input type="search" name="query"><input type="submit" value="Search"></form>
+ </div>
+ <div id="sideMenu"></div>
+ </div>
+ <div id="content">//<a href="../../index.html">root</a>/<a href="../index.html"></a>/<a href="index.html">Fancy</a>/<a href="to-string.html">toString</a>
+ <h1>toString</h1>
+open fun <a href="to-string.html">toString</a>(): <a href="">String</a></div>
+ </body>
+</html>
+
diff --git a/plugins/base/src/test/resources/expect/annotatedFunctionWithAnnotationParameters/out/html/root/f.html b/plugins/base/src/test/resources/expect/annotatedFunctionWithAnnotationParameters/out/html/root/f.html
new file mode 100644
index 00000000..7900fb98
--- /dev/null
+++ b/plugins/base/src/test/resources/expect/annotatedFunctionWithAnnotationParameters/out/html/root/f.html
@@ -0,0 +1,20 @@
+<html>
+ <head>
+ <title>f</title>
+ <link href="../../styles/style.css" rel="Stylesheet">
+ <script type="text/javascript" src="../../scripts/navigationLoader.js" async="async"></script>
+ <script>var pathToRoot = "../../";</script>
+ </head>
+ <body>
+ <div id="navigation">
+ <div id="searchBar">
+ <form action="../../-search.html" method="get" id="searchForm"><input type="search" name="query"><input type="submit" value="Search"></form>
+ </div>
+ <div id="sideMenu"></div>
+ </div>
+ <div id="content">//<a href="../index.html">root</a>/<a href="index.html"></a>/<a href="f.html">f</a>
+ <h1>f</h1>
+final fun <a href="f.html">f</a>()</div>
+ </body>
+</html>
+
diff --git a/plugins/base/src/test/resources/expect/annotatedFunctionWithAnnotationParameters/out/html/root/index.html b/plugins/base/src/test/resources/expect/annotatedFunctionWithAnnotationParameters/out/html/root/index.html
new file mode 100644
index 00000000..bba04c93
--- /dev/null
+++ b/plugins/base/src/test/resources/expect/annotatedFunctionWithAnnotationParameters/out/html/root/index.html
@@ -0,0 +1,42 @@
+<html>
+ <head>
+ <title></title>
+ <link href="../../styles/style.css" rel="Stylesheet">
+ <script type="text/javascript" src="../../scripts/navigationLoader.js" async="async"></script>
+ <script>var pathToRoot = "../../";</script>
+ </head>
+ <body>
+ <div id="navigation">
+ <div id="searchBar">
+ <form action="../../-search.html" method="get" id="searchForm"><input type="search" name="query"><input type="submit" value="Search"></form>
+ </div>
+ <div id="sideMenu"></div>
+ </div>
+ <div id="content">//<a href="../index.html">root</a>/<a href="index.html"></a>
+ <h1>Package </h1>
+ <h2>Types</h2>
+ <table>
+ <thead></thead>
+ <tbody>
+ <tr>
+ <td><a href="-fancy/index.html">Fancy</a></td>
+ <td>Final class Fancy : <a href="">Annotation</a></td>
+ <td></td>
+ </tr>
+ </tbody>
+ </table>
+ <h2>Functions</h2>
+ <table>
+ <thead></thead>
+ <tbody>
+ <tr>
+ <td><a href="f.html">f</a></td>
+ <td>final fun <a href="f.html">f</a>()</td>
+ <td></td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ </body>
+</html>
+
diff --git a/plugins/base/src/test/resources/expect/annotatedFunctionWithAnnotationParameters/src/annotatedFunctionWithAnnotationParameters.kt b/plugins/base/src/test/resources/expect/annotatedFunctionWithAnnotationParameters/src/annotatedFunctionWithAnnotationParameters.kt
new file mode 100644
index 00000000..e559713a
--- /dev/null
+++ b/plugins/base/src/test/resources/expect/annotatedFunctionWithAnnotationParameters/src/annotatedFunctionWithAnnotationParameters.kt
@@ -0,0 +1,7 @@
+@Target(AnnotationTarget.VALUE_PARAMETER)
+@Retention(AnnotationRetention.SOURCE)
+@MustBeDocumented
+public annotation class Fancy(val size: Int)
+
+
+@Fancy(1) fun f() {}
diff --git a/plugins/base/src/test/resources/expect/function/out/html/-search.html b/plugins/base/src/test/resources/expect/function/out/html/-search.html
new file mode 100644
index 00000000..1ee812bb
--- /dev/null
+++ b/plugins/base/src/test/resources/expect/function/out/html/-search.html
@@ -0,0 +1,23 @@
+<html>
+ <head>
+ <title>Search</title>
+ <link href="styles/style.css" rel="Stylesheet">
+ <script type="text/javascript" src="scripts/pages.js" async="async"></script>
+ <script>var pathToRoot = "";</script>
+ </head>
+ <body>
+ <div id="navigation">
+ <div id="searchBar">
+ <form action="-search.html" method="get" id="searchForm"><input type="search" name="query"><input type="submit" value="Search"></form>
+ </div>
+ <div id="sideMenu"></div>
+ </div>
+ <div id="content">
+ <h1 id="searchTitle">Search results for </h1>
+ <table>
+ <tbody id="searchTable"></tbody>
+ </table>
+ </div>
+ </body>
+</html>
+
diff --git a/plugins/base/src/test/resources/expect/test/out/navigation.html b/plugins/base/src/test/resources/expect/function/out/html/navigation.html
index ebff817d..ebff817d 100644
--- a/plugins/base/src/test/resources/expect/test/out/navigation.html
+++ b/plugins/base/src/test/resources/expect/function/out/html/navigation.html
diff --git a/plugins/base/src/test/resources/expect/test/out/root/fn.html b/plugins/base/src/test/resources/expect/function/out/html/root/fn.html
index e87d7bc4..e87d7bc4 100644
--- a/plugins/base/src/test/resources/expect/test/out/root/fn.html
+++ b/plugins/base/src/test/resources/expect/function/out/html/root/fn.html
diff --git a/plugins/base/src/test/resources/expect/test/out/root/index.html b/plugins/base/src/test/resources/expect/function/out/html/root/index.html
index 25c65b11..25c65b11 100644
--- a/plugins/base/src/test/resources/expect/test/out/root/index.html
+++ b/plugins/base/src/test/resources/expect/function/out/html/root/index.html
diff --git a/plugins/base/src/test/resources/expect/test/src/function.kt b/plugins/base/src/test/resources/expect/function/src/function.kt
index 3ed81dfa..3ed81dfa 100644
--- a/plugins/base/src/test/resources/expect/test/src/function.kt
+++ b/plugins/base/src/test/resources/expect/function/src/function.kt
diff --git a/plugins/base/src/test/resources/expect/functionWithAnnotatedParam/out/html/-search.html b/plugins/base/src/test/resources/expect/functionWithAnnotatedParam/out/html/-search.html
new file mode 100644
index 00000000..1ee812bb
--- /dev/null
+++ b/plugins/base/src/test/resources/expect/functionWithAnnotatedParam/out/html/-search.html
@@ -0,0 +1,23 @@
+<html>
+ <head>
+ <title>Search</title>
+ <link href="styles/style.css" rel="Stylesheet">
+ <script type="text/javascript" src="scripts/pages.js" async="async"></script>
+ <script>var pathToRoot = "";</script>
+ </head>
+ <body>
+ <div id="navigation">
+ <div id="searchBar">
+ <form action="-search.html" method="get" id="searchForm"><input type="search" name="query"><input type="submit" value="Search"></form>
+ </div>
+ <div id="sideMenu"></div>
+ </div>
+ <div id="content">
+ <h1 id="searchTitle">Search results for </h1>
+ <table>
+ <tbody id="searchTable"></tbody>
+ </table>
+ </div>
+ </body>
+</html>
+
diff --git a/plugins/base/src/test/resources/expect/functionWithAnnotatedParam/out/html/navigation.html b/plugins/base/src/test/resources/expect/functionWithAnnotatedParam/out/html/navigation.html
new file mode 100644
index 00000000..53fb1ca2
--- /dev/null
+++ b/plugins/base/src/test/resources/expect/functionWithAnnotatedParam/out/html/navigation.html
@@ -0,0 +1,25 @@
+<div class="sideMenuPart" id="nav-submenu">
+ <div class="overview"><a href="root/index.html">root</a><span class="navButton" onclick="document.getElementById(&quot;nav-submenu&quot;).classList.toggle(&quot;hidden&quot;);"><span class="navButtonContent"></span></span></div>
+ <div class="sideMenuPart" id="nav-submenu-0">
+ <div class="overview"><a href="root//index.html"></a><span class="navButton" onclick="document.getElementById(&quot;nav-submenu-0&quot;).classList.toggle(&quot;hidden&quot;);"><span class="navButtonContent"></span></span></div>
+ <div class="sideMenuPart" id="nav-submenu-0-0">
+ <div class="overview"><a href="root//-fancy/index.html">Fancy</a><span class="navButton" onclick="document.getElementById(&quot;nav-submenu-0-0&quot;).classList.toggle(&quot;hidden&quot;);"><span class="navButtonContent"></span></span></div>
+ <div class="sideMenuPart" id="nav-submenu-0-0-0">
+ <div class="overview"><a href="root//-fancy/-init-.html">&lt;init&gt;</a></div>
+ </div>
+ <div class="sideMenuPart" id="nav-submenu-0-0-1">
+ <div class="overview"><a href="root//-fancy/equals.html">equals</a></div>
+ </div>
+ <div class="sideMenuPart" id="nav-submenu-0-0-2">
+ <div class="overview"><a href="root//-fancy/hash-code.html">hashCode</a></div>
+ </div>
+ <div class="sideMenuPart" id="nav-submenu-0-0-3">
+ <div class="overview"><a href="root//-fancy/to-string.html">toString</a></div>
+ </div>
+ </div>
+ <div class="sideMenuPart" id="nav-submenu-0-1">
+ <div class="overview"><a href="root//function.html">function</a></div>
+ </div>
+ </div>
+</div>
+
diff --git a/plugins/base/src/test/resources/expect/functionWithAnnotatedParam/out/html/root/-fancy/-init-.html b/plugins/base/src/test/resources/expect/functionWithAnnotatedParam/out/html/root/-fancy/-init-.html
new file mode 100644
index 00000000..acfc127a
--- /dev/null
+++ b/plugins/base/src/test/resources/expect/functionWithAnnotatedParam/out/html/root/-fancy/-init-.html
@@ -0,0 +1,20 @@
+<html>
+ <head>
+ <title>&lt;init&gt;</title>
+ <link href="../../../styles/style.css" rel="Stylesheet">
+ <script type="text/javascript" src="../../../scripts/navigationLoader.js" async="async"></script>
+ <script>var pathToRoot = "../../../";</script>
+ </head>
+ <body>
+ <div id="navigation">
+ <div id="searchBar">
+ <form action="../../../-search.html" method="get" id="searchForm"><input type="search" name="query"><input type="submit" value="Search"></form>
+ </div>
+ <div id="sideMenu"></div>
+ </div>
+ <div id="content">//<a href="../../index.html">root</a>/<a href="../index.html"></a>/<a href="index.html">Fancy</a>/<a href="-init-.html">&lt;init&gt;</a>
+ <h1>&lt;init&gt;</h1>
+final fun <a href="-init-.html">&lt;init&gt;</a>()</div>
+ </body>
+</html>
+
diff --git a/plugins/base/src/test/resources/expect/functionWithAnnotatedParam/out/html/root/-fancy/equals.html b/plugins/base/src/test/resources/expect/functionWithAnnotatedParam/out/html/root/-fancy/equals.html
new file mode 100644
index 00000000..004f5344
--- /dev/null
+++ b/plugins/base/src/test/resources/expect/functionWithAnnotatedParam/out/html/root/-fancy/equals.html
@@ -0,0 +1,30 @@
+<html>
+ <head>
+ <title>equals</title>
+ <link href="../../../styles/style.css" rel="Stylesheet">
+ <script type="text/javascript" src="../../../scripts/navigationLoader.js" async="async"></script>
+ <script>var pathToRoot = "../../../";</script>
+ </head>
+ <body>
+ <div id="navigation">
+ <div id="searchBar">
+ <form action="../../../-search.html" method="get" id="searchForm"><input type="search" name="query"><input type="submit" value="Search"></form>
+ </div>
+ <div id="sideMenu"></div>
+ </div>
+ <div id="content">//<a href="../../index.html">root</a>/<a href="../index.html"></a>/<a href="index.html">Fancy</a>/<a href="equals.html">equals</a>
+ <h1>equals</h1>
+open fun <a href="equals.html">equals</a>(<a href="">other</a>: <a href="">Any</a>): <a href="">Boolean</a>
+ <h2>Parameters</h2>
+ <table>
+ <thead></thead>
+ <tbody>
+ <tr>
+ <td>other</td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ </body>
+</html>
+
diff --git a/plugins/base/src/test/resources/expect/functionWithAnnotatedParam/out/html/root/-fancy/hash-code.html b/plugins/base/src/test/resources/expect/functionWithAnnotatedParam/out/html/root/-fancy/hash-code.html
new file mode 100644
index 00000000..b395dcda
--- /dev/null
+++ b/plugins/base/src/test/resources/expect/functionWithAnnotatedParam/out/html/root/-fancy/hash-code.html
@@ -0,0 +1,20 @@
+<html>
+ <head>
+ <title>hashCode</title>
+ <link href="../../../styles/style.css" rel="Stylesheet">
+ <script type="text/javascript" src="../../../scripts/navigationLoader.js" async="async"></script>
+ <script>var pathToRoot = "../../../";</script>
+ </head>
+ <body>
+ <div id="navigation">
+ <div id="searchBar">
+ <form action="../../../-search.html" method="get" id="searchForm"><input type="search" name="query"><input type="submit" value="Search"></form>
+ </div>
+ <div id="sideMenu"></div>
+ </div>
+ <div id="content">//<a href="../../index.html">root</a>/<a href="../index.html"></a>/<a href="index.html">Fancy</a>/<a href="hash-code.html">hashCode</a>
+ <h1>hashCode</h1>
+open fun <a href="hash-code.html">hashCode</a>(): <a href="">Int</a></div>
+ </body>
+</html>
+
diff --git a/plugins/base/src/test/resources/expect/functionWithAnnotatedParam/out/html/root/-fancy/index.html b/plugins/base/src/test/resources/expect/functionWithAnnotatedParam/out/html/root/-fancy/index.html
new file mode 100644
index 00000000..6a1d3c92
--- /dev/null
+++ b/plugins/base/src/test/resources/expect/functionWithAnnotatedParam/out/html/root/-fancy/index.html
@@ -0,0 +1,51 @@
+<html>
+ <head>
+ <title>Fancy</title>
+ <link href="../../../styles/style.css" rel="Stylesheet">
+ <script type="text/javascript" src="../../../scripts/navigationLoader.js" async="async"></script>
+ <script>var pathToRoot = "../../../";</script>
+ </head>
+ <body>
+ <div id="navigation">
+ <div id="searchBar">
+ <form action="../../../-search.html" method="get" id="searchForm"><input type="search" name="query"><input type="submit" value="Search"></form>
+ </div>
+ <div id="sideMenu"></div>
+ </div>
+ <div id="content">//<a href="../../index.html">root</a>/<a href="../index.html"></a>/<a href="index.html">Fancy</a>Final class Fancy : <a href="">Annotation</a>
+ <h2>Constructors</h2>
+ <table>
+ <thead></thead>
+ <tbody>
+ <tr>
+ <td><a href="-init-.html">&lt;init&gt;</a></td>
+ <td>final fun <a href="-init-.html">&lt;init&gt;</a>()</td>
+ <td></td>
+ </tr>
+ </tbody>
+ </table>
+ <h2>Functions</h2>
+ <table>
+ <thead></thead>
+ <tbody>
+ <tr>
+ <td><a href="equals.html">equals</a></td>
+ <td>open fun <a href="equals.html">equals</a>(<a href="">other</a>: <a href="">Any</a>): <a href="">Boolean</a></td>
+ <td></td>
+ </tr>
+ <tr>
+ <td><a href="hash-code.html">hashCode</a></td>
+ <td>open fun <a href="hash-code.html">hashCode</a>(): <a href="">Int</a></td>
+ <td></td>
+ </tr>
+ <tr>
+ <td><a href="to-string.html">toString</a></td>
+ <td>open fun <a href="to-string.html">toString</a>(): <a href="">String</a></td>
+ <td></td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ </body>
+</html>
+
diff --git a/plugins/base/src/test/resources/expect/functionWithAnnotatedParam/out/html/root/-fancy/to-string.html b/plugins/base/src/test/resources/expect/functionWithAnnotatedParam/out/html/root/-fancy/to-string.html
new file mode 100644
index 00000000..84da7873
--- /dev/null
+++ b/plugins/base/src/test/resources/expect/functionWithAnnotatedParam/out/html/root/-fancy/to-string.html
@@ -0,0 +1,20 @@
+<html>
+ <head>
+ <title>toString</title>
+ <link href="../../../styles/style.css" rel="Stylesheet">
+ <script type="text/javascript" src="../../../scripts/navigationLoader.js" async="async"></script>
+ <script>var pathToRoot = "../../../";</script>
+ </head>
+ <body>
+ <div id="navigation">
+ <div id="searchBar">
+ <form action="../../../-search.html" method="get" id="searchForm"><input type="search" name="query"><input type="submit" value="Search"></form>
+ </div>
+ <div id="sideMenu"></div>
+ </div>
+ <div id="content">//<a href="../../index.html">root</a>/<a href="../index.html"></a>/<a href="index.html">Fancy</a>/<a href="to-string.html">toString</a>
+ <h1>toString</h1>
+open fun <a href="to-string.html">toString</a>(): <a href="">String</a></div>
+ </body>
+</html>
+
diff --git a/plugins/base/src/test/resources/expect/functionWithAnnotatedParam/out/html/root/function.html b/plugins/base/src/test/resources/expect/functionWithAnnotatedParam/out/html/root/function.html
new file mode 100644
index 00000000..2c0eb890
--- /dev/null
+++ b/plugins/base/src/test/resources/expect/functionWithAnnotatedParam/out/html/root/function.html
@@ -0,0 +1,30 @@
+<html>
+ <head>
+ <title>function</title>
+ <link href="../../styles/style.css" rel="Stylesheet">
+ <script type="text/javascript" src="../../scripts/navigationLoader.js" async="async"></script>
+ <script>var pathToRoot = "../../";</script>
+ </head>
+ <body>
+ <div id="navigation">
+ <div id="searchBar">
+ <form action="../../-search.html" method="get" id="searchForm"><input type="search" name="query"><input type="submit" value="Search"></form>
+ </div>
+ <div id="sideMenu"></div>
+ </div>
+ <div id="content">//<a href="../index.html">root</a>/<a href="index.html"></a>/<a href="function.html">function</a>
+ <h1>function</h1>
+final fun <a href="function.html">function</a>(<a href="">notInlined</a>: <a href="">Function0</a>&lt;<a href="">Unit</a>&gt;)
+ <h2>Parameters</h2>
+ <table>
+ <thead></thead>
+ <tbody>
+ <tr>
+ <td>notInlined</td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ </body>
+</html>
+
diff --git a/plugins/base/src/test/resources/expect/functionWithAnnotatedParam/out/html/root/index.html b/plugins/base/src/test/resources/expect/functionWithAnnotatedParam/out/html/root/index.html
new file mode 100644
index 00000000..1797f269
--- /dev/null
+++ b/plugins/base/src/test/resources/expect/functionWithAnnotatedParam/out/html/root/index.html
@@ -0,0 +1,42 @@
+<html>
+ <head>
+ <title></title>
+ <link href="../../styles/style.css" rel="Stylesheet">
+ <script type="text/javascript" src="../../scripts/navigationLoader.js" async="async"></script>
+ <script>var pathToRoot = "../../";</script>
+ </head>
+ <body>
+ <div id="navigation">
+ <div id="searchBar">
+ <form action="../../-search.html" method="get" id="searchForm"><input type="search" name="query"><input type="submit" value="Search"></form>
+ </div>
+ <div id="sideMenu"></div>
+ </div>
+ <div id="content">//<a href="../index.html">root</a>/<a href="index.html"></a>
+ <h1>Package </h1>
+ <h2>Types</h2>
+ <table>
+ <thead></thead>
+ <tbody>
+ <tr>
+ <td><a href="-fancy/index.html">Fancy</a></td>
+ <td>Final class Fancy : <a href="">Annotation</a></td>
+ <td></td>
+ </tr>
+ </tbody>
+ </table>
+ <h2>Functions</h2>
+ <table>
+ <thead></thead>
+ <tbody>
+ <tr>
+ <td><a href="function.html">function</a></td>
+ <td>final fun <a href="function.html">function</a>(<a href="">notInlined</a>: <a href="">Function0</a>&lt;<a href="">Unit</a>&gt;)</td>
+ <td></td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ </body>
+</html>
+
diff --git a/plugins/base/src/test/resources/expect/functionWithAnnotatedParam/src/functionWithAnnotatedParam.kt b/plugins/base/src/test/resources/expect/functionWithAnnotatedParam/src/functionWithAnnotatedParam.kt
new file mode 100644
index 00000000..f858e671
--- /dev/null
+++ b/plugins/base/src/test/resources/expect/functionWithAnnotatedParam/src/functionWithAnnotatedParam.kt
@@ -0,0 +1,7 @@
+@Target(AnnotationTarget.VALUE_PARAMETER)
+@Retention(AnnotationRetention.SOURCE)
+@MustBeDocumented
+public annotation class Fancy
+
+fun function(@Fancy notInlined: () -> Unit) {
+}
diff --git a/plugins/base/src/test/resources/expect/functionWithDefaultParameter/out/html/-search.html b/plugins/base/src/test/resources/expect/functionWithDefaultParameter/out/html/-search.html
new file mode 100644
index 00000000..1ee812bb
--- /dev/null
+++ b/plugins/base/src/test/resources/expect/functionWithDefaultParameter/out/html/-search.html
@@ -0,0 +1,23 @@
+<html>
+ <head>
+ <title>Search</title>
+ <link href="styles/style.css" rel="Stylesheet">
+ <script type="text/javascript" src="scripts/pages.js" async="async"></script>
+ <script>var pathToRoot = "";</script>
+ </head>
+ <body>
+ <div id="navigation">
+ <div id="searchBar">
+ <form action="-search.html" method="get" id="searchForm"><input type="search" name="query"><input type="submit" value="Search"></form>
+ </div>
+ <div id="sideMenu"></div>
+ </div>
+ <div id="content">
+ <h1 id="searchTitle">Search results for </h1>
+ <table>
+ <tbody id="searchTable"></tbody>
+ </table>
+ </div>
+ </body>
+</html>
+
diff --git a/plugins/base/src/test/resources/expect/functionWithDefaultParameter/out/html/navigation.html b/plugins/base/src/test/resources/expect/functionWithDefaultParameter/out/html/navigation.html
new file mode 100644
index 00000000..ad2005c3
--- /dev/null
+++ b/plugins/base/src/test/resources/expect/functionWithDefaultParameter/out/html/navigation.html
@@ -0,0 +1,10 @@
+<div class="sideMenuPart" id="nav-submenu">
+ <div class="overview"><a href="root/index.html">root</a><span class="navButton" onclick="document.getElementById(&quot;nav-submenu&quot;).classList.toggle(&quot;hidden&quot;);"><span class="navButtonContent"></span></span></div>
+ <div class="sideMenuPart" id="nav-submenu-0">
+ <div class="overview"><a href="root//index.html"></a><span class="navButton" onclick="document.getElementById(&quot;nav-submenu-0&quot;).classList.toggle(&quot;hidden&quot;);"><span class="navButtonContent"></span></span></div>
+ <div class="sideMenuPart" id="nav-submenu-0-0">
+ <div class="overview"><a href="root//f.html">f</a></div>
+ </div>
+ </div>
+</div>
+
diff --git a/plugins/base/src/test/resources/expect/functionWithDefaultParameter/out/html/root/f.html b/plugins/base/src/test/resources/expect/functionWithDefaultParameter/out/html/root/f.html
new file mode 100644
index 00000000..448fdf25
--- /dev/null
+++ b/plugins/base/src/test/resources/expect/functionWithDefaultParameter/out/html/root/f.html
@@ -0,0 +1,30 @@
+<html>
+ <head>
+ <title>f</title>
+ <link href="../../styles/style.css" rel="Stylesheet">
+ <script type="text/javascript" src="../../scripts/navigationLoader.js" async="async"></script>
+ <script>var pathToRoot = "../../";</script>
+ </head>
+ <body>
+ <div id="navigation">
+ <div id="searchBar">
+ <form action="../../-search.html" method="get" id="searchForm"><input type="search" name="query"><input type="submit" value="Search"></form>
+ </div>
+ <div id="sideMenu"></div>
+ </div>
+ <div id="content">//<a href="../index.html">root</a>/<a href="index.html"></a>/<a href="f.html">f</a>
+ <h1>f</h1>
+final fun <a href="f.html">f</a>(<a href="">x</a>: <a href="">String</a>)
+ <h2>Parameters</h2>
+ <table>
+ <thead></thead>
+ <tbody>
+ <tr>
+ <td>x</td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ </body>
+</html>
+
diff --git a/plugins/base/src/test/resources/expect/functionWithDefaultParameter/out/html/root/index.html b/plugins/base/src/test/resources/expect/functionWithDefaultParameter/out/html/root/index.html
new file mode 100644
index 00000000..d23b9737
--- /dev/null
+++ b/plugins/base/src/test/resources/expect/functionWithDefaultParameter/out/html/root/index.html
@@ -0,0 +1,31 @@
+<html>
+ <head>
+ <title></title>
+ <link href="../../styles/style.css" rel="Stylesheet">
+ <script type="text/javascript" src="../../scripts/navigationLoader.js" async="async"></script>
+ <script>var pathToRoot = "../../";</script>
+ </head>
+ <body>
+ <div id="navigation">
+ <div id="searchBar">
+ <form action="../../-search.html" method="get" id="searchForm"><input type="search" name="query"><input type="submit" value="Search"></form>
+ </div>
+ <div id="sideMenu"></div>
+ </div>
+ <div id="content">//<a href="../index.html">root</a>/<a href="index.html"></a>
+ <h1>Package </h1>
+ <h2>Functions</h2>
+ <table>
+ <thead></thead>
+ <tbody>
+ <tr>
+ <td><a href="f.html">f</a></td>
+ <td>final fun <a href="f.html">f</a>(<a href="">x</a>: <a href="">String</a>)</td>
+ <td></td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ </body>
+</html>
+
diff --git a/plugins/base/src/test/resources/expect/functionWithDefaultParameter/src/functionWithDefaultParameter.kt b/plugins/base/src/test/resources/expect/functionWithDefaultParameter/src/functionWithDefaultParameter.kt
new file mode 100644
index 00000000..3a3a102f
--- /dev/null
+++ b/plugins/base/src/test/resources/expect/functionWithDefaultParameter/src/functionWithDefaultParameter.kt
@@ -0,0 +1 @@
+fun f(x: String = "") {}
diff --git a/plugins/base/src/test/resources/expect/functionWithNoinlineParam/out/html/-search.html b/plugins/base/src/test/resources/expect/functionWithNoinlineParam/out/html/-search.html
new file mode 100644
index 00000000..1ee812bb
--- /dev/null
+++ b/plugins/base/src/test/resources/expect/functionWithNoinlineParam/out/html/-search.html
@@ -0,0 +1,23 @@
+<html>
+ <head>
+ <title>Search</title>
+ <link href="styles/style.css" rel="Stylesheet">
+ <script type="text/javascript" src="scripts/pages.js" async="async"></script>
+ <script>var pathToRoot = "";</script>
+ </head>
+ <body>
+ <div id="navigation">
+ <div id="searchBar">
+ <form action="-search.html" method="get" id="searchForm"><input type="search" name="query"><input type="submit" value="Search"></form>
+ </div>
+ <div id="sideMenu"></div>
+ </div>
+ <div id="content">
+ <h1 id="searchTitle">Search results for </h1>
+ <table>
+ <tbody id="searchTable"></tbody>
+ </table>
+ </div>
+ </body>
+</html>
+
diff --git a/plugins/base/src/test/resources/expect/functionWithNoinlineParam/out/html/navigation.html b/plugins/base/src/test/resources/expect/functionWithNoinlineParam/out/html/navigation.html
new file mode 100644
index 00000000..659c441f
--- /dev/null
+++ b/plugins/base/src/test/resources/expect/functionWithNoinlineParam/out/html/navigation.html
@@ -0,0 +1,10 @@
+<div class="sideMenuPart" id="nav-submenu">
+ <div class="overview"><a href="root/index.html">root</a><span class="navButton" onclick="document.getElementById(&quot;nav-submenu&quot;).classList.toggle(&quot;hidden&quot;);"><span class="navButtonContent"></span></span></div>
+ <div class="sideMenuPart" id="nav-submenu-0">
+ <div class="overview"><a href="root//index.html"></a><span class="navButton" onclick="document.getElementById(&quot;nav-submenu-0&quot;).classList.toggle(&quot;hidden&quot;);"><span class="navButtonContent"></span></span></div>
+ <div class="sideMenuPart" id="nav-submenu-0-0">
+ <div class="overview"><a href="root//function.html">function</a></div>
+ </div>
+ </div>
+</div>
+
diff --git a/plugins/base/src/test/resources/expect/functionWithNoinlineParam/out/html/root/function.html b/plugins/base/src/test/resources/expect/functionWithNoinlineParam/out/html/root/function.html
new file mode 100644
index 00000000..2c0eb890
--- /dev/null
+++ b/plugins/base/src/test/resources/expect/functionWithNoinlineParam/out/html/root/function.html
@@ -0,0 +1,30 @@
+<html>
+ <head>
+ <title>function</title>
+ <link href="../../styles/style.css" rel="Stylesheet">
+ <script type="text/javascript" src="../../scripts/navigationLoader.js" async="async"></script>
+ <script>var pathToRoot = "../../";</script>
+ </head>
+ <body>
+ <div id="navigation">
+ <div id="searchBar">
+ <form action="../../-search.html" method="get" id="searchForm"><input type="search" name="query"><input type="submit" value="Search"></form>
+ </div>
+ <div id="sideMenu"></div>
+ </div>
+ <div id="content">//<a href="../index.html">root</a>/<a href="index.html"></a>/<a href="function.html">function</a>
+ <h1>function</h1>
+final fun <a href="function.html">function</a>(<a href="">notInlined</a>: <a href="">Function0</a>&lt;<a href="">Unit</a>&gt;)
+ <h2>Parameters</h2>
+ <table>
+ <thead></thead>
+ <tbody>
+ <tr>
+ <td>notInlined</td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ </body>
+</html>
+
diff --git a/plugins/base/src/test/resources/expect/functionWithNoinlineParam/out/html/root/index.html b/plugins/base/src/test/resources/expect/functionWithNoinlineParam/out/html/root/index.html
new file mode 100644
index 00000000..2c53c3e2
--- /dev/null
+++ b/plugins/base/src/test/resources/expect/functionWithNoinlineParam/out/html/root/index.html
@@ -0,0 +1,31 @@
+<html>
+ <head>
+ <title></title>
+ <link href="../../styles/style.css" rel="Stylesheet">
+ <script type="text/javascript" src="../../scripts/navigationLoader.js" async="async"></script>
+ <script>var pathToRoot = "../../";</script>
+ </head>
+ <body>
+ <div id="navigation">
+ <div id="searchBar">
+ <form action="../../-search.html" method="get" id="searchForm"><input type="search" name="query"><input type="submit" value="Search"></form>
+ </div>
+ <div id="sideMenu"></div>
+ </div>
+ <div id="content">//<a href="../index.html">root</a>/<a href="index.html"></a>
+ <h1>Package </h1>
+ <h2>Functions</h2>
+ <table>
+ <thead></thead>
+ <tbody>
+ <tr>
+ <td><a href="function.html">function</a></td>
+ <td>final fun <a href="function.html">function</a>(<a href="">notInlined</a>: <a href="">Function0</a>&lt;<a href="">Unit</a>&gt;)</td>
+ <td></td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ </body>
+</html>
+
diff --git a/plugins/base/src/test/resources/expect/functionWithNoinlineParam/src/functionWithNoinlineParam.kt b/plugins/base/src/test/resources/expect/functionWithNoinlineParam/src/functionWithNoinlineParam.kt
new file mode 100644
index 00000000..640bec83
--- /dev/null
+++ b/plugins/base/src/test/resources/expect/functionWithNoinlineParam/src/functionWithNoinlineParam.kt
@@ -0,0 +1,2 @@
+fun function(noinline notInlined: () -> Unit) {
+}
diff --git a/plugins/base/src/test/resources/expect/functionWithNotDocumentedAnnotation/out/html/-search.html b/plugins/base/src/test/resources/expect/functionWithNotDocumentedAnnotation/out/html/-search.html
new file mode 100644
index 00000000..1ee812bb
--- /dev/null
+++ b/plugins/base/src/test/resources/expect/functionWithNotDocumentedAnnotation/out/html/-search.html
@@ -0,0 +1,23 @@
+<html>
+ <head>
+ <title>Search</title>
+ <link href="styles/style.css" rel="Stylesheet">
+ <script type="text/javascript" src="scripts/pages.js" async="async"></script>
+ <script>var pathToRoot = "";</script>
+ </head>
+ <body>
+ <div id="navigation">
+ <div id="searchBar">
+ <form action="-search.html" method="get" id="searchForm"><input type="search" name="query"><input type="submit" value="Search"></form>
+ </div>
+ <div id="sideMenu"></div>
+ </div>
+ <div id="content">
+ <h1 id="searchTitle">Search results for </h1>
+ <table>
+ <tbody id="searchTable"></tbody>
+ </table>
+ </div>
+ </body>
+</html>
+
diff --git a/plugins/base/src/test/resources/expect/functionWithNotDocumentedAnnotation/out/html/navigation.html b/plugins/base/src/test/resources/expect/functionWithNotDocumentedAnnotation/out/html/navigation.html
new file mode 100644
index 00000000..ad2005c3
--- /dev/null
+++ b/plugins/base/src/test/resources/expect/functionWithNotDocumentedAnnotation/out/html/navigation.html
@@ -0,0 +1,10 @@
+<div class="sideMenuPart" id="nav-submenu">
+ <div class="overview"><a href="root/index.html">root</a><span class="navButton" onclick="document.getElementById(&quot;nav-submenu&quot;).classList.toggle(&quot;hidden&quot;);"><span class="navButtonContent"></span></span></div>
+ <div class="sideMenuPart" id="nav-submenu-0">
+ <div class="overview"><a href="root//index.html"></a><span class="navButton" onclick="document.getElementById(&quot;nav-submenu-0&quot;).classList.toggle(&quot;hidden&quot;);"><span class="navButtonContent"></span></span></div>
+ <div class="sideMenuPart" id="nav-submenu-0-0">
+ <div class="overview"><a href="root//f.html">f</a></div>
+ </div>
+ </div>
+</div>
+
diff --git a/plugins/base/src/test/resources/expect/functionWithNotDocumentedAnnotation/out/html/root/f.html b/plugins/base/src/test/resources/expect/functionWithNotDocumentedAnnotation/out/html/root/f.html
new file mode 100644
index 00000000..7900fb98
--- /dev/null
+++ b/plugins/base/src/test/resources/expect/functionWithNotDocumentedAnnotation/out/html/root/f.html
@@ -0,0 +1,20 @@
+<html>
+ <head>
+ <title>f</title>
+ <link href="../../styles/style.css" rel="Stylesheet">
+ <script type="text/javascript" src="../../scripts/navigationLoader.js" async="async"></script>
+ <script>var pathToRoot = "../../";</script>
+ </head>
+ <body>
+ <div id="navigation">
+ <div id="searchBar">
+ <form action="../../-search.html" method="get" id="searchForm"><input type="search" name="query"><input type="submit" value="Search"></form>
+ </div>
+ <div id="sideMenu"></div>
+ </div>
+ <div id="content">//<a href="../index.html">root</a>/<a href="index.html"></a>/<a href="f.html">f</a>
+ <h1>f</h1>
+final fun <a href="f.html">f</a>()</div>
+ </body>
+</html>
+
diff --git a/plugins/base/src/test/resources/expect/functionWithNotDocumentedAnnotation/out/html/root/index.html b/plugins/base/src/test/resources/expect/functionWithNotDocumentedAnnotation/out/html/root/index.html
new file mode 100644
index 00000000..867d7faa
--- /dev/null
+++ b/plugins/base/src/test/resources/expect/functionWithNotDocumentedAnnotation/out/html/root/index.html
@@ -0,0 +1,31 @@
+<html>
+ <head>
+ <title></title>
+ <link href="../../styles/style.css" rel="Stylesheet">
+ <script type="text/javascript" src="../../scripts/navigationLoader.js" async="async"></script>
+ <script>var pathToRoot = "../../";</script>
+ </head>
+ <body>
+ <div id="navigation">
+ <div id="searchBar">
+ <form action="../../-search.html" method="get" id="searchForm"><input type="search" name="query"><input type="submit" value="Search"></form>
+ </div>
+ <div id="sideMenu"></div>
+ </div>
+ <div id="content">//<a href="../index.html">root</a>/<a href="index.html"></a>
+ <h1>Package </h1>
+ <h2>Functions</h2>
+ <table>
+ <thead></thead>
+ <tbody>
+ <tr>
+ <td><a href="f.html">f</a></td>
+ <td>final fun <a href="f.html">f</a>()</td>
+ <td></td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ </body>
+</html>
+
diff --git a/plugins/base/src/test/resources/expect/functionWithNotDocumentedAnnotation/src/functionWithNotDocumentedAnnotation.kt b/plugins/base/src/test/resources/expect/functionWithNotDocumentedAnnotation/src/functionWithNotDocumentedAnnotation.kt
new file mode 100644
index 00000000..3c7e2ff9
--- /dev/null
+++ b/plugins/base/src/test/resources/expect/functionWithNotDocumentedAnnotation/src/functionWithNotDocumentedAnnotation.kt
@@ -0,0 +1,2 @@
+@Suppress("FOO") fun f() {
+}
diff --git a/plugins/base/src/test/resources/expect/functionWithParams/out/html/-search.html b/plugins/base/src/test/resources/expect/functionWithParams/out/html/-search.html
new file mode 100644
index 00000000..1ee812bb
--- /dev/null
+++ b/plugins/base/src/test/resources/expect/functionWithParams/out/html/-search.html
@@ -0,0 +1,23 @@
+<html>
+ <head>
+ <title>Search</title>
+ <link href="styles/style.css" rel="Stylesheet">
+ <script type="text/javascript" src="scripts/pages.js" async="async"></script>
+ <script>var pathToRoot = "";</script>
+ </head>
+ <body>
+ <div id="navigation">
+ <div id="searchBar">
+ <form action="-search.html" method="get" id="searchForm"><input type="search" name="query"><input type="submit" value="Search"></form>
+ </div>
+ <div id="sideMenu"></div>
+ </div>
+ <div id="content">
+ <h1 id="searchTitle">Search results for </h1>
+ <table>
+ <tbody id="searchTable"></tbody>
+ </table>
+ </div>
+ </body>
+</html>
+
diff --git a/plugins/base/src/test/resources/expect/functionWithParams/out/html/navigation.html b/plugins/base/src/test/resources/expect/functionWithParams/out/html/navigation.html
new file mode 100644
index 00000000..659c441f
--- /dev/null
+++ b/plugins/base/src/test/resources/expect/functionWithParams/out/html/navigation.html
@@ -0,0 +1,10 @@
+<div class="sideMenuPart" id="nav-submenu">
+ <div class="overview"><a href="root/index.html">root</a><span class="navButton" onclick="document.getElementById(&quot;nav-submenu&quot;).classList.toggle(&quot;hidden&quot;);"><span class="navButtonContent"></span></span></div>
+ <div class="sideMenuPart" id="nav-submenu-0">
+ <div class="overview"><a href="root//index.html"></a><span class="navButton" onclick="document.getElementById(&quot;nav-submenu-0&quot;).classList.toggle(&quot;hidden&quot;);"><span class="navButtonContent"></span></span></div>
+ <div class="sideMenuPart" id="nav-submenu-0-0">
+ <div class="overview"><a href="root//function.html">function</a></div>
+ </div>
+ </div>
+</div>
+
diff --git a/plugins/base/src/test/resources/expect/functionWithParams/out/html/root/function.html b/plugins/base/src/test/resources/expect/functionWithParams/out/html/root/function.html
new file mode 100644
index 00000000..0c62a13d
--- /dev/null
+++ b/plugins/base/src/test/resources/expect/functionWithParams/out/html/root/function.html
@@ -0,0 +1,34 @@
+<html>
+ <head>
+ <title>function</title>
+ <link href="../../styles/style.css" rel="Stylesheet">
+ <script type="text/javascript" src="../../scripts/navigationLoader.js" async="async"></script>
+ <script>var pathToRoot = "../../";</script>
+ </head>
+ <body>
+ <div id="navigation">
+ <div id="searchBar">
+ <form action="../../-search.html" method="get" id="searchForm"><input type="search" name="query"><input type="submit" value="Search"></form>
+ </div>
+ <div id="sideMenu"></div>
+ </div>
+ <div id="content">//<a href="../index.html">root</a>/<a href="index.html"></a>/<a href="function.html">function</a>
+ <h1>function</h1>
+final fun <a href="function.html">function</a>(<a href="">x</a>: <a href="">Int</a>)
+ <h3>Description</h3>
+MultilineFunction Documentation
+
+ <h2>Parameters</h2>
+ <table>
+ <thead></thead>
+ <tbody>
+ <tr>
+ <td>x</td>
+ <td>parameter</td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ </body>
+</html>
+
diff --git a/plugins/base/src/test/resources/expect/functionWithParams/out/html/root/index.html b/plugins/base/src/test/resources/expect/functionWithParams/out/html/root/index.html
new file mode 100644
index 00000000..a5fdacb0
--- /dev/null
+++ b/plugins/base/src/test/resources/expect/functionWithParams/out/html/root/index.html
@@ -0,0 +1,31 @@
+<html>
+ <head>
+ <title></title>
+ <link href="../../styles/style.css" rel="Stylesheet">
+ <script type="text/javascript" src="../../scripts/navigationLoader.js" async="async"></script>
+ <script>var pathToRoot = "../../";</script>
+ </head>
+ <body>
+ <div id="navigation">
+ <div id="searchBar">
+ <form action="../../-search.html" method="get" id="searchForm"><input type="search" name="query"><input type="submit" value="Search"></form>
+ </div>
+ <div id="sideMenu"></div>
+ </div>
+ <div id="content">//<a href="../index.html">root</a>/<a href="index.html"></a>
+ <h1>Package </h1>
+ <h2>Functions</h2>
+ <table>
+ <thead></thead>
+ <tbody>
+ <tr>
+ <td><a href="function.html">function</a></td>
+ <td>final fun <a href="function.html">function</a>(<a href="">x</a>: <a href="">Int</a>)</td>
+ <td>Multiline Function Documentation</td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ </body>
+</html>
+
diff --git a/plugins/base/src/test/resources/expect/functionWithParams/src/functionWithParams.kt b/plugins/base/src/test/resources/expect/functionWithParams/src/functionWithParams.kt
new file mode 100644
index 00000000..85c49368
--- /dev/null
+++ b/plugins/base/src/test/resources/expect/functionWithParams/src/functionWithParams.kt
@@ -0,0 +1,8 @@
+/**
+ * Multiline
+ *
+ * Function
+ * Documentation
+ */
+fun function(/** parameter */ x: Int) {
+} \ No newline at end of file
diff --git a/plugins/base/src/test/resources/expect/functionWithReceiver/out/html/-search.html b/plugins/base/src/test/resources/expect/functionWithReceiver/out/html/-search.html
new file mode 100644
index 00000000..1ee812bb
--- /dev/null
+++ b/plugins/base/src/test/resources/expect/functionWithReceiver/out/html/-search.html
@@ -0,0 +1,23 @@
+<html>
+ <head>
+ <title>Search</title>
+ <link href="styles/style.css" rel="Stylesheet">
+ <script type="text/javascript" src="scripts/pages.js" async="async"></script>
+ <script>var pathToRoot = "";</script>
+ </head>
+ <body>
+ <div id="navigation">
+ <div id="searchBar">
+ <form action="-search.html" method="get" id="searchForm"><input type="search" name="query"><input type="submit" value="Search"></form>
+ </div>
+ <div id="sideMenu"></div>
+ </div>
+ <div id="content">
+ <h1 id="searchTitle">Search results for </h1>
+ <table>
+ <tbody id="searchTable"></tbody>
+ </table>
+ </div>
+ </body>
+</html>
+
diff --git a/plugins/base/src/test/resources/expect/functionWithReceiver/out/html/navigation.html b/plugins/base/src/test/resources/expect/functionWithReceiver/out/html/navigation.html
new file mode 100644
index 00000000..ebff817d
--- /dev/null
+++ b/plugins/base/src/test/resources/expect/functionWithReceiver/out/html/navigation.html
@@ -0,0 +1,10 @@
+<div class="sideMenuPart" id="nav-submenu">
+ <div class="overview"><a href="root/index.html">root</a><span class="navButton" onclick="document.getElementById(&quot;nav-submenu&quot;).classList.toggle(&quot;hidden&quot;);"><span class="navButtonContent"></span></span></div>
+ <div class="sideMenuPart" id="nav-submenu-0">
+ <div class="overview"><a href="root//index.html"></a><span class="navButton" onclick="document.getElementById(&quot;nav-submenu-0&quot;).classList.toggle(&quot;hidden&quot;);"><span class="navButtonContent"></span></span></div>
+ <div class="sideMenuPart" id="nav-submenu-0-0">
+ <div class="overview"><a href="root//fn.html">fn</a></div>
+ </div>
+ </div>
+</div>
+
diff --git a/plugins/base/src/test/resources/expect/functionWithReceiver/out/html/root/fn.html b/plugins/base/src/test/resources/expect/functionWithReceiver/out/html/root/fn.html
new file mode 100644
index 00000000..fc3630fc
--- /dev/null
+++ b/plugins/base/src/test/resources/expect/functionWithReceiver/out/html/root/fn.html
@@ -0,0 +1,38 @@
+<html>
+ <head>
+ <title>fn</title>
+ <link href="../../styles/style.css" rel="Stylesheet">
+ <script type="text/javascript" src="../../scripts/navigationLoader.js" async="async"></script>
+ <script>var pathToRoot = "../../";</script>
+ </head>
+ <body>
+ <div id="navigation">
+ <div id="searchBar">
+ <form action="../../-search.html" method="get" id="searchForm"><input type="search" name="query"><input type="submit" value="Search"></form>
+ </div>
+ <div id="sideMenu"></div>
+ </div>
+ <div id="content">//<a href="../index.html">root</a>/<a href="index.html"></a>/<a href="fn.html">fn</a>
+ <h1>fn</h1>
+final fun <a href="">String</a>.<a href="fn.html">fn</a>()
+ <h3>Description</h3>
+Function with receiver
+
+ <h1>fn</h1>
+final fun <a href="">String</a>.<a href="fn.html">fn</a>(<a href="">x</a>: <a href="">Int</a>)
+ <h3>Description</h3>
+Function with receiver
+
+ <h2>Parameters</h2>
+ <table>
+ <thead></thead>
+ <tbody>
+ <tr>
+ <td>x</td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ </body>
+</html>
+
diff --git a/plugins/base/src/test/resources/expect/functionWithReceiver/out/html/root/index.html b/plugins/base/src/test/resources/expect/functionWithReceiver/out/html/root/index.html
new file mode 100644
index 00000000..cd92f78d
--- /dev/null
+++ b/plugins/base/src/test/resources/expect/functionWithReceiver/out/html/root/index.html
@@ -0,0 +1,36 @@
+<html>
+ <head>
+ <title></title>
+ <link href="../../styles/style.css" rel="Stylesheet">
+ <script type="text/javascript" src="../../scripts/navigationLoader.js" async="async"></script>
+ <script>var pathToRoot = "../../";</script>
+ </head>
+ <body>
+ <div id="navigation">
+ <div id="searchBar">
+ <form action="../../-search.html" method="get" id="searchForm"><input type="search" name="query"><input type="submit" value="Search"></form>
+ </div>
+ <div id="sideMenu"></div>
+ </div>
+ <div id="content">//<a href="../index.html">root</a>/<a href="index.html"></a>
+ <h1>Package </h1>
+ <h2>Functions</h2>
+ <table>
+ <thead></thead>
+ <tbody>
+ <tr>
+ <td><a href="fn.html">fn</a></td>
+ <td>final fun <a href="">String</a>.<a href="fn.html">fn</a>()</td>
+ <td>Function with receiver</td>
+ </tr>
+ <tr>
+ <td><a href="fn.html">fn</a></td>
+ <td>final fun <a href="">String</a>.<a href="fn.html">fn</a>(<a href="">x</a>: <a href="">Int</a>)</td>
+ <td>Function with receiver</td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ </body>
+</html>
+
diff --git a/plugins/base/src/test/resources/expect/functionWithReceiver/src/functionWithReceiver.kt b/plugins/base/src/test/resources/expect/functionWithReceiver/src/functionWithReceiver.kt
new file mode 100644
index 00000000..c8473251
--- /dev/null
+++ b/plugins/base/src/test/resources/expect/functionWithReceiver/src/functionWithReceiver.kt
@@ -0,0 +1,11 @@
+/**
+ * Function with receiver
+ */
+fun String.fn() {
+}
+
+/**
+ * Function with receiver
+ */
+fun String.fn(x: Int) {
+}
diff --git a/plugins/base/src/test/resources/expect/genericFunction/out/html/-search.html b/plugins/base/src/test/resources/expect/genericFunction/out/html/-search.html
new file mode 100644
index 00000000..1ee812bb
--- /dev/null
+++ b/plugins/base/src/test/resources/expect/genericFunction/out/html/-search.html
@@ -0,0 +1,23 @@
+<html>
+ <head>
+ <title>Search</title>
+ <link href="styles/style.css" rel="Stylesheet">
+ <script type="text/javascript" src="scripts/pages.js" async="async"></script>
+ <script>var pathToRoot = "";</script>
+ </head>
+ <body>
+ <div id="navigation">
+ <div id="searchBar">
+ <form action="-search.html" method="get" id="searchForm"><input type="search" name="query"><input type="submit" value="Search"></form>
+ </div>
+ <div id="sideMenu"></div>
+ </div>
+ <div id="content">
+ <h1 id="searchTitle">Search results for </h1>
+ <table>
+ <tbody id="searchTable"></tbody>
+ </table>
+ </div>
+ </body>
+</html>
+
diff --git a/plugins/base/src/test/resources/expect/genericFunction/out/html/navigation.html b/plugins/base/src/test/resources/expect/genericFunction/out/html/navigation.html
new file mode 100644
index 00000000..dc7dcf2d
--- /dev/null
+++ b/plugins/base/src/test/resources/expect/genericFunction/out/html/navigation.html
@@ -0,0 +1,10 @@
+<div class="sideMenuPart" id="nav-submenu">
+ <div class="overview"><a href="root/index.html">root</a><span class="navButton" onclick="document.getElementById(&quot;nav-submenu&quot;).classList.toggle(&quot;hidden&quot;);"><span class="navButtonContent"></span></span></div>
+ <div class="sideMenuPart" id="nav-submenu-0">
+ <div class="overview"><a href="root//index.html"></a><span class="navButton" onclick="document.getElementById(&quot;nav-submenu-0&quot;).classList.toggle(&quot;hidden&quot;);"><span class="navButtonContent"></span></span></div>
+ <div class="sideMenuPart" id="nav-submenu-0-0">
+ <div class="overview"><a href="root//generic.html">generic</a></div>
+ </div>
+ </div>
+</div>
+
diff --git a/plugins/base/src/test/resources/expect/genericFunction/out/html/root/generic.html b/plugins/base/src/test/resources/expect/genericFunction/out/html/root/generic.html
new file mode 100644
index 00000000..a8f1dbd1
--- /dev/null
+++ b/plugins/base/src/test/resources/expect/genericFunction/out/html/root/generic.html
@@ -0,0 +1,23 @@
+<html>
+ <head>
+ <title>generic</title>
+ <link href="../../styles/style.css" rel="Stylesheet">
+ <script type="text/javascript" src="../../scripts/navigationLoader.js" async="async"></script>
+ <script>var pathToRoot = "../../";</script>
+ </head>
+ <body>
+ <div id="navigation">
+ <div id="searchBar">
+ <form action="../../-search.html" method="get" id="searchForm"><input type="search" name="query"><input type="submit" value="Search"></form>
+ </div>
+ <div id="sideMenu"></div>
+ </div>
+ <div id="content">//<a href="../index.html">root</a>/<a href="index.html"></a>/<a href="generic.html">generic</a>
+ <h1>generic</h1>
+private final fun <a href="generic.html">generic</a>&lt;<a href="generic.html">generic.T</a> : <a href="">Any</a>&gt;()
+ <h3>Description</h3>
+generic function
+</div>
+ </body>
+</html>
+
diff --git a/plugins/base/src/test/resources/expect/genericFunction/out/html/root/index.html b/plugins/base/src/test/resources/expect/genericFunction/out/html/root/index.html
new file mode 100644
index 00000000..e89383c9
--- /dev/null
+++ b/plugins/base/src/test/resources/expect/genericFunction/out/html/root/index.html
@@ -0,0 +1,31 @@
+<html>
+ <head>
+ <title></title>
+ <link href="../../styles/style.css" rel="Stylesheet">
+ <script type="text/javascript" src="../../scripts/navigationLoader.js" async="async"></script>
+ <script>var pathToRoot = "../../";</script>
+ </head>
+ <body>
+ <div id="navigation">
+ <div id="searchBar">
+ <form action="../../-search.html" method="get" id="searchForm"><input type="search" name="query"><input type="submit" value="Search"></form>
+ </div>
+ <div id="sideMenu"></div>
+ </div>
+ <div id="content">//<a href="../index.html">root</a>/<a href="index.html"></a>
+ <h1>Package </h1>
+ <h2>Functions</h2>
+ <table>
+ <thead></thead>
+ <tbody>
+ <tr>
+ <td><a href="generic.html">generic</a></td>
+ <td>private final fun <a href="generic.html">generic</a>&lt;<a href="generic.html">generic.T</a> : <a href="">Any</a>&gt;()</td>
+ <td>generic function</td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ </body>
+</html>
+
diff --git a/plugins/base/src/test/resources/expect/genericFunction/src/genericFunction.kt b/plugins/base/src/test/resources/expect/genericFunction/src/genericFunction.kt
new file mode 100644
index 00000000..05a65070
--- /dev/null
+++ b/plugins/base/src/test/resources/expect/genericFunction/src/genericFunction.kt
@@ -0,0 +1,5 @@
+
+/**
+ * generic function
+ */
+private fun <T> generic() {} \ No newline at end of file
diff --git a/plugins/base/src/test/resources/expect/genericFunctionWithConstraints/out/html/-search.html b/plugins/base/src/test/resources/expect/genericFunctionWithConstraints/out/html/-search.html
new file mode 100644
index 00000000..1ee812bb
--- /dev/null
+++ b/plugins/base/src/test/resources/expect/genericFunctionWithConstraints/out/html/-search.html
@@ -0,0 +1,23 @@
+<html>
+ <head>
+ <title>Search</title>
+ <link href="styles/style.css" rel="Stylesheet">
+ <script type="text/javascript" src="scripts/pages.js" async="async"></script>
+ <script>var pathToRoot = "";</script>
+ </head>
+ <body>
+ <div id="navigation">
+ <div id="searchBar">
+ <form action="-search.html" method="get" id="searchForm"><input type="search" name="query"><input type="submit" value="Search"></form>
+ </div>
+ <div id="sideMenu"></div>
+ </div>
+ <div id="content">
+ <h1 id="searchTitle">Search results for </h1>
+ <table>
+ <tbody id="searchTable"></tbody>
+ </table>
+ </div>
+ </body>
+</html>
+
diff --git a/plugins/base/src/test/resources/expect/genericFunctionWithConstraints/out/html/navigation.html b/plugins/base/src/test/resources/expect/genericFunctionWithConstraints/out/html/navigation.html
new file mode 100644
index 00000000..dc7dcf2d
--- /dev/null
+++ b/plugins/base/src/test/resources/expect/genericFunctionWithConstraints/out/html/navigation.html
@@ -0,0 +1,10 @@
+<div class="sideMenuPart" id="nav-submenu">
+ <div class="overview"><a href="root/index.html">root</a><span class="navButton" onclick="document.getElementById(&quot;nav-submenu&quot;).classList.toggle(&quot;hidden&quot;);"><span class="navButtonContent"></span></span></div>
+ <div class="sideMenuPart" id="nav-submenu-0">
+ <div class="overview"><a href="root//index.html"></a><span class="navButton" onclick="document.getElementById(&quot;nav-submenu-0&quot;).classList.toggle(&quot;hidden&quot;);"><span class="navButtonContent"></span></span></div>
+ <div class="sideMenuPart" id="nav-submenu-0-0">
+ <div class="overview"><a href="root//generic.html">generic</a></div>
+ </div>
+ </div>
+</div>
+
diff --git a/plugins/base/src/test/resources/expect/genericFunctionWithConstraints/out/html/root/generic.html b/plugins/base/src/test/resources/expect/genericFunctionWithConstraints/out/html/root/generic.html
new file mode 100644
index 00000000..cd1945f8
--- /dev/null
+++ b/plugins/base/src/test/resources/expect/genericFunctionWithConstraints/out/html/root/generic.html
@@ -0,0 +1,23 @@
+<html>
+ <head>
+ <title>generic</title>
+ <link href="../../styles/style.css" rel="Stylesheet">
+ <script type="text/javascript" src="../../scripts/navigationLoader.js" async="async"></script>
+ <script>var pathToRoot = "../../";</script>
+ </head>
+ <body>
+ <div id="navigation">
+ <div id="searchBar">
+ <form action="../../-search.html" method="get" id="searchForm"><input type="search" name="query"><input type="submit" value="Search"></form>
+ </div>
+ <div id="sideMenu"></div>
+ </div>
+ <div id="content">//<a href="../index.html">root</a>/<a href="index.html"></a>/<a href="generic.html">generic</a>
+ <h1>generic</h1>
+final fun <a href="generic.html">generic</a>&lt;<a href="generic.html">generic.T</a> : org.jetbrains.kotlin.protobuf.GeneratedMessageLite$GeneratedExtension@5a8ec9b6, <a href="generic.html">generic.R</a> : <a href="">Any</a>&gt;()
+ <h3>Description</h3>
+generic function
+</div>
+ </body>
+</html>
+
diff --git a/plugins/base/src/test/resources/expect/genericFunctionWithConstraints/out/html/root/index.html b/plugins/base/src/test/resources/expect/genericFunctionWithConstraints/out/html/root/index.html
new file mode 100644
index 00000000..016b01e7
--- /dev/null
+++ b/plugins/base/src/test/resources/expect/genericFunctionWithConstraints/out/html/root/index.html
@@ -0,0 +1,31 @@
+<html>
+ <head>
+ <title></title>
+ <link href="../../styles/style.css" rel="Stylesheet">
+ <script type="text/javascript" src="../../scripts/navigationLoader.js" async="async"></script>
+ <script>var pathToRoot = "../../";</script>
+ </head>
+ <body>
+ <div id="navigation">
+ <div id="searchBar">
+ <form action="../../-search.html" method="get" id="searchForm"><input type="search" name="query"><input type="submit" value="Search"></form>
+ </div>
+ <div id="sideMenu"></div>
+ </div>
+ <div id="content">//<a href="../index.html">root</a>/<a href="index.html"></a>
+ <h1>Package </h1>
+ <h2>Functions</h2>
+ <table>
+ <thead></thead>
+ <tbody>
+ <tr>
+ <td><a href="generic.html">generic</a></td>
+ <td>final fun <a href="generic.html">generic</a>()</td>
+ <td>generic function</td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ </body>
+</html>
+
diff --git a/plugins/base/src/test/resources/expect/genericFunctionWithConstraints/src/genericFunctionWithConstraints.kt b/plugins/base/src/test/resources/expect/genericFunctionWithConstraints/src/genericFunctionWithConstraints.kt
new file mode 100644
index 00000000..5f22f8c5
--- /dev/null
+++ b/plugins/base/src/test/resources/expect/genericFunctionWithConstraints/src/genericFunctionWithConstraints.kt
@@ -0,0 +1,6 @@
+
+/**
+ * generic function
+ */
+public fun <T : R, R> generic() {
+} \ No newline at end of file
diff --git a/plugins/base/src/test/resources/expect/inlineFunction/out/html/-search.html b/plugins/base/src/test/resources/expect/inlineFunction/out/html/-search.html
new file mode 100644
index 00000000..1ee812bb
--- /dev/null
+++ b/plugins/base/src/test/resources/expect/inlineFunction/out/html/-search.html
@@ -0,0 +1,23 @@
+<html>
+ <head>
+ <title>Search</title>
+ <link href="styles/style.css" rel="Stylesheet">
+ <script type="text/javascript" src="scripts/pages.js" async="async"></script>
+ <script>var pathToRoot = "";</script>
+ </head>
+ <body>
+ <div id="navigation">
+ <div id="searchBar">
+ <form action="-search.html" method="get" id="searchForm"><input type="search" name="query"><input type="submit" value="Search"></form>
+ </div>
+ <div id="sideMenu"></div>
+ </div>
+ <div id="content">
+ <h1 id="searchTitle">Search results for </h1>
+ <table>
+ <tbody id="searchTable"></tbody>
+ </table>
+ </div>
+ </body>
+</html>
+
diff --git a/plugins/base/src/test/resources/expect/inlineFunction/out/html/navigation.html b/plugins/base/src/test/resources/expect/inlineFunction/out/html/navigation.html
new file mode 100644
index 00000000..ad2005c3
--- /dev/null
+++ b/plugins/base/src/test/resources/expect/inlineFunction/out/html/navigation.html
@@ -0,0 +1,10 @@
+<div class="sideMenuPart" id="nav-submenu">
+ <div class="overview"><a href="root/index.html">root</a><span class="navButton" onclick="document.getElementById(&quot;nav-submenu&quot;).classList.toggle(&quot;hidden&quot;);"><span class="navButtonContent"></span></span></div>
+ <div class="sideMenuPart" id="nav-submenu-0">
+ <div class="overview"><a href="root//index.html"></a><span class="navButton" onclick="document.getElementById(&quot;nav-submenu-0&quot;).classList.toggle(&quot;hidden&quot;);"><span class="navButtonContent"></span></span></div>
+ <div class="sideMenuPart" id="nav-submenu-0-0">
+ <div class="overview"><a href="root//f.html">f</a></div>
+ </div>
+ </div>
+</div>
+
diff --git a/plugins/base/src/test/resources/expect/inlineFunction/out/html/root/f.html b/plugins/base/src/test/resources/expect/inlineFunction/out/html/root/f.html
new file mode 100644
index 00000000..0661e211
--- /dev/null
+++ b/plugins/base/src/test/resources/expect/inlineFunction/out/html/root/f.html
@@ -0,0 +1,30 @@
+<html>
+ <head>
+ <title>f</title>
+ <link href="../../styles/style.css" rel="Stylesheet">
+ <script type="text/javascript" src="../../scripts/navigationLoader.js" async="async"></script>
+ <script>var pathToRoot = "../../";</script>
+ </head>
+ <body>
+ <div id="navigation">
+ <div id="searchBar">
+ <form action="../../-search.html" method="get" id="searchForm"><input type="search" name="query"><input type="submit" value="Search"></form>
+ </div>
+ <div id="sideMenu"></div>
+ </div>
+ <div id="content">//<a href="../index.html">root</a>/<a href="index.html"></a>/<a href="f.html">f</a>
+ <h1>f</h1>
+final fun <a href="f.html">f</a>(<a href="">a</a>: <a href="">Function0</a>&lt;<a href="">String</a>&gt;)
+ <h2>Parameters</h2>
+ <table>
+ <thead></thead>
+ <tbody>
+ <tr>
+ <td>a</td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ </body>
+</html>
+
diff --git a/plugins/base/src/test/resources/expect/inlineFunction/out/html/root/index.html b/plugins/base/src/test/resources/expect/inlineFunction/out/html/root/index.html
new file mode 100644
index 00000000..a5dd2a5d
--- /dev/null
+++ b/plugins/base/src/test/resources/expect/inlineFunction/out/html/root/index.html
@@ -0,0 +1,31 @@
+<html>
+ <head>
+ <title></title>
+ <link href="../../styles/style.css" rel="Stylesheet">
+ <script type="text/javascript" src="../../scripts/navigationLoader.js" async="async"></script>
+ <script>var pathToRoot = "../../";</script>
+ </head>
+ <body>
+ <div id="navigation">
+ <div id="searchBar">
+ <form action="../../-search.html" method="get" id="searchForm"><input type="search" name="query"><input type="submit" value="Search"></form>
+ </div>
+ <div id="sideMenu"></div>
+ </div>
+ <div id="content">//<a href="../index.html">root</a>/<a href="index.html"></a>
+ <h1>Package </h1>
+ <h2>Functions</h2>
+ <table>
+ <thead></thead>
+ <tbody>
+ <tr>
+ <td><a href="f.html">f</a></td>
+ <td>final fun <a href="f.html">f</a>(<a href="">a</a>: <a href="">Function0</a>&lt;<a href="">String</a>&gt;)</td>
+ <td></td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ </body>
+</html>
+
diff --git a/plugins/base/src/test/resources/expect/inlineFunction/src/inlineFunction.kt b/plugins/base/src/test/resources/expect/inlineFunction/src/inlineFunction.kt
new file mode 100644
index 00000000..64a617a4
--- /dev/null
+++ b/plugins/base/src/test/resources/expect/inlineFunction/src/inlineFunction.kt
@@ -0,0 +1,2 @@
+inline fun f(a: () -> String) {
+}
diff --git a/plugins/base/src/test/resources/expect/inlineSuspendFunction/out/html/-search.html b/plugins/base/src/test/resources/expect/inlineSuspendFunction/out/html/-search.html
new file mode 100644
index 00000000..1ee812bb
--- /dev/null
+++ b/plugins/base/src/test/resources/expect/inlineSuspendFunction/out/html/-search.html
@@ -0,0 +1,23 @@
+<html>
+ <head>
+ <title>Search</title>
+ <link href="styles/style.css" rel="Stylesheet">
+ <script type="text/javascript" src="scripts/pages.js" async="async"></script>
+ <script>var pathToRoot = "";</script>
+ </head>
+ <body>
+ <div id="navigation">
+ <div id="searchBar">
+ <form action="-search.html" method="get" id="searchForm"><input type="search" name="query"><input type="submit" value="Search"></form>
+ </div>
+ <div id="sideMenu"></div>
+ </div>
+ <div id="content">
+ <h1 id="searchTitle">Search results for </h1>
+ <table>
+ <tbody id="searchTable"></tbody>
+ </table>
+ </div>
+ </body>
+</html>
+
diff --git a/plugins/base/src/test/resources/expect/inlineSuspendFunction/out/html/navigation.html b/plugins/base/src/test/resources/expect/inlineSuspendFunction/out/html/navigation.html
new file mode 100644
index 00000000..ad2005c3
--- /dev/null
+++ b/plugins/base/src/test/resources/expect/inlineSuspendFunction/out/html/navigation.html
@@ -0,0 +1,10 @@
+<div class="sideMenuPart" id="nav-submenu">
+ <div class="overview"><a href="root/index.html">root</a><span class="navButton" onclick="document.getElementById(&quot;nav-submenu&quot;).classList.toggle(&quot;hidden&quot;);"><span class="navButtonContent"></span></span></div>
+ <div class="sideMenuPart" id="nav-submenu-0">
+ <div class="overview"><a href="root//index.html"></a><span class="navButton" onclick="document.getElementById(&quot;nav-submenu-0&quot;).classList.toggle(&quot;hidden&quot;);"><span class="navButtonContent"></span></span></div>
+ <div class="sideMenuPart" id="nav-submenu-0-0">
+ <div class="overview"><a href="root//f.html">f</a></div>
+ </div>
+ </div>
+</div>
+
diff --git a/plugins/base/src/test/resources/expect/inlineSuspendFunction/out/html/root/f.html b/plugins/base/src/test/resources/expect/inlineSuspendFunction/out/html/root/f.html
new file mode 100644
index 00000000..0661e211
--- /dev/null
+++ b/plugins/base/src/test/resources/expect/inlineSuspendFunction/out/html/root/f.html
@@ -0,0 +1,30 @@
+<html>
+ <head>
+ <title>f</title>
+ <link href="../../styles/style.css" rel="Stylesheet">
+ <script type="text/javascript" src="../../scripts/navigationLoader.js" async="async"></script>
+ <script>var pathToRoot = "../../";</script>
+ </head>
+ <body>
+ <div id="navigation">
+ <div id="searchBar">
+ <form action="../../-search.html" method="get" id="searchForm"><input type="search" name="query"><input type="submit" value="Search"></form>
+ </div>
+ <div id="sideMenu"></div>
+ </div>
+ <div id="content">//<a href="../index.html">root</a>/<a href="index.html"></a>/<a href="f.html">f</a>
+ <h1>f</h1>
+final fun <a href="f.html">f</a>(<a href="">a</a>: <a href="">Function0</a>&lt;<a href="">String</a>&gt;)
+ <h2>Parameters</h2>
+ <table>
+ <thead></thead>
+ <tbody>
+ <tr>
+ <td>a</td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ </body>
+</html>
+
diff --git a/plugins/base/src/test/resources/expect/inlineSuspendFunction/out/html/root/index.html b/plugins/base/src/test/resources/expect/inlineSuspendFunction/out/html/root/index.html
new file mode 100644
index 00000000..a5dd2a5d
--- /dev/null
+++ b/plugins/base/src/test/resources/expect/inlineSuspendFunction/out/html/root/index.html
@@ -0,0 +1,31 @@
+<html>
+ <head>
+ <title></title>
+ <link href="../../styles/style.css" rel="Stylesheet">
+ <script type="text/javascript" src="../../scripts/navigationLoader.js" async="async"></script>
+ <script>var pathToRoot = "../../";</script>
+ </head>
+ <body>
+ <div id="navigation">
+ <div id="searchBar">
+ <form action="../../-search.html" method="get" id="searchForm"><input type="search" name="query"><input type="submit" value="Search"></form>
+ </div>
+ <div id="sideMenu"></div>
+ </div>
+ <div id="content">//<a href="../index.html">root</a>/<a href="index.html"></a>
+ <h1>Package </h1>
+ <h2>Functions</h2>
+ <table>
+ <thead></thead>
+ <tbody>
+ <tr>
+ <td><a href="f.html">f</a></td>
+ <td>final fun <a href="f.html">f</a>(<a href="">a</a>: <a href="">Function0</a>&lt;<a href="">String</a>&gt;)</td>
+ <td></td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ </body>
+</html>
+
diff --git a/plugins/base/src/test/resources/expect/inlineSuspendFunction/src/inlineSuspendFunction.kt b/plugins/base/src/test/resources/expect/inlineSuspendFunction/src/inlineSuspendFunction.kt
new file mode 100644
index 00000000..5f376267
--- /dev/null
+++ b/plugins/base/src/test/resources/expect/inlineSuspendFunction/src/inlineSuspendFunction.kt
@@ -0,0 +1,2 @@
+inline suspend fun f(a: () -> String) {
+}
diff --git a/plugins/base/src/test/resources/expect/sinceKotlin/out/html/-search.html b/plugins/base/src/test/resources/expect/sinceKotlin/out/html/-search.html
new file mode 100644
index 00000000..1ee812bb
--- /dev/null
+++ b/plugins/base/src/test/resources/expect/sinceKotlin/out/html/-search.html
@@ -0,0 +1,23 @@
+<html>
+ <head>
+ <title>Search</title>
+ <link href="styles/style.css" rel="Stylesheet">
+ <script type="text/javascript" src="scripts/pages.js" async="async"></script>
+ <script>var pathToRoot = "";</script>
+ </head>
+ <body>
+ <div id="navigation">
+ <div id="searchBar">
+ <form action="-search.html" method="get" id="searchForm"><input type="search" name="query"><input type="submit" value="Search"></form>
+ </div>
+ <div id="sideMenu"></div>
+ </div>
+ <div id="content">
+ <h1 id="searchTitle">Search results for </h1>
+ <table>
+ <tbody id="searchTable"></tbody>
+ </table>
+ </div>
+ </body>
+</html>
+
diff --git a/plugins/base/src/test/resources/expect/sinceKotlin/out/html/navigation.html b/plugins/base/src/test/resources/expect/sinceKotlin/out/html/navigation.html
new file mode 100644
index 00000000..5f182c80
--- /dev/null
+++ b/plugins/base/src/test/resources/expect/sinceKotlin/out/html/navigation.html
@@ -0,0 +1,10 @@
+<div class="sideMenuPart" id="nav-submenu">
+ <div class="overview"><a href="root/index.html">root</a><span class="navButton" onclick="document.getElementById(&quot;nav-submenu&quot;).classList.toggle(&quot;hidden&quot;);"><span class="navButtonContent"></span></span></div>
+ <div class="sideMenuPart" id="nav-submenu-0">
+ <div class="overview"><a href="root//index.html"></a><span class="navButton" onclick="document.getElementById(&quot;nav-submenu-0&quot;).classList.toggle(&quot;hidden&quot;);"><span class="navButtonContent"></span></span></div>
+ <div class="sideMenuPart" id="nav-submenu-0-0">
+ <div class="overview"><a href="root//available-since1.1.html">availableSince1.1</a></div>
+ </div>
+ </div>
+</div>
+
diff --git a/plugins/base/src/test/resources/expect/sinceKotlin/out/html/root/available-since1.1.html b/plugins/base/src/test/resources/expect/sinceKotlin/out/html/root/available-since1.1.html
new file mode 100644
index 00000000..42aa89c4
--- /dev/null
+++ b/plugins/base/src/test/resources/expect/sinceKotlin/out/html/root/available-since1.1.html
@@ -0,0 +1,23 @@
+<html>
+ <head>
+ <title>availableSince1.1</title>
+ <link href="../../styles/style.css" rel="Stylesheet">
+ <script type="text/javascript" src="../../scripts/navigationLoader.js" async="async"></script>
+ <script>var pathToRoot = "../../";</script>
+ </head>
+ <body>
+ <div id="navigation">
+ <div id="searchBar">
+ <form action="../../-search.html" method="get" id="searchForm"><input type="search" name="query"><input type="submit" value="Search"></form>
+ </div>
+ <div id="sideMenu"></div>
+ </div>
+ <div id="content">//<a href="../index.html">root</a>/<a href="index.html"></a>/<a href="available-since1.1.html">availableSince1.1</a>
+ <h1>availableSince1.1</h1>
+final fun <a href="available-since1.1.html">availableSince1.1</a>(): <a href="">String</a>
+ <h3>Description</h3>
+Quite useful <a href="[String]">String</a>
+</div>
+ </body>
+</html>
+
diff --git a/plugins/base/src/test/resources/expect/sinceKotlin/out/html/root/index.html b/plugins/base/src/test/resources/expect/sinceKotlin/out/html/root/index.html
new file mode 100644
index 00000000..65836c49
--- /dev/null
+++ b/plugins/base/src/test/resources/expect/sinceKotlin/out/html/root/index.html
@@ -0,0 +1,31 @@
+<html>
+ <head>
+ <title></title>
+ <link href="../../styles/style.css" rel="Stylesheet">
+ <script type="text/javascript" src="../../scripts/navigationLoader.js" async="async"></script>
+ <script>var pathToRoot = "../../";</script>
+ </head>
+ <body>
+ <div id="navigation">
+ <div id="searchBar">
+ <form action="../../-search.html" method="get" id="searchForm"><input type="search" name="query"><input type="submit" value="Search"></form>
+ </div>
+ <div id="sideMenu"></div>
+ </div>
+ <div id="content">//<a href="../index.html">root</a>/<a href="index.html"></a>
+ <h1>Package </h1>
+ <h2>Functions</h2>
+ <table>
+ <thead></thead>
+ <tbody>
+ <tr>
+ <td><a href="available-since1.1.html">availableSince1.1</a></td>
+ <td>final fun <a href="available-since1.1.html">availableSince1.1</a>(): <a href="">String</a></td>
+ <td>Quite useful String</td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ </body>
+</html>
+
diff --git a/plugins/base/src/test/resources/expect/sinceKotlin/src/sinceKotlin.kt b/plugins/base/src/test/resources/expect/sinceKotlin/src/sinceKotlin.kt
new file mode 100644
index 00000000..cdcd3357
--- /dev/null
+++ b/plugins/base/src/test/resources/expect/sinceKotlin/src/sinceKotlin.kt
@@ -0,0 +1,5 @@
+/**
+ * Quite useful [String]
+ */
+@SinceKotlin("1.1")
+fun `availableSince1.1`(): String = "1.1 rulezz" \ No newline at end of file
diff --git a/plugins/base/src/test/resources/expect/suspendFunction/out/html/-search.html b/plugins/base/src/test/resources/expect/suspendFunction/out/html/-search.html
new file mode 100644
index 00000000..1ee812bb
--- /dev/null
+++ b/plugins/base/src/test/resources/expect/suspendFunction/out/html/-search.html
@@ -0,0 +1,23 @@
+<html>
+ <head>
+ <title>Search</title>
+ <link href="styles/style.css" rel="Stylesheet">
+ <script type="text/javascript" src="scripts/pages.js" async="async"></script>
+ <script>var pathToRoot = "";</script>
+ </head>
+ <body>
+ <div id="navigation">
+ <div id="searchBar">
+ <form action="-search.html" method="get" id="searchForm"><input type="search" name="query"><input type="submit" value="Search"></form>
+ </div>
+ <div id="sideMenu"></div>
+ </div>
+ <div id="content">
+ <h1 id="searchTitle">Search results for </h1>
+ <table>
+ <tbody id="searchTable"></tbody>
+ </table>
+ </div>
+ </body>
+</html>
+
diff --git a/plugins/base/src/test/resources/expect/suspendFunction/out/html/navigation.html b/plugins/base/src/test/resources/expect/suspendFunction/out/html/navigation.html
new file mode 100644
index 00000000..ad2005c3
--- /dev/null
+++ b/plugins/base/src/test/resources/expect/suspendFunction/out/html/navigation.html
@@ -0,0 +1,10 @@
+<div class="sideMenuPart" id="nav-submenu">
+ <div class="overview"><a href="root/index.html">root</a><span class="navButton" onclick="document.getElementById(&quot;nav-submenu&quot;).classList.toggle(&quot;hidden&quot;);"><span class="navButtonContent"></span></span></div>
+ <div class="sideMenuPart" id="nav-submenu-0">
+ <div class="overview"><a href="root//index.html"></a><span class="navButton" onclick="document.getElementById(&quot;nav-submenu-0&quot;).classList.toggle(&quot;hidden&quot;);"><span class="navButtonContent"></span></span></div>
+ <div class="sideMenuPart" id="nav-submenu-0-0">
+ <div class="overview"><a href="root//f.html">f</a></div>
+ </div>
+ </div>
+</div>
+
diff --git a/plugins/base/src/test/resources/expect/suspendFunction/out/html/root/f.html b/plugins/base/src/test/resources/expect/suspendFunction/out/html/root/f.html
new file mode 100644
index 00000000..7900fb98
--- /dev/null
+++ b/plugins/base/src/test/resources/expect/suspendFunction/out/html/root/f.html
@@ -0,0 +1,20 @@
+<html>
+ <head>
+ <title>f</title>
+ <link href="../../styles/style.css" rel="Stylesheet">
+ <script type="text/javascript" src="../../scripts/navigationLoader.js" async="async"></script>
+ <script>var pathToRoot = "../../";</script>
+ </head>
+ <body>
+ <div id="navigation">
+ <div id="searchBar">
+ <form action="../../-search.html" method="get" id="searchForm"><input type="search" name="query"><input type="submit" value="Search"></form>
+ </div>
+ <div id="sideMenu"></div>
+ </div>
+ <div id="content">//<a href="../index.html">root</a>/<a href="index.html"></a>/<a href="f.html">f</a>
+ <h1>f</h1>
+final fun <a href="f.html">f</a>()</div>
+ </body>
+</html>
+
diff --git a/plugins/base/src/test/resources/expect/suspendFunction/out/html/root/index.html b/plugins/base/src/test/resources/expect/suspendFunction/out/html/root/index.html
new file mode 100644
index 00000000..867d7faa
--- /dev/null
+++ b/plugins/base/src/test/resources/expect/suspendFunction/out/html/root/index.html
@@ -0,0 +1,31 @@
+<html>
+ <head>
+ <title></title>
+ <link href="../../styles/style.css" rel="Stylesheet">
+ <script type="text/javascript" src="../../scripts/navigationLoader.js" async="async"></script>
+ <script>var pathToRoot = "../../";</script>
+ </head>
+ <body>
+ <div id="navigation">
+ <div id="searchBar">
+ <form action="../../-search.html" method="get" id="searchForm"><input type="search" name="query"><input type="submit" value="Search"></form>
+ </div>
+ <div id="sideMenu"></div>
+ </div>
+ <div id="content">//<a href="../index.html">root</a>/<a href="index.html"></a>
+ <h1>Package </h1>
+ <h2>Functions</h2>
+ <table>
+ <thead></thead>
+ <tbody>
+ <tr>
+ <td><a href="f.html">f</a></td>
+ <td>final fun <a href="f.html">f</a>()</td>
+ <td></td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ </body>
+</html>
+
diff --git a/plugins/base/src/test/resources/expect/suspendFunction/src/suspendFunction.kt b/plugins/base/src/test/resources/expect/suspendFunction/src/suspendFunction.kt
new file mode 100644
index 00000000..49ecca2a
--- /dev/null
+++ b/plugins/base/src/test/resources/expect/suspendFunction/src/suspendFunction.kt
@@ -0,0 +1,2 @@
+suspend fun f() {
+}
diff --git a/plugins/base/src/test/resources/expect/suspendInlineFunction/out/html/-search.html b/plugins/base/src/test/resources/expect/suspendInlineFunction/out/html/-search.html
new file mode 100644
index 00000000..1ee812bb
--- /dev/null
+++ b/plugins/base/src/test/resources/expect/suspendInlineFunction/out/html/-search.html
@@ -0,0 +1,23 @@
+<html>
+ <head>
+ <title>Search</title>
+ <link href="styles/style.css" rel="Stylesheet">
+ <script type="text/javascript" src="scripts/pages.js" async="async"></script>
+ <script>var pathToRoot = "";</script>
+ </head>
+ <body>
+ <div id="navigation">
+ <div id="searchBar">
+ <form action="-search.html" method="get" id="searchForm"><input type="search" name="query"><input type="submit" value="Search"></form>
+ </div>
+ <div id="sideMenu"></div>
+ </div>
+ <div id="content">
+ <h1 id="searchTitle">Search results for </h1>
+ <table>
+ <tbody id="searchTable"></tbody>
+ </table>
+ </div>
+ </body>
+</html>
+
diff --git a/plugins/base/src/test/resources/expect/suspendInlineFunction/out/html/navigation.html b/plugins/base/src/test/resources/expect/suspendInlineFunction/out/html/navigation.html
new file mode 100644
index 00000000..ad2005c3
--- /dev/null
+++ b/plugins/base/src/test/resources/expect/suspendInlineFunction/out/html/navigation.html
@@ -0,0 +1,10 @@
+<div class="sideMenuPart" id="nav-submenu">
+ <div class="overview"><a href="root/index.html">root</a><span class="navButton" onclick="document.getElementById(&quot;nav-submenu&quot;).classList.toggle(&quot;hidden&quot;);"><span class="navButtonContent"></span></span></div>
+ <div class="sideMenuPart" id="nav-submenu-0">
+ <div class="overview"><a href="root//index.html"></a><span class="navButton" onclick="document.getElementById(&quot;nav-submenu-0&quot;).classList.toggle(&quot;hidden&quot;);"><span class="navButtonContent"></span></span></div>
+ <div class="sideMenuPart" id="nav-submenu-0-0">
+ <div class="overview"><a href="root//f.html">f</a></div>
+ </div>
+ </div>
+</div>
+
diff --git a/plugins/base/src/test/resources/expect/suspendInlineFunction/out/html/root/f.html b/plugins/base/src/test/resources/expect/suspendInlineFunction/out/html/root/f.html
new file mode 100644
index 00000000..0661e211
--- /dev/null
+++ b/plugins/base/src/test/resources/expect/suspendInlineFunction/out/html/root/f.html
@@ -0,0 +1,30 @@
+<html>
+ <head>
+ <title>f</title>
+ <link href="../../styles/style.css" rel="Stylesheet">
+ <script type="text/javascript" src="../../scripts/navigationLoader.js" async="async"></script>
+ <script>var pathToRoot = "../../";</script>
+ </head>
+ <body>
+ <div id="navigation">
+ <div id="searchBar">
+ <form action="../../-search.html" method="get" id="searchForm"><input type="search" name="query"><input type="submit" value="Search"></form>
+ </div>
+ <div id="sideMenu"></div>
+ </div>
+ <div id="content">//<a href="../index.html">root</a>/<a href="index.html"></a>/<a href="f.html">f</a>
+ <h1>f</h1>
+final fun <a href="f.html">f</a>(<a href="">a</a>: <a href="">Function0</a>&lt;<a href="">String</a>&gt;)
+ <h2>Parameters</h2>
+ <table>
+ <thead></thead>
+ <tbody>
+ <tr>
+ <td>a</td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ </body>
+</html>
+
diff --git a/plugins/base/src/test/resources/expect/suspendInlineFunction/out/html/root/index.html b/plugins/base/src/test/resources/expect/suspendInlineFunction/out/html/root/index.html
new file mode 100644
index 00000000..a5dd2a5d
--- /dev/null
+++ b/plugins/base/src/test/resources/expect/suspendInlineFunction/out/html/root/index.html
@@ -0,0 +1,31 @@
+<html>
+ <head>
+ <title></title>
+ <link href="../../styles/style.css" rel="Stylesheet">
+ <script type="text/javascript" src="../../scripts/navigationLoader.js" async="async"></script>
+ <script>var pathToRoot = "../../";</script>
+ </head>
+ <body>
+ <div id="navigation">
+ <div id="searchBar">
+ <form action="../../-search.html" method="get" id="searchForm"><input type="search" name="query"><input type="submit" value="Search"></form>
+ </div>
+ <div id="sideMenu"></div>
+ </div>
+ <div id="content">//<a href="../index.html">root</a>/<a href="index.html"></a>
+ <h1>Package </h1>
+ <h2>Functions</h2>
+ <table>
+ <thead></thead>
+ <tbody>
+ <tr>
+ <td><a href="f.html">f</a></td>
+ <td>final fun <a href="f.html">f</a>(<a href="">a</a>: <a href="">Function0</a>&lt;<a href="">String</a>&gt;)</td>
+ <td></td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ </body>
+</html>
+
diff --git a/plugins/base/src/test/resources/expect/suspendInlineFunction/src/suspendInlineFunction.kt b/plugins/base/src/test/resources/expect/suspendInlineFunction/src/suspendInlineFunction.kt
new file mode 100644
index 00000000..54f65658
--- /dev/null
+++ b/plugins/base/src/test/resources/expect/suspendInlineFunction/src/suspendInlineFunction.kt
@@ -0,0 +1,2 @@
+suspend inline fun f(a: () -> String) {
+}
diff --git a/plugins/base/src/test/resources/expect/test/out/images/arrow_down.svg b/plugins/base/src/test/resources/expect/test/out/images/arrow_down.svg
deleted file mode 100644
index 89e7df47..00000000
--- a/plugins/base/src/test/resources/expect/test/out/images/arrow_down.svg
+++ /dev/null
@@ -1,3 +0,0 @@
-<svg width="10" height="7" viewBox="0 0 10 7" fill="none" xmlns="http://www.w3.org/2000/svg">
-<path d="M9.71824 1.66658L9.01113 0.959473L5.00497 4.96447L1.00008 0.959473L0.292969 1.66658L5.01113 6.38474L9.71824 1.66658Z" fill="#A1AAB4"/>
-</svg>
diff --git a/plugins/base/src/test/resources/expect/test/out/images/logo-icon.svg b/plugins/base/src/test/resources/expect/test/out/images/logo-icon.svg
deleted file mode 100644
index 1b3b3670..00000000
--- a/plugins/base/src/test/resources/expect/test/out/images/logo-icon.svg
+++ /dev/null
@@ -1,3 +0,0 @@
-<svg width="26" height="26" viewBox="0 0 26 26" fill="none" xmlns="http://www.w3.org/2000/svg">
-<path d="M26 26H0V0H26L12.9243 12.9747L26 26Z" fill="#F8873C"/>
-</svg>
diff --git a/plugins/base/src/test/resources/expect/test/out/images/logo-text.svg b/plugins/base/src/test/resources/expect/test/out/images/logo-text.svg
deleted file mode 100644
index 7bf3e6c5..00000000
--- a/plugins/base/src/test/resources/expect/test/out/images/logo-text.svg
+++ /dev/null
@@ -1,6 +0,0 @@
-<svg width="83" height="27" viewBox="0 0 83 27" fill="none" xmlns="http://www.w3.org/2000/svg">
-<path d="M47.1611 7.6297V25.6345V25.6867H61.8428V21.8039H51.3589V10.3852H61.8428V6.50244H47.1611V7.6297Z" fill="#27282C"/>
-<path d="M82.9891 21.8039L72.778 10.3852H82.9051V6.50244H67.0586V10.3852L77.4585 21.8039H67.0586V25.6867H82.9996V21.8039H82.9891Z" fill="#27282C"/>
-<path d="M16.2978 7.76556C14.5872 6.46086 12.4463 5.67804 10.1271 5.67804C4.53357 5.67804 0 10.1871 0 15.7503C0 21.3135 4.53357 25.8226 10.1271 25.8226C12.4463 25.8226 14.5872 25.0502 16.2978 23.735V25.7182H20.4955V0H16.2978V7.76556ZM10.1271 21.8041C6.75838 21.8041 4.02984 19.0903 4.02984 15.7399C4.02984 12.3894 6.75838 9.67563 10.1271 9.67563C13.4958 9.67563 16.2243 12.3894 16.2243 15.7399C16.2138 19.0903 13.4853 21.8041 10.1271 21.8041Z" fill="#27282C"/>
-<path d="M33.9703 5.86566C28.3768 5.86566 23.8433 10.3747 23.8433 15.9379C23.8433 21.5011 28.3768 26.0102 33.9703 26.0102C39.5638 26.0102 44.0974 21.5011 44.0974 15.9379C44.0974 10.3747 39.5638 5.86566 33.9703 5.86566ZM33.9703 21.9917C30.6016 21.9917 27.8731 19.2779 27.8731 15.9275C27.8731 12.577 30.6016 9.86325 33.9703 9.86325C37.339 9.86325 40.0676 12.577 40.0676 15.9275C40.0676 19.2779 37.339 21.9917 33.9703 21.9917Z" fill="#27282C"/>
-</svg>
diff --git a/plugins/base/src/test/resources/expect/test/out/scripts/navigationLoader.js b/plugins/base/src/test/resources/expect/test/out/scripts/navigationLoader.js
deleted file mode 100644
index 99a885a9..00000000
--- a/plugins/base/src/test/resources/expect/test/out/scripts/navigationLoader.js
+++ /dev/null
@@ -1,12 +0,0 @@
-onload = () => {
- fetch(pathToRoot + "navigation.html")
- .then(response => response.text())
- .then(data => {
- document.getElementById("sideMenu").innerHTML = data;
- }).then(() => {
- document.querySelectorAll(".overview > a").forEach(link => {
- link.setAttribute("href", pathToRoot + link.getAttribute("href"))
- console.log(link.attributes["href"])
- })
- })
-} \ No newline at end of file
diff --git a/plugins/base/src/test/resources/expect/test/out/scripts/pages.js b/plugins/base/src/test/resources/expect/test/out/scripts/pages.js
deleted file mode 100644
index c0bd7a2f..00000000
--- a/plugins/base/src/test/resources/expect/test/out/scripts/pages.js
+++ /dev/null
@@ -1,5 +0,0 @@
-var pages = [
-{ "name": "root", "location": "root/index.html" },
-{ "name": "", "location": "root//index.html" },
-{ "name": "fn", "location": "root//fn.html" }
-]
diff --git a/plugins/base/src/test/resources/expect/test/out/scripts/scripts.js b/plugins/base/src/test/resources/expect/test/out/scripts/scripts.js
deleted file mode 100644
index c2e29b9f..00000000
--- a/plugins/base/src/test/resources/expect/test/out/scripts/scripts.js
+++ /dev/null
@@ -1,11 +0,0 @@
-document.getElementById("navigationFilter").oninput = function (e) {
- var input = e.target.value;
- var menuParts = document.getElementsByClassName("sideMenuPart")
- for (let part of menuParts) {
- if(part.querySelector("a").textContent.startsWith(input)) {
- part.classList.remove("filtered");
- } else {
- part.classList.add("filtered");
- }
- }
-} \ No newline at end of file
diff --git a/plugins/base/src/test/resources/expect/test/out/scripts/search.js b/plugins/base/src/test/resources/expect/test/out/scripts/search.js
deleted file mode 100644
index 63112ac5..00000000
--- a/plugins/base/src/test/resources/expect/test/out/scripts/search.js
+++ /dev/null
@@ -1,5 +0,0 @@
-var query = new URLSearchParams(window.location.search).get("query");
- document.getElementById("searchTitle").innerHTML += '"' + query + '":';
- document.getElementById("searchTable").innerHTML = pages.filter(el => el.name.startsWith(query)).reduce((acc, element) => { return acc +
- '<tr><td><a href="' + element.location + '">' + element.name + '</a></td></tr>'
- }, ""); \ No newline at end of file
diff --git a/plugins/base/src/test/resources/expect/test/out/styles/style.css b/plugins/base/src/test/resources/expect/test/out/styles/style.css
deleted file mode 100644
index 4a76dd96..00000000
--- a/plugins/base/src/test/resources/expect/test/out/styles/style.css
+++ /dev/null
@@ -1,353 +0,0 @@
-@import url(https://fonts.googleapis.com/css?family=Open+Sans:300i,400,700);
-
-
-#content {
- margin-top: 3em;
- margin-left: 15em;
-}
-
-#navigation {
- position: relative
-}
-
-#sideMenu, #searchBar {
- position: absolute;
-}
-
-#sideMenu {
- width: 14em;
- padding-left: 0.5em;
-}
-
-#sideMenu .sideMenuPart {
- margin-left: 1em;
-}
-
-#sideMenu img {
- margin: 1em 0.25em;
-}
-
-#sideMenu hr {
- background: #DADFE6;
-}
-
-#searchBar {
- width: 100%;
- pointer-events: none;
-}
-
-#searchForm {
- float: right;
- pointer-events: all;
-}
-
-.sideMenuPart > .navButton {
- margin-left:0.25em
-}
-
-.sideMenuPart > .overview .navButtonContent::after {
- float: right;
- content: url("../images/arrow_down.svg");
-}
-
-.sideMenuPart.hidden > .navButton .navButtonContent::after {
- content: '\02192';
-}
-
-.sideMenuPart.hidden > .sideMenuPart {
- display: none;
-}
-
-.filtered > a, .filtered > .navButton {
- display: none;
-}
-
-body, table{
- font:14px/1.5 'Open Sans', "Helvetica Neue", Helvetica, Arial, sans-serif;
- background: #F4F4F4;
- font-weight:300;
- margin-left: auto;
- margin-right: auto;
- max-width: 1440px;
-}
-
-table {
- display: flex;
- padding:5px;
-}
-
-td:first-child {
- width: 20vw;
-}
-
-.keyword {
- color:black;
- font-family:Monaco, Bitstream Vera Sans Mono, Lucida Console, Terminal;
- font-size:12px;
-}
-
-.symbol {
- font-family:Monaco, Bitstream Vera Sans Mono, Lucida Console, Terminal;
- font-size:12px;
-}
-
-.identifier {
- color: darkblue;
- font-size:12px;
- font-family:Monaco, Bitstream Vera Sans Mono, Lucida Console, Terminal;
-}
-
-h1, h2, h3, h4, h5, h6 {
- color:#222;
- margin:0 0 20px;
-}
-
-p, ul, ol, table, pre, dl {
- margin:0 0 20px;
-}
-
-h1, h2, h3 {
- line-height:1.1;
-}
-
-h1 {
- font-size:28px;
-}
-
-h2 {
- color:#393939;
-}
-
-h3, h4, h5, h6 {
- color:#494949;
-}
-
-a {
- color:#258aaf;
- font-weight:400;
- text-decoration:none;
-}
-
-a:hover {
- color: inherit;
- text-decoration:underline;
-}
-
-a small {
- font-size:11px;
- color:#555;
- margin-top:-0.6em;
- display:block;
-}
-
-.wrapper {
- width:860px;
- margin:0 auto;
-}
-
-blockquote {
- border-left:1px solid #e5e5e5;
- margin:0;
- padding:0 0 0 20px;
- font-style:italic;
-}
-
-code, pre {
- font-family:Monaco, Bitstream Vera Sans Mono, Lucida Console, Terminal;
- color:#333;
- font-size:12px;
-}
-
-pre {
- display: block;
-/*
- padding:8px 8px;
- background: #f8f8f8;
- border-radius:5px;
- border:1px solid #e5e5e5;
-*/
- overflow-x: auto;
-}
-
-table {
- width:100%;
- border-collapse:collapse;
-}
-
-th, td {
- text-align:left;
- vertical-align: top;
- padding:5px 10px;
-}
-
-dt {
- color:#444;
- font-weight:700;
-}
-
-th {
- color:#444;
-}
-
-img {
- max-width:100%;
-}
-
-header {
- width:270px;
- float:left;
- position:fixed;
-}
-
-header ul {
- list-style:none;
- height:40px;
-
- padding:0;
-
- background: #eee;
- background: -moz-linear-gradient(top, #f8f8f8 0%, #dddddd 100%);
- background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#f8f8f8), color-stop(100%,#dddddd));
- background: -webkit-linear-gradient(top, #f8f8f8 0%,#dddddd 100%);
- background: -o-linear-gradient(top, #f8f8f8 0%,#dddddd 100%);
- background: -ms-linear-gradient(top, #f8f8f8 0%,#dddddd 100%);
- background: linear-gradient(top, #f8f8f8 0%,#dddddd 100%);
-
- border-radius:5px;
- border:1px solid #d2d2d2;
- box-shadow:inset #fff 0 1px 0, inset rgba(0,0,0,0.03) 0 -1px 0;
- width:270px;
-}
-
-header li {
- width:89px;
- float:left;
- border-right:1px solid #d2d2d2;
- height:40px;
-}
-
-header ul a {
- line-height:1;
- font-size:11px;
- color:#999;
- display:block;
- text-align:center;
- padding-top:6px;
- height:40px;
-}
-
-strong {
- color:#222;
- font-weight:700;
-}
-
-header ul li + li {
- width:88px;
- border-left:1px solid #fff;
-}
-
-header ul li + li + li {
- border-right:none;
- width:89px;
-}
-
-header ul a strong {
- font-size:14px;
- display:block;
- color:#222;
-}
-
-section {
- width:500px;
- float:right;
- padding-bottom:50px;
-}
-
-small {
- font-size:11px;
-}
-
-hr {
- border:0;
- background:#e5e5e5;
- height:1px;
- margin:0 0 20px;
-}
-
-footer {
- width:270px;
- float:left;
- position:fixed;
- bottom:50px;
-}
-
-@media print, screen and (max-width: 960px) {
-
- div.wrapper {
- width:auto;
- margin:0;
- }
-
- header, section, footer {
- float:none;
- position:static;
- width:auto;
- }
-
- header {
- padding-right:320px;
- }
-
- section {
- border:1px solid #e5e5e5;
- border-width:1px 0;
- padding:20px 0;
- margin:0 0 20px;
- }
-
- header a small {
- display:inline;
- }
-
- header ul {
- position:absolute;
- right:50px;
- top:52px;
- }
-}
-
-@media print, screen and (max-width: 720px) {
- body {
- word-wrap:break-word;
- }
-
- header {
- padding:0;
- }
-
- header ul, header p.view {
- position:static;
- }
-
- pre, code {
- word-wrap:normal;
- }
-}
-
-@media print, screen and (max-width: 480px) {
- body {
- padding:15px;
- }
-
- header ul {
- display:none;
- }
-}
-
-@media print {
- body {
- padding:0.4in;
- font-size:12pt;
- color:#444;
- }
-}