aboutsummaryrefslogtreecommitdiff
path: root/dokka-integration-tests/gradle/projects
diff options
context:
space:
mode:
Diffstat (limited to 'dokka-integration-tests/gradle/projects')
-rw-r--r--dokka-integration-tests/gradle/projects/coroutines/coroutines.diff96
m---------dokka-integration-tests/gradle/projects/coroutines/kotlinx-coroutines0
l---------dokka-integration-tests/gradle/projects/coroutines/template.root.gradle.kts1
l---------dokka-integration-tests/gradle/projects/coroutines/template.settings.gradle.kts1
-rw-r--r--dokka-integration-tests/gradle/projects/it-android-0/build.gradle.kts22
-rw-r--r--dokka-integration-tests/gradle/projects/it-android-0/gradle.properties7
-rw-r--r--dokka-integration-tests/gradle/projects/it-android-0/gradle/wrapper/gradle-wrapper.jarbin0 -> 58695 bytes
-rw-r--r--dokka-integration-tests/gradle/projects/it-android-0/gradle/wrapper/gradle-wrapper.properties9
-rwxr-xr-xdokka-integration-tests/gradle/projects/it-android-0/gradlew183
-rw-r--r--dokka-integration-tests/gradle/projects/it-android-0/gradlew.bat100
-rw-r--r--dokka-integration-tests/gradle/projects/it-android-0/settings.gradle.kts9
-rw-r--r--dokka-integration-tests/gradle/projects/it-android-0/src/main/AndroidManifest.xml5
-rw-r--r--dokka-integration-tests/gradle/projects/it-android-0/src/main/java/it/android/AndroidSpecificClass.kt16
-rw-r--r--dokka-integration-tests/gradle/projects/it-android-0/src/main/java/it/android/IntegrationTestActivity.kt22
-rw-r--r--dokka-integration-tests/gradle/projects/it-basic-groovy/build.gradle54
-rw-r--r--dokka-integration-tests/gradle/projects/it-basic-groovy/gradle.properties5
-rw-r--r--dokka-integration-tests/gradle/projects/it-basic-groovy/gradle/wrapper/gradle-wrapper.jarbin0 -> 58910 bytes
-rw-r--r--dokka-integration-tests/gradle/projects/it-basic-groovy/gradle/wrapper/gradle-wrapper.properties9
-rwxr-xr-xdokka-integration-tests/gradle/projects/it-basic-groovy/gradlew185
-rw-r--r--dokka-integration-tests/gradle/projects/it-basic-groovy/gradlew.bat104
-rw-r--r--dokka-integration-tests/gradle/projects/it-basic-groovy/settings.gradle.kts9
-rw-r--r--dokka-integration-tests/gradle/projects/it-basic-groovy/src/main/java/it/basic/java/SampleJavaClass.java17
-rw-r--r--dokka-integration-tests/gradle/projects/it-basic-groovy/src/main/kotlin/it/basic/PublicClass.kt48
-rw-r--r--dokka-integration-tests/gradle/projects/it-basic/build.gradle.kts67
-rw-r--r--dokka-integration-tests/gradle/projects/it-basic/customResources/custom-resource.svg7
-rw-r--r--dokka-integration-tests/gradle/projects/it-basic/customResources/custom-style-to-add.css5
-rw-r--r--dokka-integration-tests/gradle/projects/it-basic/customResources/logo-styles.css7
-rw-r--r--dokka-integration-tests/gradle/projects/it-basic/gradle.properties5
-rw-r--r--dokka-integration-tests/gradle/projects/it-basic/gradle/wrapper/gradle-wrapper.jarbin0 -> 58910 bytes
-rw-r--r--dokka-integration-tests/gradle/projects/it-basic/gradle/wrapper/gradle-wrapper.properties9
-rwxr-xr-xdokka-integration-tests/gradle/projects/it-basic/gradlew185
-rw-r--r--dokka-integration-tests/gradle/projects/it-basic/gradlew.bat104
-rw-r--r--dokka-integration-tests/gradle/projects/it-basic/settings.gradle.kts9
-rw-r--r--dokka-integration-tests/gradle/projects/it-basic/src/main/java/it/basic/java/SampleJavaClass.java17
-rw-r--r--dokka-integration-tests/gradle/projects/it-basic/src/main/kotlin/RootPackageClass.kt8
-rw-r--r--dokka-integration-tests/gradle/projects/it-basic/src/main/kotlin/it/basic/PublicClass.kt69
-rw-r--r--dokka-integration-tests/gradle/projects/it-basic/src/main/kotlin/it/internal/InternalClass.kt7
-rw-r--r--dokka-integration-tests/gradle/projects/it-basic/src/main/kotlin/it/overriddenVisibility/VisiblePrivateClass.kt12
-rw-r--r--dokka-integration-tests/gradle/projects/it-basic/src/main/kotlin/it/protected/ProtectedClass.kt10
-rw-r--r--dokka-integration-tests/gradle/projects/it-basic/src/main/kotlin/it/suppressedByPackage/SuppressedByPackage.kt7
-rw-r--r--dokka-integration-tests/gradle/projects/it-basic/src/main/kotlin/it/suppressedByPath/SuppressedByPath.kt7
-rw-r--r--dokka-integration-tests/gradle/projects/it-basic/src/test/kotlin/it/basic/TestClass.kt17
-rw-r--r--dokka-integration-tests/gradle/projects/it-collector-0/build.gradle.kts5
-rw-r--r--dokka-integration-tests/gradle/projects/it-collector-0/gradle.properties5
-rw-r--r--dokka-integration-tests/gradle/projects/it-collector-0/gradle/wrapper/gradle-wrapper.jarbin0 -> 58695 bytes
-rw-r--r--dokka-integration-tests/gradle/projects/it-collector-0/gradle/wrapper/gradle-wrapper.properties9
-rwxr-xr-xdokka-integration-tests/gradle/projects/it-collector-0/gradlew183
-rw-r--r--dokka-integration-tests/gradle/projects/it-collector-0/gradlew.bat100
-rw-r--r--dokka-integration-tests/gradle/projects/it-collector-0/moduleA/build.gradle.kts10
-rw-r--r--dokka-integration-tests/gradle/projects/it-collector-0/moduleA/moduleB/README.md2
-rw-r--r--dokka-integration-tests/gradle/projects/it-collector-0/moduleA/moduleB/build.gradle.kts8
-rw-r--r--dokka-integration-tests/gradle/projects/it-collector-0/moduleA/moduleB/src/main/kotlin/org/jetbrains/dokka/it/moduleB/ModuleB.kt6
-rw-r--r--dokka-integration-tests/gradle/projects/it-collector-0/moduleA/moduleC/README.md2
-rw-r--r--dokka-integration-tests/gradle/projects/it-collector-0/moduleA/moduleC/build.gradle.kts8
-rw-r--r--dokka-integration-tests/gradle/projects/it-collector-0/moduleA/moduleC/src/main/kotlin/org/jetbrains/dokka/it/moduleC/ModuleC.kt6
-rw-r--r--dokka-integration-tests/gradle/projects/it-collector-0/settings.gradle.kts9
-rw-r--r--dokka-integration-tests/gradle/projects/it-configuration/README.md5
-rw-r--r--dokka-integration-tests/gradle/projects/it-configuration/build.gradle.kts33
-rw-r--r--dokka-integration-tests/gradle/projects/it-configuration/gradle.properties7
-rw-r--r--dokka-integration-tests/gradle/projects/it-configuration/gradle/wrapper/gradle-wrapper.jarbin0 -> 58910 bytes
-rw-r--r--dokka-integration-tests/gradle/projects/it-configuration/gradle/wrapper/gradle-wrapper.properties9
-rwxr-xr-xdokka-integration-tests/gradle/projects/it-configuration/gradlew185
-rw-r--r--dokka-integration-tests/gradle/projects/it-configuration/gradlew.bat104
-rw-r--r--dokka-integration-tests/gradle/projects/it-configuration/settings.gradle.kts7
-rw-r--r--dokka-integration-tests/gradle/projects/it-configuration/src/main/kotlin/it/ClassWithUndocumentedDeclarations.kt12
-rw-r--r--dokka-integration-tests/gradle/projects/it-js-ir-0/build.gradle.kts25
-rw-r--r--dokka-integration-tests/gradle/projects/it-js-ir-0/gradle.properties6
-rw-r--r--dokka-integration-tests/gradle/projects/it-js-ir-0/gradle/wrapper/gradle-wrapper.jarbin0 -> 58910 bytes
-rw-r--r--dokka-integration-tests/gradle/projects/it-js-ir-0/gradle/wrapper/gradle-wrapper.properties9
-rwxr-xr-xdokka-integration-tests/gradle/projects/it-js-ir-0/gradlew185
-rw-r--r--dokka-integration-tests/gradle/projects/it-js-ir-0/gradlew.bat104
-rw-r--r--dokka-integration-tests/gradle/projects/it-js-ir-0/settings.gradle.kts9
-rw-r--r--dokka-integration-tests/gradle/projects/it-js-ir-0/src/main/kotlin/RootPackageClass.kt26
-rw-r--r--dokka-integration-tests/gradle/projects/it-js-ir-0/src/main/kotlin/it/basic/PublicClass.kt53
-rw-r--r--dokka-integration-tests/gradle/projects/it-js-ir-0/src/main/kotlin/it/internal/InternalClass.kt7
-rw-r--r--dokka-integration-tests/gradle/projects/it-js-ir-0/src/main/kotlin/it/suppressedByPackage/SuppressedByPackage.kt7
-rw-r--r--dokka-integration-tests/gradle/projects/it-js-ir-0/src/main/kotlin/it/suppressedByPath/SuppressedByPath.kt7
-rw-r--r--dokka-integration-tests/gradle/projects/it-multimodule-0/build.gradle.kts5
-rw-r--r--dokka-integration-tests/gradle/projects/it-multimodule-0/gradle.properties5
-rw-r--r--dokka-integration-tests/gradle/projects/it-multimodule-0/gradle/wrapper/gradle-wrapper.jarbin0 -> 58695 bytes
-rw-r--r--dokka-integration-tests/gradle/projects/it-multimodule-0/gradle/wrapper/gradle-wrapper.properties9
-rwxr-xr-xdokka-integration-tests/gradle/projects/it-multimodule-0/gradlew183
-rw-r--r--dokka-integration-tests/gradle/projects/it-multimodule-0/gradlew.bat100
-rw-r--r--dokka-integration-tests/gradle/projects/it-multimodule-0/moduleA/build.gradle.kts21
-rw-r--r--dokka-integration-tests/gradle/projects/it-multimodule-0/moduleA/moduleB/Module.md6
-rw-r--r--dokka-integration-tests/gradle/projects/it-multimodule-0/moduleA/moduleB/build.gradle.kts17
-rw-r--r--dokka-integration-tests/gradle/projects/it-multimodule-0/moduleA/moduleB/src/main/kotlin/org/jetbrains/dokka/it/moduleB/ModuleB.kt6
-rw-r--r--dokka-integration-tests/gradle/projects/it-multimodule-0/moduleA/moduleC/Module.md2
-rw-r--r--dokka-integration-tests/gradle/projects/it-multimodule-0/moduleA/moduleC/build.gradle.kts16
-rw-r--r--dokka-integration-tests/gradle/projects/it-multimodule-0/moduleA/moduleC/src/main/kotlin/org/jetbrains/dokka/it/moduleC/ModuleC.kt6
-rw-r--r--dokka-integration-tests/gradle/projects/it-multimodule-0/moduleA/moduleD/build.gradle.kts10
-rw-r--r--dokka-integration-tests/gradle/projects/it-multimodule-0/moduleA/moduleD/src/main/kotlin/org/jetbrains/dokka/it/moduleD/ModuleC.kt6
-rw-r--r--dokka-integration-tests/gradle/projects/it-multimodule-0/settings.gradle.kts10
-rw-r--r--dokka-integration-tests/gradle/projects/it-multimodule-1/build.gradle18
-rw-r--r--dokka-integration-tests/gradle/projects/it-multimodule-1/first/build.gradle0
-rw-r--r--dokka-integration-tests/gradle/projects/it-multimodule-1/first/src/main/kotlin/foo/FirstClass.kt11
-rw-r--r--dokka-integration-tests/gradle/projects/it-multimodule-1/first/src/main/kotlin/foo/FirstSubclass.kt12
-rw-r--r--dokka-integration-tests/gradle/projects/it-multimodule-1/first/src/main/kotlin/foo/Main.kt8
-rw-r--r--dokka-integration-tests/gradle/projects/it-multimodule-1/first/src/main/kotlin/noPackage.kt3
-rw-r--r--dokka-integration-tests/gradle/projects/it-multimodule-1/gradle.properties5
-rw-r--r--dokka-integration-tests/gradle/projects/it-multimodule-1/gradle/wrapper/gradle-wrapper.jarbin0 -> 58910 bytes
-rw-r--r--dokka-integration-tests/gradle/projects/it-multimodule-1/gradle/wrapper/gradle-wrapper.properties9
-rwxr-xr-xdokka-integration-tests/gradle/projects/it-multimodule-1/gradlew185
-rw-r--r--dokka-integration-tests/gradle/projects/it-multimodule-1/gradlew.bat104
-rw-r--r--dokka-integration-tests/gradle/projects/it-multimodule-1/second/build.gradle14
-rw-r--r--dokka-integration-tests/gradle/projects/it-multimodule-1/second/src/main/kotlin/NoPackageClass.kt1
-rw-r--r--dokka-integration-tests/gradle/projects/it-multimodule-1/second/src/main/kotlin/bar/SecondClass.kt21
-rw-r--r--dokka-integration-tests/gradle/projects/it-multimodule-1/second/src/main/kotlin/foo/ThirdClass.kt11
-rw-r--r--dokka-integration-tests/gradle/projects/it-multimodule-1/settings.gradle.kts8
-rw-r--r--dokka-integration-tests/gradle/projects/it-multimodule-versioning-0/build.gradle43
-rw-r--r--dokka-integration-tests/gradle/projects/it-multimodule-versioning-0/first/build.gradle0
-rw-r--r--dokka-integration-tests/gradle/projects/it-multimodule-versioning-0/first/src/main/kotlin/foo/FirstClass.kt11
-rw-r--r--dokka-integration-tests/gradle/projects/it-multimodule-versioning-0/gradle.properties6
-rw-r--r--dokka-integration-tests/gradle/projects/it-multimodule-versioning-0/gradle/wrapper/gradle-wrapper.jarbin0 -> 61574 bytes
-rw-r--r--dokka-integration-tests/gradle/projects/it-multimodule-versioning-0/gradle/wrapper/gradle-wrapper.properties10
-rwxr-xr-xdokka-integration-tests/gradle/projects/it-multimodule-versioning-0/gradlew244
-rw-r--r--dokka-integration-tests/gradle/projects/it-multimodule-versioning-0/gradlew.bat92
-rw-r--r--dokka-integration-tests/gradle/projects/it-multimodule-versioning-0/second/build.gradle3
-rw-r--r--dokka-integration-tests/gradle/projects/it-multimodule-versioning-0/second/src/main/kotlin/bar/SecondClass.kt21
-rw-r--r--dokka-integration-tests/gradle/projects/it-multimodule-versioning-0/settings.gradle.kts8
-rw-r--r--dokka-integration-tests/gradle/projects/it-multiplatform-0/build.gradle.kts52
-rw-r--r--dokka-integration-tests/gradle/projects/it-multiplatform-0/gradle.properties5
-rw-r--r--dokka-integration-tests/gradle/projects/it-multiplatform-0/gradle/wrapper/gradle-wrapper.jarbin0 -> 58695 bytes
-rw-r--r--dokka-integration-tests/gradle/projects/it-multiplatform-0/gradle/wrapper/gradle-wrapper.properties9
-rwxr-xr-xdokka-integration-tests/gradle/projects/it-multiplatform-0/gradlew183
-rw-r--r--dokka-integration-tests/gradle/projects/it-multiplatform-0/gradlew.bat100
-rw-r--r--dokka-integration-tests/gradle/projects/it-multiplatform-0/settings.gradle.kts6
-rw-r--r--dokka-integration-tests/gradle/projects/it-multiplatform-0/src/commonMain/kotlin/it/mpp0/CommonMainClass.kt8
-rw-r--r--dokka-integration-tests/gradle/projects/it-multiplatform-0/src/commonMain/kotlin/it/mpp0/ExpectedClass.kt5
-rw-r--r--dokka-integration-tests/gradle/projects/it-multiplatform-0/src/commonMain/kotlin/it/mpp0/coroutines.kt5
-rw-r--r--dokka-integration-tests/gradle/projects/it-multiplatform-0/src/desktopMain/kotlin/it/mpp0/CPointerExtension.kt11
-rw-r--r--dokka-integration-tests/gradle/projects/it-multiplatform-0/src/desktopMain/kotlin/it/mpp0/ExpectedClass.kt5
-rw-r--r--dokka-integration-tests/gradle/projects/it-multiplatform-0/src/jsMain/kotlin/it/mpp0/ExpectedClass.kt5
-rw-r--r--dokka-integration-tests/gradle/projects/it-multiplatform-0/src/jsMain/kotlin/it/mpp0/runBlocking.kt7
-rw-r--r--dokka-integration-tests/gradle/projects/it-multiplatform-0/src/jvmMain/kotlin/it/mpp0/ExpectedClass.kt11
-rw-r--r--dokka-integration-tests/gradle/projects/it-multiplatform-0/src/jvmMain/kotlin/it/mpp0/JvmOnlyClass.kt13
-rw-r--r--dokka-integration-tests/gradle/projects/it-multiplatform-0/src/jvmMain/kotlin/it/mpp0/runBlocking.kt7
-rw-r--r--dokka-integration-tests/gradle/projects/it-multiplatform-0/src/linuxMain/kotlin/it/mpp0/CPointerExtension.kt11
-rw-r--r--dokka-integration-tests/gradle/projects/it-multiplatform-0/src/linuxMain/kotlin/it/mpp0/ExpectedClass.kt5
-rw-r--r--dokka-integration-tests/gradle/projects/it-multiplatform-0/src/linuxMain/kotlin/it/mpp0/runBlocking.kt13
-rw-r--r--dokka-integration-tests/gradle/projects/it-multiplatform-0/src/macosMain/kotlin/it/mpp0/ExpectedClass.kt5
-rw-r--r--dokka-integration-tests/gradle/projects/it-multiplatform-0/src/macosMain/kotlin/it/mpp0/runBlocking.kt7
-rw-r--r--dokka-integration-tests/gradle/projects/it-sequential-tasks-execution-stress/build.gradle.kts44
-rw-r--r--dokka-integration-tests/gradle/projects/it-sequential-tasks-execution-stress/gradle.properties6
-rw-r--r--dokka-integration-tests/gradle/projects/it-sequential-tasks-execution-stress/gradle/wrapper/gradle-wrapper.jarbin0 -> 58910 bytes
-rw-r--r--dokka-integration-tests/gradle/projects/it-sequential-tasks-execution-stress/gradle/wrapper/gradle-wrapper.properties9
-rwxr-xr-xdokka-integration-tests/gradle/projects/it-sequential-tasks-execution-stress/gradlew185
-rw-r--r--dokka-integration-tests/gradle/projects/it-sequential-tasks-execution-stress/gradlew.bat104
-rw-r--r--dokka-integration-tests/gradle/projects/it-sequential-tasks-execution-stress/settings.gradle.kts9
-rw-r--r--dokka-integration-tests/gradle/projects/it-sequential-tasks-execution-stress/src/main/java/it/basic/java/SampleJavaClass.java17
-rw-r--r--dokka-integration-tests/gradle/projects/it-sequential-tasks-execution-stress/src/main/kotlin/RootPackageClass.kt8
-rw-r--r--dokka-integration-tests/gradle/projects/it-wasm-basic/build.gradle.kts51
-rw-r--r--dokka-integration-tests/gradle/projects/it-wasm-basic/gradle.properties5
-rw-r--r--dokka-integration-tests/gradle/projects/it-wasm-basic/gradle/wrapper/gradle-wrapper.jarbin0 -> 58695 bytes
-rw-r--r--dokka-integration-tests/gradle/projects/it-wasm-basic/gradle/wrapper/gradle-wrapper.properties9
-rwxr-xr-xdokka-integration-tests/gradle/projects/it-wasm-basic/gradlew183
-rw-r--r--dokka-integration-tests/gradle/projects/it-wasm-basic/gradlew.bat100
-rw-r--r--dokka-integration-tests/gradle/projects/it-wasm-basic/settings.gradle.kts6
-rw-r--r--dokka-integration-tests/gradle/projects/it-wasm-basic/src/wasmMain/kotlin/RootPackageClass.kt30
-rw-r--r--dokka-integration-tests/gradle/projects/it-wasm-basic/src/wasmMain/kotlin/it/basic/PublicClass.kt53
-rw-r--r--dokka-integration-tests/gradle/projects/it-wasm-basic/src/wasmMain/kotlin/it/internal/InternalClass.kt7
-rw-r--r--dokka-integration-tests/gradle/projects/it-wasm-basic/src/wasmMain/kotlin/it/suppressedByPackage/SuppressedByPackage.kt7
-rw-r--r--dokka-integration-tests/gradle/projects/it-wasm-basic/src/wasmMain/kotlin/it/suppressedByPath/SuppressedByPath.kt7
-rw-r--r--dokka-integration-tests/gradle/projects/it-wasm-js-wasi-basic/build.gradle.kts40
-rw-r--r--dokka-integration-tests/gradle/projects/it-wasm-js-wasi-basic/gradle.properties5
-rw-r--r--dokka-integration-tests/gradle/projects/it-wasm-js-wasi-basic/gradle/wrapper/gradle-wrapper.jarbin0 -> 58695 bytes
-rw-r--r--dokka-integration-tests/gradle/projects/it-wasm-js-wasi-basic/gradle/wrapper/gradle-wrapper.properties9
-rwxr-xr-xdokka-integration-tests/gradle/projects/it-wasm-js-wasi-basic/gradlew183
-rw-r--r--dokka-integration-tests/gradle/projects/it-wasm-js-wasi-basic/gradlew.bat100
-rw-r--r--dokka-integration-tests/gradle/projects/it-wasm-js-wasi-basic/settings.gradle.kts6
-rw-r--r--dokka-integration-tests/gradle/projects/it-wasm-js-wasi-basic/src/wasmJsMain/kotlin/RootPackageClass.kt30
-rw-r--r--dokka-integration-tests/gradle/projects/it-wasm-js-wasi-basic/src/wasmJsMain/kotlin/it/basic/PublicClass.kt53
-rw-r--r--dokka-integration-tests/gradle/projects/it-wasm-js-wasi-basic/src/wasmJsMain/kotlin/it/internal/InternalClass.kt7
-rw-r--r--dokka-integration-tests/gradle/projects/it-wasm-js-wasi-basic/src/wasmJsMain/kotlin/it/suppressedByPackage/SuppressedByPackage.kt7
-rw-r--r--dokka-integration-tests/gradle/projects/it-wasm-js-wasi-basic/src/wasmJsMain/kotlin/it/suppressedByPath/SuppressedByPath.kt7
-rw-r--r--dokka-integration-tests/gradle/projects/it-wasm-js-wasi-basic/src/wasmWasiMain/kotlin/RootPackageClass.kt10
-rw-r--r--dokka-integration-tests/gradle/projects/it-wasm-js-wasi-basic/src/wasmWasiMain/kotlin/it/basic/PublicClass.kt53
-rw-r--r--dokka-integration-tests/gradle/projects/it-wasm-js-wasi-basic/src/wasmWasiMain/kotlin/it/internal/InternalClass.kt7
-rw-r--r--dokka-integration-tests/gradle/projects/it-wasm-js-wasi-basic/src/wasmWasiMain/kotlin/it/suppressedByPackage/SuppressedByPackage.kt7
-rw-r--r--dokka-integration-tests/gradle/projects/it-wasm-js-wasi-basic/src/wasmWasiMain/kotlin/it/suppressedByPath/SuppressedByPath.kt7
m---------dokka-integration-tests/gradle/projects/serialization/kotlinx-serialization0
-rw-r--r--dokka-integration-tests/gradle/projects/serialization/serialization.diff29
l---------dokka-integration-tests/gradle/projects/serialization/template.root.gradle.kts1
l---------dokka-integration-tests/gradle/projects/serialization/template.settings.gradle.kts1
-rw-r--r--dokka-integration-tests/gradle/projects/template.root.gradle.kts29
-rw-r--r--dokka-integration-tests/gradle/projects/template.settings.gradle.kts45
186 files changed, 5806 insertions, 0 deletions
diff --git a/dokka-integration-tests/gradle/projects/coroutines/coroutines.diff b/dokka-integration-tests/gradle/projects/coroutines/coroutines.diff
new file mode 100644
index 00000000..6fcf896c
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/coroutines/coroutines.diff
@@ -0,0 +1,96 @@
+diff --git a/build.gradle b/build.gradle
+index e7d405e12..236310823 100644
+--- a/build.gradle
++++ b/build.gradle
+@@ -59,8 +59,9 @@ buildscript {
+ }
+
+ dependencies {
++ def dokkaVersion = System.getenv('DOKKA_VERSION')
+ classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
+- classpath "org.jetbrains.dokka:dokka-gradle-plugin:$dokka_version"
++ classpath "org.jetbrains.dokka:dokka-gradle-plugin:$dokkaVersion"
+ classpath "org.jetbrains.kotlinx:atomicfu-gradle-plugin:$atomicfu_version"
+ classpath "org.jetbrains.kotlinx:kotlinx-knit:$knit_version"
+ classpath "com.github.node-gradle:gradle-node-plugin:$gradle_node_version"
+@@ -107,6 +108,9 @@ allprojects {
+ mavenLocal()
+ }
+ }
++ repositories {
++ mavenLocal()
++ }
+
+ ext.unpublished = unpublished
+
+@@ -142,6 +146,7 @@ allprojects {
+ google()
+ mavenCentral()
+ CommunityProjectsBuild.addDevRepositoryIfEnabled(delegate, project)
++ mavenLocal()
+ }
+ }
+
+diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts
+index ae54ad0f6..786cff366 100644
+--- a/buildSrc/build.gradle.kts
++++ b/buildSrc/build.gradle.kts
+@@ -25,6 +25,7 @@ repositories {
+ if (buildSnapshotTrain) {
+ mavenLocal()
+ }
++ mavenLocal()
+ }
+
+ val gradleProperties = Properties().apply {
+@@ -49,12 +50,12 @@ dependencies {
+ * our version of Gradle bundles Kotlin 1.4.x and can read metadata only up to 1.5.x,
+ * thus we're excluding stdlib compiled with 1.6.0 from dependencies.
+ */
+- implementation("org.jetbrains.dokka:dokka-gradle-plugin:${version("dokka")}") {
++ implementation("org.jetbrains.dokka:dokka-gradle-plugin:${System.getenv("DOKKA_VERSION")}") {
+ exclude(group = "org.jetbrains.kotlin", module = "kotlin-stdlib-jdk8")
+ exclude(group = "org.jetbrains.kotlin", module = "kotlin-stdlib-jdk7")
+ exclude(group = "org.jetbrains.kotlin", module = "kotlin-stdlib")
+ }
+- implementation("org.jetbrains.dokka:dokka-core:${version("dokka")}") {
++ implementation("org.jetbrains.dokka:dokka-core:${System.getenv("DOKKA_VERSION")}") {
+ exclude(group = "org.jetbrains.kotlin", module = "kotlin-stdlib-jdk8")
+ exclude(group = "org.jetbrains.kotlin", module = "kotlin-stdlib-jdk7")
+ exclude(group = "org.jetbrains.kotlin", module = "kotlin-stdlib")
+diff --git a/buildSrc/settings.gradle.kts b/buildSrc/settings.gradle.kts
+index c2e859f65..43dc4f749 100644
+--- a/buildSrc/settings.gradle.kts
++++ b/buildSrc/settings.gradle.kts
+@@ -14,5 +14,6 @@ pluginManagement {
+ if (build_snapshot_train?.toBoolean() == true) {
+ mavenLocal()
+ }
++ mavenLocal()
+ }
+ }
+diff --git a/gradle.properties b/gradle.properties
+index 3d9431be0..9af01ef86 100644
+--- a/gradle.properties
++++ b/gradle.properties
+@@ -14,7 +14,7 @@ atomicfu_version=0.21.0
+ knit_version=0.5.0-Beta
+ html_version=0.7.2
+ lincheck_version=2.18.1
+-dokka_version=1.8.10
++dokka_version=non-existing-sanity-check-SNAPSHOT
+ byte_buddy_version=1.10.9
+ reactor_version=3.4.1
+ reactive_streams_version=1.0.3
+diff --git a/settings.gradle b/settings.gradle
+index 151c087fd..e578bdb93 100644
+--- a/settings.gradle
++++ b/settings.gradle
+@@ -11,6 +11,7 @@ pluginManagement {
+ repositories {
+ maven { url "https://maven.pkg.jetbrains.space/kotlin/p/dokka/dev/" }
+ gradlePluginPortal()
++ mavenLocal()
+ }
+ }
+
diff --git a/dokka-integration-tests/gradle/projects/coroutines/kotlinx-coroutines b/dokka-integration-tests/gradle/projects/coroutines/kotlinx-coroutines
new file mode 160000
+Subproject b78bbf518bd8e90e9ed2133ebdacc36441210cd
diff --git a/dokka-integration-tests/gradle/projects/coroutines/template.root.gradle.kts b/dokka-integration-tests/gradle/projects/coroutines/template.root.gradle.kts
new file mode 120000
index 00000000..895ca83d
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/coroutines/template.root.gradle.kts
@@ -0,0 +1 @@
+../template.root.gradle.kts \ No newline at end of file
diff --git a/dokka-integration-tests/gradle/projects/coroutines/template.settings.gradle.kts b/dokka-integration-tests/gradle/projects/coroutines/template.settings.gradle.kts
new file mode 120000
index 00000000..7b43b3e7
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/coroutines/template.settings.gradle.kts
@@ -0,0 +1 @@
+../template.settings.gradle.kts \ No newline at end of file
diff --git a/dokka-integration-tests/gradle/projects/it-android-0/build.gradle.kts b/dokka-integration-tests/gradle/projects/it-android-0/build.gradle.kts
new file mode 100644
index 00000000..d9d9e6be
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-android-0/build.gradle.kts
@@ -0,0 +1,22 @@
+/*
+ * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
+ */
+
+plugins {
+ id("com.android.library")
+ id("org.jetbrains.dokka")
+ kotlin("android")
+}
+
+apply(from = "../template.root.gradle.kts")
+
+android {
+ defaultConfig {
+ minSdkVersion(21)
+ setCompileSdkVersion(29)
+ }
+}
+
+dependencies {
+ implementation("androidx.appcompat:appcompat:1.1.0")
+}
diff --git a/dokka-integration-tests/gradle/projects/it-android-0/gradle.properties b/dokka-integration-tests/gradle/projects/it-android-0/gradle.properties
new file mode 100644
index 00000000..286fe3c3
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-android-0/gradle.properties
@@ -0,0 +1,7 @@
+#
+# Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
+#
+
+dokka_it_kotlin_version=1.9.20
+dokka_it_android_gradle_plugin_version=4.2.2
+android.useAndroidX=true
diff --git a/dokka-integration-tests/gradle/projects/it-android-0/gradle/wrapper/gradle-wrapper.jar b/dokka-integration-tests/gradle/projects/it-android-0/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 00000000..f3d88b1c
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-android-0/gradle/wrapper/gradle-wrapper.jar
Binary files differ
diff --git a/dokka-integration-tests/gradle/projects/it-android-0/gradle/wrapper/gradle-wrapper.properties b/dokka-integration-tests/gradle/projects/it-android-0/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 00000000..a434026d
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-android-0/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,9 @@
+#
+# Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
+#
+
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-6.9.2-bin.zip
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
diff --git a/dokka-integration-tests/gradle/projects/it-android-0/gradlew b/dokka-integration-tests/gradle/projects/it-android-0/gradlew
new file mode 100755
index 00000000..2fe81a7d
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-android-0/gradlew
@@ -0,0 +1,183 @@
+#!/usr/bin/env sh
+
+#
+# Copyright 2015 the original author or authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+##############################################################################
+##
+## Gradle start up script for UN*X
+##
+##############################################################################
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+ ls=`ls -ld "$PRG"`
+ link=`expr "$ls" : '.*-> \(.*\)$'`
+ if expr "$link" : '/.*' > /dev/null; then
+ PRG="$link"
+ else
+ PRG=`dirname "$PRG"`"/$link"
+ fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn () {
+ echo "$*"
+}
+
+die () {
+ echo
+ echo "$*"
+ echo
+ exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+nonstop=false
+case "`uname`" in
+ CYGWIN* )
+ cygwin=true
+ ;;
+ Darwin* )
+ darwin=true
+ ;;
+ MINGW* )
+ msys=true
+ ;;
+ NONSTOP* )
+ nonstop=true
+ ;;
+esac
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+ if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+ # IBM's JDK on AIX uses strange locations for the executables
+ JAVACMD="$JAVA_HOME/jre/sh/java"
+ else
+ JAVACMD="$JAVA_HOME/bin/java"
+ fi
+ if [ ! -x "$JAVACMD" ] ; then
+ die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+ fi
+else
+ JAVACMD="java"
+ which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
+ MAX_FD_LIMIT=`ulimit -H -n`
+ if [ $? -eq 0 ] ; then
+ if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+ MAX_FD="$MAX_FD_LIMIT"
+ fi
+ ulimit -n $MAX_FD
+ if [ $? -ne 0 ] ; then
+ warn "Could not set maximum file descriptor limit: $MAX_FD"
+ fi
+ else
+ warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+ fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+ GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin or MSYS, switch paths to Windows format before running java
+if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
+ APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+ CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+ JAVACMD=`cygpath --unix "$JAVACMD"`
+
+ # We build the pattern for arguments to be converted via cygpath
+ ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+ SEP=""
+ for dir in $ROOTDIRSRAW ; do
+ ROOTDIRS="$ROOTDIRS$SEP$dir"
+ SEP="|"
+ done
+ OURCYGPATTERN="(^($ROOTDIRS))"
+ # Add a user-defined pattern to the cygpath arguments
+ if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+ OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+ fi
+ # Now convert the arguments - kludge to limit ourselves to /bin/sh
+ i=0
+ for arg in "$@" ; do
+ CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+ CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
+
+ if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
+ eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+ else
+ eval `echo args$i`="\"$arg\""
+ fi
+ i=`expr $i + 1`
+ done
+ case $i in
+ 0) set -- ;;
+ 1) set -- "$args0" ;;
+ 2) set -- "$args0" "$args1" ;;
+ 3) set -- "$args0" "$args1" "$args2" ;;
+ 4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+ 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+ 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+ 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+ 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+ 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+ esac
+fi
+
+# Escape application args
+save () {
+ for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
+ echo " "
+}
+APP_ARGS=`save "$@"`
+
+# Collect all arguments for the java command, following the shell quoting and substitution rules
+eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
+
+exec "$JAVACMD" "$@"
diff --git a/dokka-integration-tests/gradle/projects/it-android-0/gradlew.bat b/dokka-integration-tests/gradle/projects/it-android-0/gradlew.bat
new file mode 100644
index 00000000..24467a14
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-android-0/gradlew.bat
@@ -0,0 +1,100 @@
+@rem
+@rem Copyright 2015 the original author or authors.
+@rem
+@rem Licensed under the Apache License, Version 2.0 (the "License");
+@rem you may not use this file except in compliance with the License.
+@rem You may obtain a copy of the License at
+@rem
+@rem https://www.apache.org/licenses/LICENSE-2.0
+@rem
+@rem Unless required by applicable law or agreed to in writing, software
+@rem distributed under the License is distributed on an "AS IS" BASIS,
+@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@rem See the License for the specific language governing permissions and
+@rem limitations under the License.
+@rem
+
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto init
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto init
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:init
+@rem Get command-line arguments, handling Windows variants
+
+if not "%OS%" == "Windows_NT" goto win9xME_args
+
+:win9xME_args
+@rem Slurp the command line arguments.
+set CMD_LINE_ARGS=
+set _SKIP=2
+
+:win9xME_args_slurp
+if "x%~1" == "x" goto execute
+
+set CMD_LINE_ARGS=%*
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/dokka-integration-tests/gradle/projects/it-android-0/settings.gradle.kts b/dokka-integration-tests/gradle/projects/it-android-0/settings.gradle.kts
new file mode 100644
index 00000000..a429a7b7
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-android-0/settings.gradle.kts
@@ -0,0 +1,9 @@
+/*
+ * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
+ */
+
+@file:Suppress("LocalVariableName", "UnstableApiUsage")
+
+apply(from = "../template.settings.gradle.kts")
+rootProject.name = "it-android-0"
+
diff --git a/dokka-integration-tests/gradle/projects/it-android-0/src/main/AndroidManifest.xml b/dokka-integration-tests/gradle/projects/it-android-0/src/main/AndroidManifest.xml
new file mode 100644
index 00000000..43894029
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-android-0/src/main/AndroidManifest.xml
@@ -0,0 +1,5 @@
+<!--
+ ~ Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
+ -->
+
+<manifest package="org.jetbrains.dokka.it.android"/>
diff --git a/dokka-integration-tests/gradle/projects/it-android-0/src/main/java/it/android/AndroidSpecificClass.kt b/dokka-integration-tests/gradle/projects/it-android-0/src/main/java/it/android/AndroidSpecificClass.kt
new file mode 100644
index 00000000..cb9046b1
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-android-0/src/main/java/it/android/AndroidSpecificClass.kt
@@ -0,0 +1,16 @@
+@file:Suppress("unused")
+
+package it.android
+
+import android.content.Context
+import android.util.SparseIntArray
+import android.view.View
+
+/**
+ * This class is specific to android and uses android classes like:
+ * [Context], [SparseIntArray] or [View]
+ */
+class AndroidSpecificClass {
+ fun sparseIntArray() = SparseIntArray()
+ fun createView(context: Context): View = View(context)
+}
diff --git a/dokka-integration-tests/gradle/projects/it-android-0/src/main/java/it/android/IntegrationTestActivity.kt b/dokka-integration-tests/gradle/projects/it-android-0/src/main/java/it/android/IntegrationTestActivity.kt
new file mode 100644
index 00000000..1792818b
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-android-0/src/main/java/it/android/IntegrationTestActivity.kt
@@ -0,0 +1,22 @@
+package it.android
+
+import android.annotation.SuppressLint
+import android.os.Bundle
+import android.widget.TextView
+import androidx.appcompat.app.AppCompatActivity
+
+/**
+ * Some Activity implementing [AppCompatActivity] from android x
+ */
+class IntegrationTestActivity : AppCompatActivity() {
+ /**
+ * Will show a small happy text
+ */
+ @SuppressLint("SetTextI18n")
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ val textView = TextView(this)
+ textView.text = "I am so happy :)"
+ setContentView(textView)
+ }
+} \ No newline at end of file
diff --git a/dokka-integration-tests/gradle/projects/it-basic-groovy/build.gradle b/dokka-integration-tests/gradle/projects/it-basic-groovy/build.gradle
new file mode 100644
index 00000000..4017bec0
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-basic-groovy/build.gradle
@@ -0,0 +1,54 @@
+plugins {
+ id 'org.jetbrains.kotlin.jvm'
+ id("org.jetbrains.dokka")
+}
+
+apply from: '../template.root.gradle.kts'
+
+dependencies {
+ implementation "org.jetbrains.kotlin:kotlin-stdlib"
+}
+
+dokkaHtml {
+ outputDirectory = new File(buildDir, "/dokka/customHtml")
+ failOnWarning = false
+ dokkaSourceSets {
+ customSourceSet {
+ sourceRoot(file("src/main/java"))
+ sourceRoot(file("src/main/kotlin"))
+ displayName.set("custom")
+ reportUndocumented.set(true)
+ }
+
+ configureEach {
+ perPackageOption { // testing closures
+ matchingRegex.set(".*internal.*")
+ suppress.set(true)
+ }
+
+ sourceLink { // testing closures
+ localDirectory.set(file("src/main"))
+ remoteUrl.set(
+ new URL(
+ "https://github.com/Kotlin/dokka/tree/master/" +
+ "dokka-integration-tests/gradle/projects/it-basic-groovy/src/main"
+ )
+ )
+ }
+ }
+ }
+
+}
+
+dokkaJavadoc {
+ outputDirectory = new File(buildDir, "dokka/customJavadoc")
+}
+
+dokkaGfm {
+ outputDirectory = new File(buildDir, "dokka/customGfm")
+}
+
+dokkaJekyll {
+ outputDirectory = new File(buildDir, "dokka/customJekyll")
+}
+
diff --git a/dokka-integration-tests/gradle/projects/it-basic-groovy/gradle.properties b/dokka-integration-tests/gradle/projects/it-basic-groovy/gradle.properties
new file mode 100644
index 00000000..5904fc21
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-basic-groovy/gradle.properties
@@ -0,0 +1,5 @@
+#
+# Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
+#
+
+dokka_it_kotlin_version=1.9.20
diff --git a/dokka-integration-tests/gradle/projects/it-basic-groovy/gradle/wrapper/gradle-wrapper.jar b/dokka-integration-tests/gradle/projects/it-basic-groovy/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 00000000..62d4c053
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-basic-groovy/gradle/wrapper/gradle-wrapper.jar
Binary files differ
diff --git a/dokka-integration-tests/gradle/projects/it-basic-groovy/gradle/wrapper/gradle-wrapper.properties b/dokka-integration-tests/gradle/projects/it-basic-groovy/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 00000000..a434026d
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-basic-groovy/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,9 @@
+#
+# Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
+#
+
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-6.9.2-bin.zip
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
diff --git a/dokka-integration-tests/gradle/projects/it-basic-groovy/gradlew b/dokka-integration-tests/gradle/projects/it-basic-groovy/gradlew
new file mode 100755
index 00000000..fbd7c515
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-basic-groovy/gradlew
@@ -0,0 +1,185 @@
+#!/usr/bin/env sh
+
+#
+# Copyright 2015 the original author or authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+##############################################################################
+##
+## Gradle start up script for UN*X
+##
+##############################################################################
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+ ls=`ls -ld "$PRG"`
+ link=`expr "$ls" : '.*-> \(.*\)$'`
+ if expr "$link" : '/.*' > /dev/null; then
+ PRG="$link"
+ else
+ PRG=`dirname "$PRG"`"/$link"
+ fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn () {
+ echo "$*"
+}
+
+die () {
+ echo
+ echo "$*"
+ echo
+ exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+nonstop=false
+case "`uname`" in
+ CYGWIN* )
+ cygwin=true
+ ;;
+ Darwin* )
+ darwin=true
+ ;;
+ MINGW* )
+ msys=true
+ ;;
+ NONSTOP* )
+ nonstop=true
+ ;;
+esac
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+ if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+ # IBM's JDK on AIX uses strange locations for the executables
+ JAVACMD="$JAVA_HOME/jre/sh/java"
+ else
+ JAVACMD="$JAVA_HOME/bin/java"
+ fi
+ if [ ! -x "$JAVACMD" ] ; then
+ die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+ fi
+else
+ JAVACMD="java"
+ which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
+ MAX_FD_LIMIT=`ulimit -H -n`
+ if [ $? -eq 0 ] ; then
+ if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+ MAX_FD="$MAX_FD_LIMIT"
+ fi
+ ulimit -n $MAX_FD
+ if [ $? -ne 0 ] ; then
+ warn "Could not set maximum file descriptor limit: $MAX_FD"
+ fi
+ else
+ warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+ fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+ GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin or MSYS, switch paths to Windows format before running java
+if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
+ APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+ CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+
+ JAVACMD=`cygpath --unix "$JAVACMD"`
+
+ # We build the pattern for arguments to be converted via cygpath
+ ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+ SEP=""
+ for dir in $ROOTDIRSRAW ; do
+ ROOTDIRS="$ROOTDIRS$SEP$dir"
+ SEP="|"
+ done
+ OURCYGPATTERN="(^($ROOTDIRS))"
+ # Add a user-defined pattern to the cygpath arguments
+ if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+ OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+ fi
+ # Now convert the arguments - kludge to limit ourselves to /bin/sh
+ i=0
+ for arg in "$@" ; do
+ CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+ CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
+
+ if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
+ eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+ else
+ eval `echo args$i`="\"$arg\""
+ fi
+ i=`expr $i + 1`
+ done
+ case $i in
+ 0) set -- ;;
+ 1) set -- "$args0" ;;
+ 2) set -- "$args0" "$args1" ;;
+ 3) set -- "$args0" "$args1" "$args2" ;;
+ 4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+ 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+ 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+ 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+ 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+ 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+ esac
+fi
+
+# Escape application args
+save () {
+ for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
+ echo " "
+}
+APP_ARGS=`save "$@"`
+
+# Collect all arguments for the java command, following the shell quoting and substitution rules
+eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
+
+exec "$JAVACMD" "$@"
diff --git a/dokka-integration-tests/gradle/projects/it-basic-groovy/gradlew.bat b/dokka-integration-tests/gradle/projects/it-basic-groovy/gradlew.bat
new file mode 100644
index 00000000..a9f778a7
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-basic-groovy/gradlew.bat
@@ -0,0 +1,104 @@
+@rem
+@rem Copyright 2015 the original author or authors.
+@rem
+@rem Licensed under the Apache License, Version 2.0 (the "License");
+@rem you may not use this file except in compliance with the License.
+@rem You may obtain a copy of the License at
+@rem
+@rem https://www.apache.org/licenses/LICENSE-2.0
+@rem
+@rem Unless required by applicable law or agreed to in writing, software
+@rem distributed under the License is distributed on an "AS IS" BASIS,
+@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@rem See the License for the specific language governing permissions and
+@rem limitations under the License.
+@rem
+
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Resolve any "." and ".." in APP_HOME to make it shorter.
+for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto init
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto init
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:init
+@rem Get command-line arguments, handling Windows variants
+
+if not "%OS%" == "Windows_NT" goto win9xME_args
+
+:win9xME_args
+@rem Slurp the command line arguments.
+set CMD_LINE_ARGS=
+set _SKIP=2
+
+:win9xME_args_slurp
+if "x%~1" == "x" goto execute
+
+set CMD_LINE_ARGS=%*
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/dokka-integration-tests/gradle/projects/it-basic-groovy/settings.gradle.kts b/dokka-integration-tests/gradle/projects/it-basic-groovy/settings.gradle.kts
new file mode 100644
index 00000000..24867cf2
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-basic-groovy/settings.gradle.kts
@@ -0,0 +1,9 @@
+/*
+ * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
+ */
+
+@file:Suppress("LocalVariableName", "UnstableApiUsage")
+
+apply(from = "../template.settings.gradle.kts")
+rootProject.name = "it-basic-groovy"
+
diff --git a/dokka-integration-tests/gradle/projects/it-basic-groovy/src/main/java/it/basic/java/SampleJavaClass.java b/dokka-integration-tests/gradle/projects/it-basic-groovy/src/main/java/it/basic/java/SampleJavaClass.java
new file mode 100644
index 00000000..23b0202c
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-basic-groovy/src/main/java/it/basic/java/SampleJavaClass.java
@@ -0,0 +1,17 @@
+package it.basic.java;
+
+import it.basic.PublicClass;
+
+/**
+ * This class is, unlike {@link PublicClass}, written in Java
+ */
+@SuppressWarnings("unused")
+public class SampleJavaClass {
+
+ /**
+ * @return Empty instance of {@link PublicClass}
+ */
+ public PublicClass publicDocumentedFunction() {
+ return new PublicClass();
+ }
+}
diff --git a/dokka-integration-tests/gradle/projects/it-basic-groovy/src/main/kotlin/it/basic/PublicClass.kt b/dokka-integration-tests/gradle/projects/it-basic-groovy/src/main/kotlin/it/basic/PublicClass.kt
new file mode 100644
index 00000000..71bc7e63
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-basic-groovy/src/main/kotlin/it/basic/PublicClass.kt
@@ -0,0 +1,48 @@
+@file:Suppress("unused")
+
+package it.basic
+
+class PublicClass {
+ /**
+ * This function is public and documented
+ */
+ fun publicDocumentedFunction(): String = ""
+
+ fun publicUndocumentedFunction(): String = ""
+
+ /**
+ * This function is internal and documented
+ */
+ internal fun internalDocumentedFunction(): String = ""
+
+ internal fun internalUndocumentedFunction(): String = ""
+
+ /**
+ * This function is private and documented
+ */
+ private fun privateDocumentedFunction(): String = ""
+
+ private fun privateUndocumentedFunction(): String = ""
+
+
+ /**
+ * This property is public and documented
+ */
+ val publicDocumentedProperty: Int = 0
+
+ val publicUndocumentedProperty: Int = 0
+
+ /**
+ * This property internal and documented
+ */
+ val internalDocumentedProperty: Int = 0
+
+ val internalUndocumentedProperty: Int = 0
+
+ /**
+ * This property private and documented
+ */
+ private val privateDocumentedProperty: Int = 0
+
+ private val privateUndocumentedProperty: Int = 0
+}
diff --git a/dokka-integration-tests/gradle/projects/it-basic/build.gradle.kts b/dokka-integration-tests/gradle/projects/it-basic/build.gradle.kts
new file mode 100644
index 00000000..aaaf782c
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-basic/build.gradle.kts
@@ -0,0 +1,67 @@
+/*
+ * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
+ */
+
+import org.jetbrains.dokka.gradle.DokkaTask
+import org.jetbrains.dokka.gradle.kotlinSourceSet
+import org.jetbrains.dokka.base.DokkaBase
+import org.jetbrains.dokka.base.DokkaBaseConfiguration
+import org.jetbrains.dokka.DokkaConfiguration
+import java.net.URL
+
+plugins {
+ kotlin("jvm")
+ id("org.jetbrains.dokka")
+}
+
+buildscript {
+ dependencies {
+ classpath("org.jetbrains.dokka:dokka-base:${System.getenv("DOKKA_VERSION")}")
+ }
+}
+
+version = "1.9.20-SNAPSHOT"
+
+apply(from = "../template.root.gradle.kts")
+
+dependencies {
+ testImplementation(kotlin("test-junit"))
+}
+
+tasks.withType<DokkaTask> {
+ moduleName.set("Basic Project")
+ dokkaSourceSets {
+ configureEach {
+ documentedVisibilities.set(
+ setOf(DokkaConfiguration.Visibility.PUBLIC, DokkaConfiguration.Visibility.PROTECTED)
+ )
+ suppressedFiles.from(file("src/main/kotlin/it/suppressedByPath"))
+ perPackageOption {
+ matchingRegex.set("it.suppressedByPackage.*")
+ suppress.set(true)
+ }
+ perPackageOption {
+ matchingRegex.set("it.overriddenVisibility.*")
+ documentedVisibilities.set(
+ setOf(DokkaConfiguration.Visibility.PRIVATE)
+ )
+ }
+ sourceLink {
+ localDirectory.set(file("src/main"))
+ remoteUrl.set(
+ URL(
+ "https://github.com/Kotlin/dokka/tree/master/" +
+ "dokka-integration-tests/gradle/projects/it-basic/src/main"
+ )
+ )
+ }
+ }
+
+ register("myTest") {
+ kotlinSourceSet(kotlin.sourceSets["test"])
+ }
+ }
+ suppressObviousFunctions.set(false)
+
+ pluginsMapConfiguration.set(mapOf(DokkaBase::class.qualifiedName to """{ "customStyleSheets": ["${file("../customResources/logo-styles.css").invariantSeparatorsPath}", "${file("../customResources/custom-style-to-add.css").invariantSeparatorsPath}"], "customAssets" : ["${file("../customResources/custom-resource.svg").invariantSeparatorsPath}"] }"""))
+}
diff --git a/dokka-integration-tests/gradle/projects/it-basic/customResources/custom-resource.svg b/dokka-integration-tests/gradle/projects/it-basic/customResources/custom-resource.svg
new file mode 100644
index 00000000..c4b95383
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-basic/customResources/custom-resource.svg
@@ -0,0 +1,7 @@
+<!--
+ - Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
+ -->
+
+<svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
+ <path d="M18 9C18 14 14 18 9 18C4 18 0 14 0 9C0 4 4 0 9 0C14 0 18 4 18 9ZM14.2 6.2L12.8 4.8L7.5 10.1L5.3 7.8L3.8 9.2L7.5 13L14.2 6.2Z" fill="#4DBB5F"/>
+</svg>
diff --git a/dokka-integration-tests/gradle/projects/it-basic/customResources/custom-style-to-add.css b/dokka-integration-tests/gradle/projects/it-basic/customResources/custom-style-to-add.css
new file mode 100644
index 00000000..f949ca1c
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-basic/customResources/custom-style-to-add.css
@@ -0,0 +1,5 @@
+/*
+ * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
+ */
+
+/* custom stylesheet */
diff --git a/dokka-integration-tests/gradle/projects/it-basic/customResources/logo-styles.css b/dokka-integration-tests/gradle/projects/it-basic/customResources/logo-styles.css
new file mode 100644
index 00000000..c7932753
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-basic/customResources/logo-styles.css
@@ -0,0 +1,7 @@
+/*
+ * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
+ */
+
+:root {
+ --dokka-logo-image-url: url('https://upload.wikimedia.org/wikipedia/commons/9/9d/Ubuntu_logo.svg');
+}
diff --git a/dokka-integration-tests/gradle/projects/it-basic/gradle.properties b/dokka-integration-tests/gradle/projects/it-basic/gradle.properties
new file mode 100644
index 00000000..5904fc21
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-basic/gradle.properties
@@ -0,0 +1,5 @@
+#
+# Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
+#
+
+dokka_it_kotlin_version=1.9.20
diff --git a/dokka-integration-tests/gradle/projects/it-basic/gradle/wrapper/gradle-wrapper.jar b/dokka-integration-tests/gradle/projects/it-basic/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 00000000..62d4c053
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-basic/gradle/wrapper/gradle-wrapper.jar
Binary files differ
diff --git a/dokka-integration-tests/gradle/projects/it-basic/gradle/wrapper/gradle-wrapper.properties b/dokka-integration-tests/gradle/projects/it-basic/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 00000000..a434026d
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-basic/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,9 @@
+#
+# Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
+#
+
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-6.9.2-bin.zip
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
diff --git a/dokka-integration-tests/gradle/projects/it-basic/gradlew b/dokka-integration-tests/gradle/projects/it-basic/gradlew
new file mode 100755
index 00000000..fbd7c515
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-basic/gradlew
@@ -0,0 +1,185 @@
+#!/usr/bin/env sh
+
+#
+# Copyright 2015 the original author or authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+##############################################################################
+##
+## Gradle start up script for UN*X
+##
+##############################################################################
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+ ls=`ls -ld "$PRG"`
+ link=`expr "$ls" : '.*-> \(.*\)$'`
+ if expr "$link" : '/.*' > /dev/null; then
+ PRG="$link"
+ else
+ PRG=`dirname "$PRG"`"/$link"
+ fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn () {
+ echo "$*"
+}
+
+die () {
+ echo
+ echo "$*"
+ echo
+ exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+nonstop=false
+case "`uname`" in
+ CYGWIN* )
+ cygwin=true
+ ;;
+ Darwin* )
+ darwin=true
+ ;;
+ MINGW* )
+ msys=true
+ ;;
+ NONSTOP* )
+ nonstop=true
+ ;;
+esac
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+ if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+ # IBM's JDK on AIX uses strange locations for the executables
+ JAVACMD="$JAVA_HOME/jre/sh/java"
+ else
+ JAVACMD="$JAVA_HOME/bin/java"
+ fi
+ if [ ! -x "$JAVACMD" ] ; then
+ die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+ fi
+else
+ JAVACMD="java"
+ which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
+ MAX_FD_LIMIT=`ulimit -H -n`
+ if [ $? -eq 0 ] ; then
+ if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+ MAX_FD="$MAX_FD_LIMIT"
+ fi
+ ulimit -n $MAX_FD
+ if [ $? -ne 0 ] ; then
+ warn "Could not set maximum file descriptor limit: $MAX_FD"
+ fi
+ else
+ warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+ fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+ GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin or MSYS, switch paths to Windows format before running java
+if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
+ APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+ CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+
+ JAVACMD=`cygpath --unix "$JAVACMD"`
+
+ # We build the pattern for arguments to be converted via cygpath
+ ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+ SEP=""
+ for dir in $ROOTDIRSRAW ; do
+ ROOTDIRS="$ROOTDIRS$SEP$dir"
+ SEP="|"
+ done
+ OURCYGPATTERN="(^($ROOTDIRS))"
+ # Add a user-defined pattern to the cygpath arguments
+ if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+ OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+ fi
+ # Now convert the arguments - kludge to limit ourselves to /bin/sh
+ i=0
+ for arg in "$@" ; do
+ CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+ CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
+
+ if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
+ eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+ else
+ eval `echo args$i`="\"$arg\""
+ fi
+ i=`expr $i + 1`
+ done
+ case $i in
+ 0) set -- ;;
+ 1) set -- "$args0" ;;
+ 2) set -- "$args0" "$args1" ;;
+ 3) set -- "$args0" "$args1" "$args2" ;;
+ 4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+ 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+ 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+ 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+ 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+ 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+ esac
+fi
+
+# Escape application args
+save () {
+ for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
+ echo " "
+}
+APP_ARGS=`save "$@"`
+
+# Collect all arguments for the java command, following the shell quoting and substitution rules
+eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
+
+exec "$JAVACMD" "$@"
diff --git a/dokka-integration-tests/gradle/projects/it-basic/gradlew.bat b/dokka-integration-tests/gradle/projects/it-basic/gradlew.bat
new file mode 100644
index 00000000..a9f778a7
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-basic/gradlew.bat
@@ -0,0 +1,104 @@
+@rem
+@rem Copyright 2015 the original author or authors.
+@rem
+@rem Licensed under the Apache License, Version 2.0 (the "License");
+@rem you may not use this file except in compliance with the License.
+@rem You may obtain a copy of the License at
+@rem
+@rem https://www.apache.org/licenses/LICENSE-2.0
+@rem
+@rem Unless required by applicable law or agreed to in writing, software
+@rem distributed under the License is distributed on an "AS IS" BASIS,
+@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@rem See the License for the specific language governing permissions and
+@rem limitations under the License.
+@rem
+
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Resolve any "." and ".." in APP_HOME to make it shorter.
+for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto init
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto init
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:init
+@rem Get command-line arguments, handling Windows variants
+
+if not "%OS%" == "Windows_NT" goto win9xME_args
+
+:win9xME_args
+@rem Slurp the command line arguments.
+set CMD_LINE_ARGS=
+set _SKIP=2
+
+:win9xME_args_slurp
+if "x%~1" == "x" goto execute
+
+set CMD_LINE_ARGS=%*
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/dokka-integration-tests/gradle/projects/it-basic/settings.gradle.kts b/dokka-integration-tests/gradle/projects/it-basic/settings.gradle.kts
new file mode 100644
index 00000000..0345c020
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-basic/settings.gradle.kts
@@ -0,0 +1,9 @@
+/*
+ * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
+ */
+
+@file:Suppress("LocalVariableName", "UnstableApiUsage")
+
+apply(from = "../template.settings.gradle.kts")
+rootProject.name = "it-basic"
+
diff --git a/dokka-integration-tests/gradle/projects/it-basic/src/main/java/it/basic/java/SampleJavaClass.java b/dokka-integration-tests/gradle/projects/it-basic/src/main/java/it/basic/java/SampleJavaClass.java
new file mode 100644
index 00000000..23b0202c
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-basic/src/main/java/it/basic/java/SampleJavaClass.java
@@ -0,0 +1,17 @@
+package it.basic.java;
+
+import it.basic.PublicClass;
+
+/**
+ * This class is, unlike {@link PublicClass}, written in Java
+ */
+@SuppressWarnings("unused")
+public class SampleJavaClass {
+
+ /**
+ * @return Empty instance of {@link PublicClass}
+ */
+ public PublicClass publicDocumentedFunction() {
+ return new PublicClass();
+ }
+}
diff --git a/dokka-integration-tests/gradle/projects/it-basic/src/main/kotlin/RootPackageClass.kt b/dokka-integration-tests/gradle/projects/it-basic/src/main/kotlin/RootPackageClass.kt
new file mode 100644
index 00000000..8ff6c750
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-basic/src/main/kotlin/RootPackageClass.kt
@@ -0,0 +1,8 @@
+@file:Suppress("unused")
+
+/**
+ * A class that lives inside the root package
+ */
+class RootPackageClass {
+ val description = "I do live in the root package!"
+}
diff --git a/dokka-integration-tests/gradle/projects/it-basic/src/main/kotlin/it/basic/PublicClass.kt b/dokka-integration-tests/gradle/projects/it-basic/src/main/kotlin/it/basic/PublicClass.kt
new file mode 100644
index 00000000..2958948c
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-basic/src/main/kotlin/it/basic/PublicClass.kt
@@ -0,0 +1,69 @@
+@file:Suppress("unused")
+
+package it.basic
+
+import RootPackageClass
+
+/**
+ * This class, unlike [RootPackageClass] is located in a sub-package
+ *
+ * §PUBLIC§ (marker for asserts)
+ */
+class PublicClass {
+ /**
+ * This function is public and documented
+ */
+ fun publicDocumentedFunction(): String = ""
+
+ fun publicUndocumentedFunction(): String = ""
+
+ /**
+ * This function is internal and documented
+ */
+ internal fun internalDocumentedFunction(): String = ""
+
+ internal fun internalUndocumentedFunction(): String = ""
+
+ /**
+ * This function is protected and documented
+ */
+ protected fun protectedDocumentedFunction(): String = ""
+
+ protected fun protectedUndocumentedFunction(): String = ""
+
+ /**
+ * This function is private and documented
+ */
+ private fun privateDocumentedFunction(): String = ""
+
+ private fun privateUndocumentedFunction(): String = ""
+
+
+ /**
+ * This property is public and documented
+ */
+ val publicDocumentedProperty: Int = 0
+
+ val publicUndocumentedProperty: Int = 0
+
+ /**
+ * This property internal and documented
+ */
+ val internalDocumentedProperty: Int = 0
+
+ val internalUndocumentedProperty: Int = 0
+
+ /**
+ * This property is protected and documented
+ */
+ val protectedDocumentedProperty: Int = 0
+
+ val protectedUndocumentedProperty: Int = 0
+
+ /**
+ * This property private and documented
+ */
+ private val privateDocumentedProperty: Int = 0
+
+ private val privateUndocumentedProperty: Int = 0
+}
diff --git a/dokka-integration-tests/gradle/projects/it-basic/src/main/kotlin/it/internal/InternalClass.kt b/dokka-integration-tests/gradle/projects/it-basic/src/main/kotlin/it/internal/InternalClass.kt
new file mode 100644
index 00000000..6173d239
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-basic/src/main/kotlin/it/internal/InternalClass.kt
@@ -0,0 +1,7 @@
+package it.internal
+
+/**
+ * §INTERNAL§ (marker for asserts)
+ * This class is internal and should not be rendered
+ */
+internal class InternalClass
diff --git a/dokka-integration-tests/gradle/projects/it-basic/src/main/kotlin/it/overriddenVisibility/VisiblePrivateClass.kt b/dokka-integration-tests/gradle/projects/it-basic/src/main/kotlin/it/overriddenVisibility/VisiblePrivateClass.kt
new file mode 100644
index 00000000..230f5e0b
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-basic/src/main/kotlin/it/overriddenVisibility/VisiblePrivateClass.kt
@@ -0,0 +1,12 @@
+package it.overriddenVisibility
+
+/**
+ * Private classes and methods generally should not be visible, but [documentedVisibilities]
+ * are overriden for this specific package to include private code
+ *
+ * §PRIVATE§ (marker for asserts)
+ */
+private class VisiblePrivateClass {
+ private val privateVal: Int = 0
+ private fun privateMethod() {}
+} \ No newline at end of file
diff --git a/dokka-integration-tests/gradle/projects/it-basic/src/main/kotlin/it/protected/ProtectedClass.kt b/dokka-integration-tests/gradle/projects/it-basic/src/main/kotlin/it/protected/ProtectedClass.kt
new file mode 100644
index 00000000..ad19f1a1
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-basic/src/main/kotlin/it/protected/ProtectedClass.kt
@@ -0,0 +1,10 @@
+package it.protected
+
+/**
+ * Protected class should be visible because it's included in documentedVisibilities
+ *
+ * §PROTECTED§ (marker for asserts)
+ */
+protected class ProtectedClass {
+ protected fun protectedFun(): String = "protected"
+}
diff --git a/dokka-integration-tests/gradle/projects/it-basic/src/main/kotlin/it/suppressedByPackage/SuppressedByPackage.kt b/dokka-integration-tests/gradle/projects/it-basic/src/main/kotlin/it/suppressedByPackage/SuppressedByPackage.kt
new file mode 100644
index 00000000..d8dc9cff
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-basic/src/main/kotlin/it/suppressedByPackage/SuppressedByPackage.kt
@@ -0,0 +1,7 @@
+package it.suppressedByPackage
+
+/**
+ * §SUPPRESSED§
+ * This should not be rendered.
+ */
+class SuppressedByPackage
diff --git a/dokka-integration-tests/gradle/projects/it-basic/src/main/kotlin/it/suppressedByPath/SuppressedByPath.kt b/dokka-integration-tests/gradle/projects/it-basic/src/main/kotlin/it/suppressedByPath/SuppressedByPath.kt
new file mode 100644
index 00000000..4dda9da4
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-basic/src/main/kotlin/it/suppressedByPath/SuppressedByPath.kt
@@ -0,0 +1,7 @@
+package it.suppressedByPath
+
+/**
+ * §SUPPRESSED§
+ * This should not be rendered.
+ */
+class SuppressedByPath
diff --git a/dokka-integration-tests/gradle/projects/it-basic/src/test/kotlin/it/basic/TestClass.kt b/dokka-integration-tests/gradle/projects/it-basic/src/test/kotlin/it/basic/TestClass.kt
new file mode 100644
index 00000000..3584bdef
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-basic/src/test/kotlin/it/basic/TestClass.kt
@@ -0,0 +1,17 @@
+package it.basic
+
+import kotlin.test.Test
+import kotlin.test.assertTrue
+
+annotation class OurAnnotation
+
+class TestClass {
+ /**
+ * Asserts something. [PublicClass]
+ */
+ @Test
+ @OurAnnotation
+ fun test() {
+ assertTrue(1 == 1)
+ }
+}
diff --git a/dokka-integration-tests/gradle/projects/it-collector-0/build.gradle.kts b/dokka-integration-tests/gradle/projects/it-collector-0/build.gradle.kts
new file mode 100644
index 00000000..948e0c3b
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-collector-0/build.gradle.kts
@@ -0,0 +1,5 @@
+/*
+ * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
+ */
+
+apply(from = "../template.root.gradle.kts")
diff --git a/dokka-integration-tests/gradle/projects/it-collector-0/gradle.properties b/dokka-integration-tests/gradle/projects/it-collector-0/gradle.properties
new file mode 100644
index 00000000..5904fc21
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-collector-0/gradle.properties
@@ -0,0 +1,5 @@
+#
+# Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
+#
+
+dokka_it_kotlin_version=1.9.20
diff --git a/dokka-integration-tests/gradle/projects/it-collector-0/gradle/wrapper/gradle-wrapper.jar b/dokka-integration-tests/gradle/projects/it-collector-0/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 00000000..f3d88b1c
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-collector-0/gradle/wrapper/gradle-wrapper.jar
Binary files differ
diff --git a/dokka-integration-tests/gradle/projects/it-collector-0/gradle/wrapper/gradle-wrapper.properties b/dokka-integration-tests/gradle/projects/it-collector-0/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 00000000..a434026d
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-collector-0/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,9 @@
+#
+# Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
+#
+
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-6.9.2-bin.zip
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
diff --git a/dokka-integration-tests/gradle/projects/it-collector-0/gradlew b/dokka-integration-tests/gradle/projects/it-collector-0/gradlew
new file mode 100755
index 00000000..2fe81a7d
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-collector-0/gradlew
@@ -0,0 +1,183 @@
+#!/usr/bin/env sh
+
+#
+# Copyright 2015 the original author or authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+##############################################################################
+##
+## Gradle start up script for UN*X
+##
+##############################################################################
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+ ls=`ls -ld "$PRG"`
+ link=`expr "$ls" : '.*-> \(.*\)$'`
+ if expr "$link" : '/.*' > /dev/null; then
+ PRG="$link"
+ else
+ PRG=`dirname "$PRG"`"/$link"
+ fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn () {
+ echo "$*"
+}
+
+die () {
+ echo
+ echo "$*"
+ echo
+ exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+nonstop=false
+case "`uname`" in
+ CYGWIN* )
+ cygwin=true
+ ;;
+ Darwin* )
+ darwin=true
+ ;;
+ MINGW* )
+ msys=true
+ ;;
+ NONSTOP* )
+ nonstop=true
+ ;;
+esac
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+ if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+ # IBM's JDK on AIX uses strange locations for the executables
+ JAVACMD="$JAVA_HOME/jre/sh/java"
+ else
+ JAVACMD="$JAVA_HOME/bin/java"
+ fi
+ if [ ! -x "$JAVACMD" ] ; then
+ die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+ fi
+else
+ JAVACMD="java"
+ which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
+ MAX_FD_LIMIT=`ulimit -H -n`
+ if [ $? -eq 0 ] ; then
+ if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+ MAX_FD="$MAX_FD_LIMIT"
+ fi
+ ulimit -n $MAX_FD
+ if [ $? -ne 0 ] ; then
+ warn "Could not set maximum file descriptor limit: $MAX_FD"
+ fi
+ else
+ warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+ fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+ GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin or MSYS, switch paths to Windows format before running java
+if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
+ APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+ CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+ JAVACMD=`cygpath --unix "$JAVACMD"`
+
+ # We build the pattern for arguments to be converted via cygpath
+ ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+ SEP=""
+ for dir in $ROOTDIRSRAW ; do
+ ROOTDIRS="$ROOTDIRS$SEP$dir"
+ SEP="|"
+ done
+ OURCYGPATTERN="(^($ROOTDIRS))"
+ # Add a user-defined pattern to the cygpath arguments
+ if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+ OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+ fi
+ # Now convert the arguments - kludge to limit ourselves to /bin/sh
+ i=0
+ for arg in "$@" ; do
+ CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+ CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
+
+ if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
+ eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+ else
+ eval `echo args$i`="\"$arg\""
+ fi
+ i=`expr $i + 1`
+ done
+ case $i in
+ 0) set -- ;;
+ 1) set -- "$args0" ;;
+ 2) set -- "$args0" "$args1" ;;
+ 3) set -- "$args0" "$args1" "$args2" ;;
+ 4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+ 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+ 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+ 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+ 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+ 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+ esac
+fi
+
+# Escape application args
+save () {
+ for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
+ echo " "
+}
+APP_ARGS=`save "$@"`
+
+# Collect all arguments for the java command, following the shell quoting and substitution rules
+eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
+
+exec "$JAVACMD" "$@"
diff --git a/dokka-integration-tests/gradle/projects/it-collector-0/gradlew.bat b/dokka-integration-tests/gradle/projects/it-collector-0/gradlew.bat
new file mode 100644
index 00000000..24467a14
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-collector-0/gradlew.bat
@@ -0,0 +1,100 @@
+@rem
+@rem Copyright 2015 the original author or authors.
+@rem
+@rem Licensed under the Apache License, Version 2.0 (the "License");
+@rem you may not use this file except in compliance with the License.
+@rem You may obtain a copy of the License at
+@rem
+@rem https://www.apache.org/licenses/LICENSE-2.0
+@rem
+@rem Unless required by applicable law or agreed to in writing, software
+@rem distributed under the License is distributed on an "AS IS" BASIS,
+@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@rem See the License for the specific language governing permissions and
+@rem limitations under the License.
+@rem
+
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto init
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto init
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:init
+@rem Get command-line arguments, handling Windows variants
+
+if not "%OS%" == "Windows_NT" goto win9xME_args
+
+:win9xME_args
+@rem Slurp the command line arguments.
+set CMD_LINE_ARGS=
+set _SKIP=2
+
+:win9xME_args_slurp
+if "x%~1" == "x" goto execute
+
+set CMD_LINE_ARGS=%*
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/dokka-integration-tests/gradle/projects/it-collector-0/moduleA/build.gradle.kts b/dokka-integration-tests/gradle/projects/it-collector-0/moduleA/build.gradle.kts
new file mode 100644
index 00000000..1e61f8b2
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-collector-0/moduleA/build.gradle.kts
@@ -0,0 +1,10 @@
+/*
+ * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
+ */
+
+plugins {
+ // TODO: File bug report for gradle: :moduleA:moduleB:dokkaHtml is missing kotlin gradle plugin from
+ // the runtime classpath during execution without this plugin in the parent project
+ kotlin("jvm")
+ id("org.jetbrains.dokka")
+}
diff --git a/dokka-integration-tests/gradle/projects/it-collector-0/moduleA/moduleB/README.md b/dokka-integration-tests/gradle/projects/it-collector-0/moduleA/moduleB/README.md
new file mode 100644
index 00000000..f8c52880
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-collector-0/moduleA/moduleB/README.md
@@ -0,0 +1,2 @@
+# Module moduleB
+Here is some description for module B
diff --git a/dokka-integration-tests/gradle/projects/it-collector-0/moduleA/moduleB/build.gradle.kts b/dokka-integration-tests/gradle/projects/it-collector-0/moduleA/moduleB/build.gradle.kts
new file mode 100644
index 00000000..aa562cde
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-collector-0/moduleA/moduleB/build.gradle.kts
@@ -0,0 +1,8 @@
+/*
+ * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
+ */
+
+plugins {
+ kotlin("jvm")
+ id("org.jetbrains.dokka")
+}
diff --git a/dokka-integration-tests/gradle/projects/it-collector-0/moduleA/moduleB/src/main/kotlin/org/jetbrains/dokka/it/moduleB/ModuleB.kt b/dokka-integration-tests/gradle/projects/it-collector-0/moduleA/moduleB/src/main/kotlin/org/jetbrains/dokka/it/moduleB/ModuleB.kt
new file mode 100644
index 00000000..430e2234
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-collector-0/moduleA/moduleB/src/main/kotlin/org/jetbrains/dokka/it/moduleB/ModuleB.kt
@@ -0,0 +1,6 @@
+package org.jetbrains.dokka.it.moduleB
+
+@Suppress("unused")
+class ModuleB {
+ fun undocumentedPublicFunction() {}
+}
diff --git a/dokka-integration-tests/gradle/projects/it-collector-0/moduleA/moduleC/README.md b/dokka-integration-tests/gradle/projects/it-collector-0/moduleA/moduleC/README.md
new file mode 100644
index 00000000..4ead5671
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-collector-0/moduleA/moduleC/README.md
@@ -0,0 +1,2 @@
+# Module moduleC
+Here is some description for module C
diff --git a/dokka-integration-tests/gradle/projects/it-collector-0/moduleA/moduleC/build.gradle.kts b/dokka-integration-tests/gradle/projects/it-collector-0/moduleA/moduleC/build.gradle.kts
new file mode 100644
index 00000000..aa562cde
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-collector-0/moduleA/moduleC/build.gradle.kts
@@ -0,0 +1,8 @@
+/*
+ * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
+ */
+
+plugins {
+ kotlin("jvm")
+ id("org.jetbrains.dokka")
+}
diff --git a/dokka-integration-tests/gradle/projects/it-collector-0/moduleA/moduleC/src/main/kotlin/org/jetbrains/dokka/it/moduleC/ModuleC.kt b/dokka-integration-tests/gradle/projects/it-collector-0/moduleA/moduleC/src/main/kotlin/org/jetbrains/dokka/it/moduleC/ModuleC.kt
new file mode 100644
index 00000000..e14d68e0
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-collector-0/moduleA/moduleC/src/main/kotlin/org/jetbrains/dokka/it/moduleC/ModuleC.kt
@@ -0,0 +1,6 @@
+package org.jetbrains.dokka.it.moduleC
+
+@Suppress("unused")
+class ModuleC {
+ fun undocumentedPublicFunction() {}
+}
diff --git a/dokka-integration-tests/gradle/projects/it-collector-0/settings.gradle.kts b/dokka-integration-tests/gradle/projects/it-collector-0/settings.gradle.kts
new file mode 100644
index 00000000..6ca74d4b
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-collector-0/settings.gradle.kts
@@ -0,0 +1,9 @@
+/*
+ * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
+ */
+
+apply(from = "../template.settings.gradle.kts")
+rootProject.name = "it-collector-0"
+include(":moduleA")
+include(":moduleA:moduleB")
+include(":moduleA:moduleC")
diff --git a/dokka-integration-tests/gradle/projects/it-configuration/README.md b/dokka-integration-tests/gradle/projects/it-configuration/README.md
new file mode 100644
index 00000000..1d5e34bb
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-configuration/README.md
@@ -0,0 +1,5 @@
+# it-configuration
+
+This is an integration test project for checking Dokka's configuration options.
+
+Please see the KDoc for the integration test itself. \ No newline at end of file
diff --git a/dokka-integration-tests/gradle/projects/it-configuration/build.gradle.kts b/dokka-integration-tests/gradle/projects/it-configuration/build.gradle.kts
new file mode 100644
index 00000000..736202bb
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-configuration/build.gradle.kts
@@ -0,0 +1,33 @@
+/*
+ * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
+ */
+
+import org.jetbrains.dokka.gradle.DokkaTask
+import org.jetbrains.dokka.gradle.kotlinSourceSet
+
+plugins {
+ kotlin("jvm")
+ id("org.jetbrains.dokka")
+}
+
+buildscript {
+ dependencies {
+ classpath("org.jetbrains.dokka:dokka-base:${System.getenv("DOKKA_VERSION")}")
+ }
+}
+
+version = "1.9.20-SNAPSHOT"
+
+apply(from = "../template.root.gradle.kts")
+
+tasks.withType<DokkaTask> {
+ moduleName.set("Configuration Test Project")
+ dokkaSourceSets {
+ configureEach {
+ failOnWarning.set(project.getBooleanProperty("fail_on_warning"))
+ reportUndocumented.set(project.getBooleanProperty("report_undocumented"))
+ }
+ }
+}
+
+fun Project.getBooleanProperty(name: String): Boolean = (project.property(name) as String).toBoolean()
diff --git a/dokka-integration-tests/gradle/projects/it-configuration/gradle.properties b/dokka-integration-tests/gradle/projects/it-configuration/gradle.properties
new file mode 100644
index 00000000..f958d9e3
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-configuration/gradle.properties
@@ -0,0 +1,7 @@
+#
+# Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
+#
+
+dokka_it_kotlin_version=1.9.20
+fail_on_warning=false
+report_undocumented=false
diff --git a/dokka-integration-tests/gradle/projects/it-configuration/gradle/wrapper/gradle-wrapper.jar b/dokka-integration-tests/gradle/projects/it-configuration/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 00000000..62d4c053
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-configuration/gradle/wrapper/gradle-wrapper.jar
Binary files differ
diff --git a/dokka-integration-tests/gradle/projects/it-configuration/gradle/wrapper/gradle-wrapper.properties b/dokka-integration-tests/gradle/projects/it-configuration/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 00000000..a434026d
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-configuration/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,9 @@
+#
+# Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
+#
+
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-6.9.2-bin.zip
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
diff --git a/dokka-integration-tests/gradle/projects/it-configuration/gradlew b/dokka-integration-tests/gradle/projects/it-configuration/gradlew
new file mode 100755
index 00000000..fbd7c515
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-configuration/gradlew
@@ -0,0 +1,185 @@
+#!/usr/bin/env sh
+
+#
+# Copyright 2015 the original author or authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+##############################################################################
+##
+## Gradle start up script for UN*X
+##
+##############################################################################
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+ ls=`ls -ld "$PRG"`
+ link=`expr "$ls" : '.*-> \(.*\)$'`
+ if expr "$link" : '/.*' > /dev/null; then
+ PRG="$link"
+ else
+ PRG=`dirname "$PRG"`"/$link"
+ fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn () {
+ echo "$*"
+}
+
+die () {
+ echo
+ echo "$*"
+ echo
+ exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+nonstop=false
+case "`uname`" in
+ CYGWIN* )
+ cygwin=true
+ ;;
+ Darwin* )
+ darwin=true
+ ;;
+ MINGW* )
+ msys=true
+ ;;
+ NONSTOP* )
+ nonstop=true
+ ;;
+esac
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+ if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+ # IBM's JDK on AIX uses strange locations for the executables
+ JAVACMD="$JAVA_HOME/jre/sh/java"
+ else
+ JAVACMD="$JAVA_HOME/bin/java"
+ fi
+ if [ ! -x "$JAVACMD" ] ; then
+ die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+ fi
+else
+ JAVACMD="java"
+ which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
+ MAX_FD_LIMIT=`ulimit -H -n`
+ if [ $? -eq 0 ] ; then
+ if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+ MAX_FD="$MAX_FD_LIMIT"
+ fi
+ ulimit -n $MAX_FD
+ if [ $? -ne 0 ] ; then
+ warn "Could not set maximum file descriptor limit: $MAX_FD"
+ fi
+ else
+ warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+ fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+ GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin or MSYS, switch paths to Windows format before running java
+if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
+ APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+ CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+
+ JAVACMD=`cygpath --unix "$JAVACMD"`
+
+ # We build the pattern for arguments to be converted via cygpath
+ ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+ SEP=""
+ for dir in $ROOTDIRSRAW ; do
+ ROOTDIRS="$ROOTDIRS$SEP$dir"
+ SEP="|"
+ done
+ OURCYGPATTERN="(^($ROOTDIRS))"
+ # Add a user-defined pattern to the cygpath arguments
+ if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+ OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+ fi
+ # Now convert the arguments - kludge to limit ourselves to /bin/sh
+ i=0
+ for arg in "$@" ; do
+ CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+ CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
+
+ if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
+ eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+ else
+ eval `echo args$i`="\"$arg\""
+ fi
+ i=`expr $i + 1`
+ done
+ case $i in
+ 0) set -- ;;
+ 1) set -- "$args0" ;;
+ 2) set -- "$args0" "$args1" ;;
+ 3) set -- "$args0" "$args1" "$args2" ;;
+ 4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+ 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+ 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+ 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+ 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+ 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+ esac
+fi
+
+# Escape application args
+save () {
+ for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
+ echo " "
+}
+APP_ARGS=`save "$@"`
+
+# Collect all arguments for the java command, following the shell quoting and substitution rules
+eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
+
+exec "$JAVACMD" "$@"
diff --git a/dokka-integration-tests/gradle/projects/it-configuration/gradlew.bat b/dokka-integration-tests/gradle/projects/it-configuration/gradlew.bat
new file mode 100644
index 00000000..a9f778a7
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-configuration/gradlew.bat
@@ -0,0 +1,104 @@
+@rem
+@rem Copyright 2015 the original author or authors.
+@rem
+@rem Licensed under the Apache License, Version 2.0 (the "License");
+@rem you may not use this file except in compliance with the License.
+@rem You may obtain a copy of the License at
+@rem
+@rem https://www.apache.org/licenses/LICENSE-2.0
+@rem
+@rem Unless required by applicable law or agreed to in writing, software
+@rem distributed under the License is distributed on an "AS IS" BASIS,
+@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@rem See the License for the specific language governing permissions and
+@rem limitations under the License.
+@rem
+
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Resolve any "." and ".." in APP_HOME to make it shorter.
+for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto init
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto init
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:init
+@rem Get command-line arguments, handling Windows variants
+
+if not "%OS%" == "Windows_NT" goto win9xME_args
+
+:win9xME_args
+@rem Slurp the command line arguments.
+set CMD_LINE_ARGS=
+set _SKIP=2
+
+:win9xME_args_slurp
+if "x%~1" == "x" goto execute
+
+set CMD_LINE_ARGS=%*
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/dokka-integration-tests/gradle/projects/it-configuration/settings.gradle.kts b/dokka-integration-tests/gradle/projects/it-configuration/settings.gradle.kts
new file mode 100644
index 00000000..6bedd2ef
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-configuration/settings.gradle.kts
@@ -0,0 +1,7 @@
+/*
+ * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
+ */
+
+apply(from = "../template.settings.gradle.kts")
+rootProject.name = "it-configuration"
+
diff --git a/dokka-integration-tests/gradle/projects/it-configuration/src/main/kotlin/it/ClassWithUndocumentedDeclarations.kt b/dokka-integration-tests/gradle/projects/it-configuration/src/main/kotlin/it/ClassWithUndocumentedDeclarations.kt
new file mode 100644
index 00000000..04d0cb16
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-configuration/src/main/kotlin/it/ClassWithUndocumentedDeclarations.kt
@@ -0,0 +1,12 @@
+package it
+
+/**
+ * The class itself is documented, but its methods are not
+ *
+ * This can be used to test configuration properties that work with undocumented declarations,
+ * such as `reportUndocumented` and `failOnWarning`
+ */
+class ClassWithUndocumentedDeclarations {
+
+ fun foo() {}
+} \ No newline at end of file
diff --git a/dokka-integration-tests/gradle/projects/it-js-ir-0/build.gradle.kts b/dokka-integration-tests/gradle/projects/it-js-ir-0/build.gradle.kts
new file mode 100644
index 00000000..9746716e
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-js-ir-0/build.gradle.kts
@@ -0,0 +1,25 @@
+/*
+ * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
+ */
+
+plugins {
+ id("org.jetbrains.dokka")
+ kotlin("js")
+}
+
+apply(from = "../template.root.gradle.kts")
+
+kotlin {
+ js(IR) {
+ browser()
+ nodejs()
+ }
+}
+
+dependencies {
+ implementation(npm("is-sorted", "1.0.5"))
+
+ val reactVersion = properties["react_version"]
+ implementation("org.jetbrains.kotlin-wrappers:kotlin-react:$reactVersion")
+ implementation("org.jetbrains.kotlin-wrappers:kotlin-react-dom:$reactVersion")
+}
diff --git a/dokka-integration-tests/gradle/projects/it-js-ir-0/gradle.properties b/dokka-integration-tests/gradle/projects/it-js-ir-0/gradle.properties
new file mode 100644
index 00000000..a7b64215
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-js-ir-0/gradle.properties
@@ -0,0 +1,6 @@
+#
+# Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
+#
+
+dokka_it_kotlin_version=1.9.20
+react_version=18.2.0-pre.467
diff --git a/dokka-integration-tests/gradle/projects/it-js-ir-0/gradle/wrapper/gradle-wrapper.jar b/dokka-integration-tests/gradle/projects/it-js-ir-0/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 00000000..62d4c053
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-js-ir-0/gradle/wrapper/gradle-wrapper.jar
Binary files differ
diff --git a/dokka-integration-tests/gradle/projects/it-js-ir-0/gradle/wrapper/gradle-wrapper.properties b/dokka-integration-tests/gradle/projects/it-js-ir-0/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 00000000..a434026d
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-js-ir-0/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,9 @@
+#
+# Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
+#
+
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-6.9.2-bin.zip
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
diff --git a/dokka-integration-tests/gradle/projects/it-js-ir-0/gradlew b/dokka-integration-tests/gradle/projects/it-js-ir-0/gradlew
new file mode 100755
index 00000000..fbd7c515
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-js-ir-0/gradlew
@@ -0,0 +1,185 @@
+#!/usr/bin/env sh
+
+#
+# Copyright 2015 the original author or authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+##############################################################################
+##
+## Gradle start up script for UN*X
+##
+##############################################################################
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+ ls=`ls -ld "$PRG"`
+ link=`expr "$ls" : '.*-> \(.*\)$'`
+ if expr "$link" : '/.*' > /dev/null; then
+ PRG="$link"
+ else
+ PRG=`dirname "$PRG"`"/$link"
+ fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn () {
+ echo "$*"
+}
+
+die () {
+ echo
+ echo "$*"
+ echo
+ exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+nonstop=false
+case "`uname`" in
+ CYGWIN* )
+ cygwin=true
+ ;;
+ Darwin* )
+ darwin=true
+ ;;
+ MINGW* )
+ msys=true
+ ;;
+ NONSTOP* )
+ nonstop=true
+ ;;
+esac
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+ if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+ # IBM's JDK on AIX uses strange locations for the executables
+ JAVACMD="$JAVA_HOME/jre/sh/java"
+ else
+ JAVACMD="$JAVA_HOME/bin/java"
+ fi
+ if [ ! -x "$JAVACMD" ] ; then
+ die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+ fi
+else
+ JAVACMD="java"
+ which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
+ MAX_FD_LIMIT=`ulimit -H -n`
+ if [ $? -eq 0 ] ; then
+ if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+ MAX_FD="$MAX_FD_LIMIT"
+ fi
+ ulimit -n $MAX_FD
+ if [ $? -ne 0 ] ; then
+ warn "Could not set maximum file descriptor limit: $MAX_FD"
+ fi
+ else
+ warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+ fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+ GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin or MSYS, switch paths to Windows format before running java
+if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
+ APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+ CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+
+ JAVACMD=`cygpath --unix "$JAVACMD"`
+
+ # We build the pattern for arguments to be converted via cygpath
+ ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+ SEP=""
+ for dir in $ROOTDIRSRAW ; do
+ ROOTDIRS="$ROOTDIRS$SEP$dir"
+ SEP="|"
+ done
+ OURCYGPATTERN="(^($ROOTDIRS))"
+ # Add a user-defined pattern to the cygpath arguments
+ if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+ OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+ fi
+ # Now convert the arguments - kludge to limit ourselves to /bin/sh
+ i=0
+ for arg in "$@" ; do
+ CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+ CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
+
+ if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
+ eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+ else
+ eval `echo args$i`="\"$arg\""
+ fi
+ i=`expr $i + 1`
+ done
+ case $i in
+ 0) set -- ;;
+ 1) set -- "$args0" ;;
+ 2) set -- "$args0" "$args1" ;;
+ 3) set -- "$args0" "$args1" "$args2" ;;
+ 4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+ 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+ 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+ 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+ 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+ 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+ esac
+fi
+
+# Escape application args
+save () {
+ for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
+ echo " "
+}
+APP_ARGS=`save "$@"`
+
+# Collect all arguments for the java command, following the shell quoting and substitution rules
+eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
+
+exec "$JAVACMD" "$@"
diff --git a/dokka-integration-tests/gradle/projects/it-js-ir-0/gradlew.bat b/dokka-integration-tests/gradle/projects/it-js-ir-0/gradlew.bat
new file mode 100644
index 00000000..a9f778a7
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-js-ir-0/gradlew.bat
@@ -0,0 +1,104 @@
+@rem
+@rem Copyright 2015 the original author or authors.
+@rem
+@rem Licensed under the Apache License, Version 2.0 (the "License");
+@rem you may not use this file except in compliance with the License.
+@rem You may obtain a copy of the License at
+@rem
+@rem https://www.apache.org/licenses/LICENSE-2.0
+@rem
+@rem Unless required by applicable law or agreed to in writing, software
+@rem distributed under the License is distributed on an "AS IS" BASIS,
+@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@rem See the License for the specific language governing permissions and
+@rem limitations under the License.
+@rem
+
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Resolve any "." and ".." in APP_HOME to make it shorter.
+for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto init
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto init
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:init
+@rem Get command-line arguments, handling Windows variants
+
+if not "%OS%" == "Windows_NT" goto win9xME_args
+
+:win9xME_args
+@rem Slurp the command line arguments.
+set CMD_LINE_ARGS=
+set _SKIP=2
+
+:win9xME_args_slurp
+if "x%~1" == "x" goto execute
+
+set CMD_LINE_ARGS=%*
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/dokka-integration-tests/gradle/projects/it-js-ir-0/settings.gradle.kts b/dokka-integration-tests/gradle/projects/it-js-ir-0/settings.gradle.kts
new file mode 100644
index 00000000..303c1b69
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-js-ir-0/settings.gradle.kts
@@ -0,0 +1,9 @@
+/*
+ * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
+ */
+
+@file:Suppress("LocalVariableName", "UnstableApiUsage")
+
+apply(from = "../template.settings.gradle.kts")
+rootProject.name = "it-js-ir-0"
+
diff --git a/dokka-integration-tests/gradle/projects/it-js-ir-0/src/main/kotlin/RootPackageClass.kt b/dokka-integration-tests/gradle/projects/it-js-ir-0/src/main/kotlin/RootPackageClass.kt
new file mode 100644
index 00000000..cbe6240e
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-js-ir-0/src/main/kotlin/RootPackageClass.kt
@@ -0,0 +1,26 @@
+@file:Suppress("unused")
+
+import org.w3c.dom.url.URLSearchParams
+import org.w3c.dom.HTMLAnchorElement
+import react.dom.html.AnchorHTMLAttributes
+import react.Props
+import react.State
+
+/**
+ * A class that lives inside the root package
+ */
+class RootPackageClass {
+ val description = "I do live in the root package!"
+}
+
+// sample method that uses classes from dom and react, should compile
+fun URLSearchParams.react(props: Props, state: State) {}
+
+fun test(list: MutableList<Int>) = "list"
+
+@JsModule("is-sorted")
+@JsNonModule
+external fun <T> sorted(a: Array<T>): Boolean
+
+// this declaration can be used to check deserialization of dynamic type
+external interface TextLinkProps: AnchorHTMLAttributes<HTMLAnchorElement> \ No newline at end of file
diff --git a/dokka-integration-tests/gradle/projects/it-js-ir-0/src/main/kotlin/it/basic/PublicClass.kt b/dokka-integration-tests/gradle/projects/it-js-ir-0/src/main/kotlin/it/basic/PublicClass.kt
new file mode 100644
index 00000000..fc4b36bd
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-js-ir-0/src/main/kotlin/it/basic/PublicClass.kt
@@ -0,0 +1,53 @@
+@file:Suppress("unused")
+
+package it.basic
+
+import RootPackageClass
+
+/**
+ * This class, unlike [RootPackageClass] is located in a sub-package
+ */
+class PublicClass {
+ /**
+ * This function is public and documented
+ */
+ fun publicDocumentedFunction(): String = ""
+
+ fun publicUndocumentedFunction(): String = ""
+
+ /**
+ * This function is internal and documented
+ */
+ internal fun internalDocumentedFunction(): String = ""
+
+ internal fun internalUndocumentedFunction(): String = ""
+
+ /**
+ * This function is private and documented
+ */
+ private fun privateDocumentedFunction(): String = ""
+
+ private fun privateUndocumentedFunction(): String = ""
+
+
+ /**
+ * This property is public and documented
+ */
+ val publicDocumentedProperty: Int = 0
+
+ val publicUndocumentedProperty: Int = 0
+
+ /**
+ * This property internal and documented
+ */
+ val internalDocumentedProperty: Int = 0
+
+ val internalUndocumentedProperty: Int = 0
+
+ /**
+ * This property private and documented
+ */
+ private val privateDocumentedProperty: Int = 0
+
+ private val privateUndocumentedProperty: Int = 0
+}
diff --git a/dokka-integration-tests/gradle/projects/it-js-ir-0/src/main/kotlin/it/internal/InternalClass.kt b/dokka-integration-tests/gradle/projects/it-js-ir-0/src/main/kotlin/it/internal/InternalClass.kt
new file mode 100644
index 00000000..7d42b978
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-js-ir-0/src/main/kotlin/it/internal/InternalClass.kt
@@ -0,0 +1,7 @@
+package it.internal
+
+/**
+ * §INTERNAL§
+ * This class is internal and should not be rendered
+ */
+internal class InternalClass
diff --git a/dokka-integration-tests/gradle/projects/it-js-ir-0/src/main/kotlin/it/suppressedByPackage/SuppressedByPackage.kt b/dokka-integration-tests/gradle/projects/it-js-ir-0/src/main/kotlin/it/suppressedByPackage/SuppressedByPackage.kt
new file mode 100644
index 00000000..d8dc9cff
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-js-ir-0/src/main/kotlin/it/suppressedByPackage/SuppressedByPackage.kt
@@ -0,0 +1,7 @@
+package it.suppressedByPackage
+
+/**
+ * §SUPPRESSED§
+ * This should not be rendered.
+ */
+class SuppressedByPackage
diff --git a/dokka-integration-tests/gradle/projects/it-js-ir-0/src/main/kotlin/it/suppressedByPath/SuppressedByPath.kt b/dokka-integration-tests/gradle/projects/it-js-ir-0/src/main/kotlin/it/suppressedByPath/SuppressedByPath.kt
new file mode 100644
index 00000000..4dda9da4
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-js-ir-0/src/main/kotlin/it/suppressedByPath/SuppressedByPath.kt
@@ -0,0 +1,7 @@
+package it.suppressedByPath
+
+/**
+ * §SUPPRESSED§
+ * This should not be rendered.
+ */
+class SuppressedByPath
diff --git a/dokka-integration-tests/gradle/projects/it-multimodule-0/build.gradle.kts b/dokka-integration-tests/gradle/projects/it-multimodule-0/build.gradle.kts
new file mode 100644
index 00000000..948e0c3b
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-multimodule-0/build.gradle.kts
@@ -0,0 +1,5 @@
+/*
+ * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
+ */
+
+apply(from = "../template.root.gradle.kts")
diff --git a/dokka-integration-tests/gradle/projects/it-multimodule-0/gradle.properties b/dokka-integration-tests/gradle/projects/it-multimodule-0/gradle.properties
new file mode 100644
index 00000000..5904fc21
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-multimodule-0/gradle.properties
@@ -0,0 +1,5 @@
+#
+# Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
+#
+
+dokka_it_kotlin_version=1.9.20
diff --git a/dokka-integration-tests/gradle/projects/it-multimodule-0/gradle/wrapper/gradle-wrapper.jar b/dokka-integration-tests/gradle/projects/it-multimodule-0/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 00000000..f3d88b1c
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-multimodule-0/gradle/wrapper/gradle-wrapper.jar
Binary files differ
diff --git a/dokka-integration-tests/gradle/projects/it-multimodule-0/gradle/wrapper/gradle-wrapper.properties b/dokka-integration-tests/gradle/projects/it-multimodule-0/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 00000000..a434026d
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-multimodule-0/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,9 @@
+#
+# Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
+#
+
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-6.9.2-bin.zip
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
diff --git a/dokka-integration-tests/gradle/projects/it-multimodule-0/gradlew b/dokka-integration-tests/gradle/projects/it-multimodule-0/gradlew
new file mode 100755
index 00000000..2fe81a7d
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-multimodule-0/gradlew
@@ -0,0 +1,183 @@
+#!/usr/bin/env sh
+
+#
+# Copyright 2015 the original author or authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+##############################################################################
+##
+## Gradle start up script for UN*X
+##
+##############################################################################
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+ ls=`ls -ld "$PRG"`
+ link=`expr "$ls" : '.*-> \(.*\)$'`
+ if expr "$link" : '/.*' > /dev/null; then
+ PRG="$link"
+ else
+ PRG=`dirname "$PRG"`"/$link"
+ fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn () {
+ echo "$*"
+}
+
+die () {
+ echo
+ echo "$*"
+ echo
+ exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+nonstop=false
+case "`uname`" in
+ CYGWIN* )
+ cygwin=true
+ ;;
+ Darwin* )
+ darwin=true
+ ;;
+ MINGW* )
+ msys=true
+ ;;
+ NONSTOP* )
+ nonstop=true
+ ;;
+esac
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+ if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+ # IBM's JDK on AIX uses strange locations for the executables
+ JAVACMD="$JAVA_HOME/jre/sh/java"
+ else
+ JAVACMD="$JAVA_HOME/bin/java"
+ fi
+ if [ ! -x "$JAVACMD" ] ; then
+ die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+ fi
+else
+ JAVACMD="java"
+ which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
+ MAX_FD_LIMIT=`ulimit -H -n`
+ if [ $? -eq 0 ] ; then
+ if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+ MAX_FD="$MAX_FD_LIMIT"
+ fi
+ ulimit -n $MAX_FD
+ if [ $? -ne 0 ] ; then
+ warn "Could not set maximum file descriptor limit: $MAX_FD"
+ fi
+ else
+ warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+ fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+ GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin or MSYS, switch paths to Windows format before running java
+if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
+ APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+ CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+ JAVACMD=`cygpath --unix "$JAVACMD"`
+
+ # We build the pattern for arguments to be converted via cygpath
+ ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+ SEP=""
+ for dir in $ROOTDIRSRAW ; do
+ ROOTDIRS="$ROOTDIRS$SEP$dir"
+ SEP="|"
+ done
+ OURCYGPATTERN="(^($ROOTDIRS))"
+ # Add a user-defined pattern to the cygpath arguments
+ if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+ OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+ fi
+ # Now convert the arguments - kludge to limit ourselves to /bin/sh
+ i=0
+ for arg in "$@" ; do
+ CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+ CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
+
+ if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
+ eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+ else
+ eval `echo args$i`="\"$arg\""
+ fi
+ i=`expr $i + 1`
+ done
+ case $i in
+ 0) set -- ;;
+ 1) set -- "$args0" ;;
+ 2) set -- "$args0" "$args1" ;;
+ 3) set -- "$args0" "$args1" "$args2" ;;
+ 4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+ 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+ 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+ 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+ 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+ 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+ esac
+fi
+
+# Escape application args
+save () {
+ for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
+ echo " "
+}
+APP_ARGS=`save "$@"`
+
+# Collect all arguments for the java command, following the shell quoting and substitution rules
+eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
+
+exec "$JAVACMD" "$@"
diff --git a/dokka-integration-tests/gradle/projects/it-multimodule-0/gradlew.bat b/dokka-integration-tests/gradle/projects/it-multimodule-0/gradlew.bat
new file mode 100644
index 00000000..24467a14
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-multimodule-0/gradlew.bat
@@ -0,0 +1,100 @@
+@rem
+@rem Copyright 2015 the original author or authors.
+@rem
+@rem Licensed under the Apache License, Version 2.0 (the "License");
+@rem you may not use this file except in compliance with the License.
+@rem You may obtain a copy of the License at
+@rem
+@rem https://www.apache.org/licenses/LICENSE-2.0
+@rem
+@rem Unless required by applicable law or agreed to in writing, software
+@rem distributed under the License is distributed on an "AS IS" BASIS,
+@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@rem See the License for the specific language governing permissions and
+@rem limitations under the License.
+@rem
+
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto init
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto init
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:init
+@rem Get command-line arguments, handling Windows variants
+
+if not "%OS%" == "Windows_NT" goto win9xME_args
+
+:win9xME_args
+@rem Slurp the command line arguments.
+set CMD_LINE_ARGS=
+set _SKIP=2
+
+:win9xME_args_slurp
+if "x%~1" == "x" goto execute
+
+set CMD_LINE_ARGS=%*
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/dokka-integration-tests/gradle/projects/it-multimodule-0/moduleA/build.gradle.kts b/dokka-integration-tests/gradle/projects/it-multimodule-0/moduleA/build.gradle.kts
new file mode 100644
index 00000000..a28f73e8
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-multimodule-0/moduleA/build.gradle.kts
@@ -0,0 +1,21 @@
+/*
+ * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
+ */
+
+plugins {
+ // TODO: File bug report for gradle: :moduleA:moduleB:dokkaHtml is missing kotlin gradle plugin from
+ // the runtime classpath during execution without this plugin in the parent project
+ kotlin("jvm")
+ id("org.jetbrains.dokka")
+}
+
+
+allprojects {
+ tasks.withType<org.jetbrains.dokka.gradle.AbstractDokkaTask> {
+ pluginsMapConfiguration.set(
+ mapOf(
+ "org.jetbrains.dokka.base.DokkaBase" to """{ "homepageLink" : "https://github.com/Kotlin/dokka/tree/master/dokka-integration-tests/gradle/projects/it-multimodule-0/" }"""
+ )
+ )
+ }
+}
diff --git a/dokka-integration-tests/gradle/projects/it-multimodule-0/moduleA/moduleB/Module.md b/dokka-integration-tests/gradle/projects/it-multimodule-0/moduleA/moduleB/Module.md
new file mode 100644
index 00000000..0570f467
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-multimodule-0/moduleA/moduleB/Module.md
@@ -0,0 +1,6 @@
+# Module !Module B!
+Here is some description for Module B
+
+Module B: Second paragraph
+# Module moduleB
+§IGNORED$This documentation shall be ignored, because wrong module name§IGNORED$
diff --git a/dokka-integration-tests/gradle/projects/it-multimodule-0/moduleA/moduleB/build.gradle.kts b/dokka-integration-tests/gradle/projects/it-multimodule-0/moduleA/moduleB/build.gradle.kts
new file mode 100644
index 00000000..91ccea29
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-multimodule-0/moduleA/moduleB/build.gradle.kts
@@ -0,0 +1,17 @@
+/*
+ * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
+ */
+
+import org.jetbrains.dokka.gradle.DokkaTask
+
+plugins {
+ kotlin("jvm")
+ id("org.jetbrains.dokka")
+}
+
+tasks.withType<DokkaTask>().configureEach {
+ moduleName.set("!Module B!")
+ dokkaSourceSets.configureEach {
+ includes.from("Module.md")
+ }
+}
diff --git a/dokka-integration-tests/gradle/projects/it-multimodule-0/moduleA/moduleB/src/main/kotlin/org/jetbrains/dokka/it/moduleB/ModuleB.kt b/dokka-integration-tests/gradle/projects/it-multimodule-0/moduleA/moduleB/src/main/kotlin/org/jetbrains/dokka/it/moduleB/ModuleB.kt
new file mode 100644
index 00000000..430e2234
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-multimodule-0/moduleA/moduleB/src/main/kotlin/org/jetbrains/dokka/it/moduleB/ModuleB.kt
@@ -0,0 +1,6 @@
+package org.jetbrains.dokka.it.moduleB
+
+@Suppress("unused")
+class ModuleB {
+ fun undocumentedPublicFunction() {}
+}
diff --git a/dokka-integration-tests/gradle/projects/it-multimodule-0/moduleA/moduleC/Module.md b/dokka-integration-tests/gradle/projects/it-multimodule-0/moduleA/moduleC/Module.md
new file mode 100644
index 00000000..4ead5671
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-multimodule-0/moduleA/moduleC/Module.md
@@ -0,0 +1,2 @@
+# Module moduleC
+Here is some description for module C
diff --git a/dokka-integration-tests/gradle/projects/it-multimodule-0/moduleA/moduleC/build.gradle.kts b/dokka-integration-tests/gradle/projects/it-multimodule-0/moduleA/moduleC/build.gradle.kts
new file mode 100644
index 00000000..6a77c9ed
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-multimodule-0/moduleA/moduleC/build.gradle.kts
@@ -0,0 +1,16 @@
+/*
+ * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
+ */
+
+import org.jetbrains.dokka.gradle.DokkaTask
+
+plugins {
+ kotlin("jvm")
+ id("org.jetbrains.dokka")
+}
+
+tasks.withType<DokkaTask>().configureEach {
+ dokkaSourceSets.configureEach {
+ includes.from("Module.md")
+ }
+}
diff --git a/dokka-integration-tests/gradle/projects/it-multimodule-0/moduleA/moduleC/src/main/kotlin/org/jetbrains/dokka/it/moduleC/ModuleC.kt b/dokka-integration-tests/gradle/projects/it-multimodule-0/moduleA/moduleC/src/main/kotlin/org/jetbrains/dokka/it/moduleC/ModuleC.kt
new file mode 100644
index 00000000..e14d68e0
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-multimodule-0/moduleA/moduleC/src/main/kotlin/org/jetbrains/dokka/it/moduleC/ModuleC.kt
@@ -0,0 +1,6 @@
+package org.jetbrains.dokka.it.moduleC
+
+@Suppress("unused")
+class ModuleC {
+ fun undocumentedPublicFunction() {}
+}
diff --git a/dokka-integration-tests/gradle/projects/it-multimodule-0/moduleA/moduleD/build.gradle.kts b/dokka-integration-tests/gradle/projects/it-multimodule-0/moduleA/moduleD/build.gradle.kts
new file mode 100644
index 00000000..1598ecef
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-multimodule-0/moduleA/moduleD/build.gradle.kts
@@ -0,0 +1,10 @@
+/*
+ * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
+ */
+
+import org.jetbrains.dokka.gradle.DokkaTask
+
+plugins {
+ kotlin("jvm")
+ id("org.jetbrains.dokka")
+}
diff --git a/dokka-integration-tests/gradle/projects/it-multimodule-0/moduleA/moduleD/src/main/kotlin/org/jetbrains/dokka/it/moduleD/ModuleC.kt b/dokka-integration-tests/gradle/projects/it-multimodule-0/moduleA/moduleD/src/main/kotlin/org/jetbrains/dokka/it/moduleD/ModuleC.kt
new file mode 100644
index 00000000..88174d53
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-multimodule-0/moduleA/moduleD/src/main/kotlin/org/jetbrains/dokka/it/moduleD/ModuleC.kt
@@ -0,0 +1,6 @@
+package org.jetbrains.dokka.it.moduleD
+
+@Suppress("unused")
+class ModuleD {
+ fun undocumentedPublicFunction() {}
+}
diff --git a/dokka-integration-tests/gradle/projects/it-multimodule-0/settings.gradle.kts b/dokka-integration-tests/gradle/projects/it-multimodule-0/settings.gradle.kts
new file mode 100644
index 00000000..5e70eee3
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-multimodule-0/settings.gradle.kts
@@ -0,0 +1,10 @@
+/*
+ * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
+ */
+
+apply(from = "../template.settings.gradle.kts")
+rootProject.name = "it-multimodule-0"
+include(":moduleA")
+include(":moduleA:moduleB")
+include(":moduleA:moduleC")
+include(":moduleA:moduleD")
diff --git a/dokka-integration-tests/gradle/projects/it-multimodule-1/build.gradle b/dokka-integration-tests/gradle/projects/it-multimodule-1/build.gradle
new file mode 100644
index 00000000..57d22b79
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-multimodule-1/build.gradle
@@ -0,0 +1,18 @@
+plugins {
+ id 'org.jetbrains.kotlin.jvm'
+ id("org.jetbrains.dokka")
+}
+
+apply from: '../template.root.gradle.kts'
+
+dependencies {
+ implementation "org.jetbrains.kotlin:kotlin-stdlib"
+ implementation project(':first')
+ implementation project(':second')
+}
+
+
+subprojects {
+ apply plugin: 'org.jetbrains.kotlin.jvm'
+ apply plugin: 'org.jetbrains.dokka'
+}
diff --git a/dokka-integration-tests/gradle/projects/it-multimodule-1/first/build.gradle b/dokka-integration-tests/gradle/projects/it-multimodule-1/first/build.gradle
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-multimodule-1/first/build.gradle
diff --git a/dokka-integration-tests/gradle/projects/it-multimodule-1/first/src/main/kotlin/foo/FirstClass.kt b/dokka-integration-tests/gradle/projects/it-multimodule-1/first/src/main/kotlin/foo/FirstClass.kt
new file mode 100644
index 00000000..93f73bf4
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-multimodule-1/first/src/main/kotlin/foo/FirstClass.kt
@@ -0,0 +1,11 @@
+package foo
+
+/**
+ * First class description
+ */
+open class FirstClass{
+ /**
+ * PropertyOne description
+ */
+ val propertyOne: Int = 5
+} \ No newline at end of file
diff --git a/dokka-integration-tests/gradle/projects/it-multimodule-1/first/src/main/kotlin/foo/FirstSubclass.kt b/dokka-integration-tests/gradle/projects/it-multimodule-1/first/src/main/kotlin/foo/FirstSubclass.kt
new file mode 100644
index 00000000..0deb65c0
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-multimodule-1/first/src/main/kotlin/foo/FirstSubclass.kt
@@ -0,0 +1,12 @@
+package foo
+
+/**
+ * Subclass description
+ * @property surname Surname description
+ */
+class FirstSubclass(var surname: String) : FirstClass() {
+ /**
+ * printNewLine description
+ */
+ fun printNewline() = print("\r\n")
+} \ No newline at end of file
diff --git a/dokka-integration-tests/gradle/projects/it-multimodule-1/first/src/main/kotlin/foo/Main.kt b/dokka-integration-tests/gradle/projects/it-multimodule-1/first/src/main/kotlin/foo/Main.kt
new file mode 100644
index 00000000..8c7f58a7
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-multimodule-1/first/src/main/kotlin/foo/Main.kt
@@ -0,0 +1,8 @@
+package foo
+
+/**
+ * Main function
+ */
+fun main(args : Array<String>) {
+ println("Hello, world!")
+} \ No newline at end of file
diff --git a/dokka-integration-tests/gradle/projects/it-multimodule-1/first/src/main/kotlin/noPackage.kt b/dokka-integration-tests/gradle/projects/it-multimodule-1/first/src/main/kotlin/noPackage.kt
new file mode 100644
index 00000000..c41e218f
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-multimodule-1/first/src/main/kotlin/noPackage.kt
@@ -0,0 +1,3 @@
+fun noPackage(): String = "Hello there"
+
+open class NoPackage
diff --git a/dokka-integration-tests/gradle/projects/it-multimodule-1/gradle.properties b/dokka-integration-tests/gradle/projects/it-multimodule-1/gradle.properties
new file mode 100644
index 00000000..5904fc21
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-multimodule-1/gradle.properties
@@ -0,0 +1,5 @@
+#
+# Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
+#
+
+dokka_it_kotlin_version=1.9.20
diff --git a/dokka-integration-tests/gradle/projects/it-multimodule-1/gradle/wrapper/gradle-wrapper.jar b/dokka-integration-tests/gradle/projects/it-multimodule-1/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 00000000..62d4c053
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-multimodule-1/gradle/wrapper/gradle-wrapper.jar
Binary files differ
diff --git a/dokka-integration-tests/gradle/projects/it-multimodule-1/gradle/wrapper/gradle-wrapper.properties b/dokka-integration-tests/gradle/projects/it-multimodule-1/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 00000000..a434026d
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-multimodule-1/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,9 @@
+#
+# Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
+#
+
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-6.9.2-bin.zip
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
diff --git a/dokka-integration-tests/gradle/projects/it-multimodule-1/gradlew b/dokka-integration-tests/gradle/projects/it-multimodule-1/gradlew
new file mode 100755
index 00000000..fbd7c515
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-multimodule-1/gradlew
@@ -0,0 +1,185 @@
+#!/usr/bin/env sh
+
+#
+# Copyright 2015 the original author or authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+##############################################################################
+##
+## Gradle start up script for UN*X
+##
+##############################################################################
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+ ls=`ls -ld "$PRG"`
+ link=`expr "$ls" : '.*-> \(.*\)$'`
+ if expr "$link" : '/.*' > /dev/null; then
+ PRG="$link"
+ else
+ PRG=`dirname "$PRG"`"/$link"
+ fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn () {
+ echo "$*"
+}
+
+die () {
+ echo
+ echo "$*"
+ echo
+ exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+nonstop=false
+case "`uname`" in
+ CYGWIN* )
+ cygwin=true
+ ;;
+ Darwin* )
+ darwin=true
+ ;;
+ MINGW* )
+ msys=true
+ ;;
+ NONSTOP* )
+ nonstop=true
+ ;;
+esac
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+ if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+ # IBM's JDK on AIX uses strange locations for the executables
+ JAVACMD="$JAVA_HOME/jre/sh/java"
+ else
+ JAVACMD="$JAVA_HOME/bin/java"
+ fi
+ if [ ! -x "$JAVACMD" ] ; then
+ die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+ fi
+else
+ JAVACMD="java"
+ which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
+ MAX_FD_LIMIT=`ulimit -H -n`
+ if [ $? -eq 0 ] ; then
+ if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+ MAX_FD="$MAX_FD_LIMIT"
+ fi
+ ulimit -n $MAX_FD
+ if [ $? -ne 0 ] ; then
+ warn "Could not set maximum file descriptor limit: $MAX_FD"
+ fi
+ else
+ warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+ fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+ GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin or MSYS, switch paths to Windows format before running java
+if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
+ APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+ CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+
+ JAVACMD=`cygpath --unix "$JAVACMD"`
+
+ # We build the pattern for arguments to be converted via cygpath
+ ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+ SEP=""
+ for dir in $ROOTDIRSRAW ; do
+ ROOTDIRS="$ROOTDIRS$SEP$dir"
+ SEP="|"
+ done
+ OURCYGPATTERN="(^($ROOTDIRS))"
+ # Add a user-defined pattern to the cygpath arguments
+ if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+ OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+ fi
+ # Now convert the arguments - kludge to limit ourselves to /bin/sh
+ i=0
+ for arg in "$@" ; do
+ CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+ CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
+
+ if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
+ eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+ else
+ eval `echo args$i`="\"$arg\""
+ fi
+ i=`expr $i + 1`
+ done
+ case $i in
+ 0) set -- ;;
+ 1) set -- "$args0" ;;
+ 2) set -- "$args0" "$args1" ;;
+ 3) set -- "$args0" "$args1" "$args2" ;;
+ 4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+ 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+ 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+ 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+ 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+ 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+ esac
+fi
+
+# Escape application args
+save () {
+ for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
+ echo " "
+}
+APP_ARGS=`save "$@"`
+
+# Collect all arguments for the java command, following the shell quoting and substitution rules
+eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
+
+exec "$JAVACMD" "$@"
diff --git a/dokka-integration-tests/gradle/projects/it-multimodule-1/gradlew.bat b/dokka-integration-tests/gradle/projects/it-multimodule-1/gradlew.bat
new file mode 100644
index 00000000..a9f778a7
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-multimodule-1/gradlew.bat
@@ -0,0 +1,104 @@
+@rem
+@rem Copyright 2015 the original author or authors.
+@rem
+@rem Licensed under the Apache License, Version 2.0 (the "License");
+@rem you may not use this file except in compliance with the License.
+@rem You may obtain a copy of the License at
+@rem
+@rem https://www.apache.org/licenses/LICENSE-2.0
+@rem
+@rem Unless required by applicable law or agreed to in writing, software
+@rem distributed under the License is distributed on an "AS IS" BASIS,
+@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@rem See the License for the specific language governing permissions and
+@rem limitations under the License.
+@rem
+
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Resolve any "." and ".." in APP_HOME to make it shorter.
+for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto init
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto init
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:init
+@rem Get command-line arguments, handling Windows variants
+
+if not "%OS%" == "Windows_NT" goto win9xME_args
+
+:win9xME_args
+@rem Slurp the command line arguments.
+set CMD_LINE_ARGS=
+set _SKIP=2
+
+:win9xME_args_slurp
+if "x%~1" == "x" goto execute
+
+set CMD_LINE_ARGS=%*
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/dokka-integration-tests/gradle/projects/it-multimodule-1/second/build.gradle b/dokka-integration-tests/gradle/projects/it-multimodule-1/second/build.gradle
new file mode 100644
index 00000000..2b62f963
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-multimodule-1/second/build.gradle
@@ -0,0 +1,14 @@
+dependencies {
+ implementation project(":first")
+}
+dokkaHtml {
+ dependsOn(":first:dokkaHtml")
+ dokkaSourceSets {
+ "main" {
+ externalDocumentationLink {
+ url.set(new URL("file://" + rootProject.rootDir.toPath().toAbsolutePath().resolve("first/build/dokka/html/")))
+ packageListUrl.set(new URL("file://" + rootProject.rootDir.toPath().toAbsolutePath().resolve("first/build/dokka/html/first/package-list")))
+ }
+ }
+ }
+}
diff --git a/dokka-integration-tests/gradle/projects/it-multimodule-1/second/src/main/kotlin/NoPackageClass.kt b/dokka-integration-tests/gradle/projects/it-multimodule-1/second/src/main/kotlin/NoPackageClass.kt
new file mode 100644
index 00000000..d2f30ef7
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-multimodule-1/second/src/main/kotlin/NoPackageClass.kt
@@ -0,0 +1 @@
+class NoPackageClass : NoPackage()
diff --git a/dokka-integration-tests/gradle/projects/it-multimodule-1/second/src/main/kotlin/bar/SecondClass.kt b/dokka-integration-tests/gradle/projects/it-multimodule-1/second/src/main/kotlin/bar/SecondClass.kt
new file mode 100644
index 00000000..6a0c935e
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-multimodule-1/second/src/main/kotlin/bar/SecondClass.kt
@@ -0,0 +1,21 @@
+package bar
+/**
+ * Second class in second module description [foo.FirstClass]
+ * @author John Doe
+ * @version 0.1.3
+ * @param name Name description text text text.
+*/
+class SecondClass(val name: String) {
+ val firstProperty = "propertystring"
+ /**
+ * Second property in second module description [foo.FirstSubclass]
+ */
+ var secondProperty: String = ""
+ set(value) {
+ println("Second property not set")
+ }
+
+ init {
+ println("InitializerBlock")
+ }
+}
diff --git a/dokka-integration-tests/gradle/projects/it-multimodule-1/second/src/main/kotlin/foo/ThirdClass.kt b/dokka-integration-tests/gradle/projects/it-multimodule-1/second/src/main/kotlin/foo/ThirdClass.kt
new file mode 100644
index 00000000..cc24a6b7
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-multimodule-1/second/src/main/kotlin/foo/ThirdClass.kt
@@ -0,0 +1,11 @@
+package foo
+
+/**
+ * Third class description
+ */
+open class ThirdClass{
+ /**
+ * PropertyOne description
+ */
+ val propertyOne: Int = 5
+} \ No newline at end of file
diff --git a/dokka-integration-tests/gradle/projects/it-multimodule-1/settings.gradle.kts b/dokka-integration-tests/gradle/projects/it-multimodule-1/settings.gradle.kts
new file mode 100644
index 00000000..ced319f2
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-multimodule-1/settings.gradle.kts
@@ -0,0 +1,8 @@
+/*
+ * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
+ */
+
+apply(from = "../template.settings.gradle.kts")
+rootProject.name = "it-multimodule-1"
+include(":first")
+include(":second")
diff --git a/dokka-integration-tests/gradle/projects/it-multimodule-versioning-0/build.gradle b/dokka-integration-tests/gradle/projects/it-multimodule-versioning-0/build.gradle
new file mode 100644
index 00000000..e04e412b
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-multimodule-versioning-0/build.gradle
@@ -0,0 +1,43 @@
+import org.jetbrains.dokka.gradle.DokkaMultiModuleTask
+
+plugins {
+ id 'org.jetbrains.kotlin.jvm'
+ id("org.jetbrains.dokka")
+}
+
+apply from: '../template.root.gradle.kts'
+
+dependencies {
+ implementation "org.jetbrains.kotlin:kotlin-stdlib"
+ dokkaPlugin "org.jetbrains.dokka:versioning-plugin:${System.getenv("DOKKA_VERSION")}"
+}
+
+
+subprojects {
+ apply plugin: 'org.jetbrains.kotlin.jvm'
+ apply plugin: 'org.jetbrains.dokka'
+}
+
+dokkaHtmlMultiModule {
+ pluginsMapConfiguration.set(["org.jetbrains.dokka.versioning.VersioningPlugin": """{ "version": "1.2", "olderVersionsDir": "$projectDir/dokkas" }"""])
+}
+
+tasks.register('dokkaHtmlMultiModuleBaseVersion', DokkaMultiModuleTask){
+ dependencies {
+ dokkaPlugin("org.jetbrains.dokka:all-modules-page-plugin:${System.getenv("DOKKA_VERSION")}")
+ dokkaPlugin("org.jetbrains.dokka:versioning-plugin:${System.getenv("DOKKA_VERSION")}")
+ }
+ outputDirectory.set(file(projectDir.toPath().resolve("dokkas").resolve("1.0")))
+ pluginsMapConfiguration.set(["org.jetbrains.dokka.versioning.VersioningPlugin": """{ "version": "1.0" }"""])
+ addChildTasks([project(":first"), project(":second")], "dokkaHtmlPartial")
+}
+
+tasks.register('dokkaHtmlMultiModuleNextVersion', DokkaMultiModuleTask){
+ dependencies {
+ dokkaPlugin("org.jetbrains.dokka:all-modules-page-plugin:${System.getenv("DOKKA_VERSION")}")
+ dokkaPlugin("org.jetbrains.dokka:versioning-plugin:${System.getenv("DOKKA_VERSION")}")
+ }
+ outputDirectory.set(file(projectDir.toPath().resolve("dokkas").resolve("1.1")))
+ pluginsMapConfiguration.set(["org.jetbrains.dokka.versioning.VersioningPlugin": """{ "version": "1.1", "olderVersionsDir": "$projectDir/dokkas" }"""])
+ addChildTasks([project(":first"), project(":second")], "dokkaHtmlPartial")
+} \ No newline at end of file
diff --git a/dokka-integration-tests/gradle/projects/it-multimodule-versioning-0/first/build.gradle b/dokka-integration-tests/gradle/projects/it-multimodule-versioning-0/first/build.gradle
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-multimodule-versioning-0/first/build.gradle
diff --git a/dokka-integration-tests/gradle/projects/it-multimodule-versioning-0/first/src/main/kotlin/foo/FirstClass.kt b/dokka-integration-tests/gradle/projects/it-multimodule-versioning-0/first/src/main/kotlin/foo/FirstClass.kt
new file mode 100644
index 00000000..93f73bf4
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-multimodule-versioning-0/first/src/main/kotlin/foo/FirstClass.kt
@@ -0,0 +1,11 @@
+package foo
+
+/**
+ * First class description
+ */
+open class FirstClass{
+ /**
+ * PropertyOne description
+ */
+ val propertyOne: Int = 5
+} \ No newline at end of file
diff --git a/dokka-integration-tests/gradle/projects/it-multimodule-versioning-0/gradle.properties b/dokka-integration-tests/gradle/projects/it-multimodule-versioning-0/gradle.properties
new file mode 100644
index 00000000..a8c59753
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-multimodule-versioning-0/gradle.properties
@@ -0,0 +1,6 @@
+#
+# Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
+#
+
+dokka_it_kotlin_version=1.9.20
+
diff --git a/dokka-integration-tests/gradle/projects/it-multimodule-versioning-0/gradle/wrapper/gradle-wrapper.jar b/dokka-integration-tests/gradle/projects/it-multimodule-versioning-0/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 00000000..943f0cbf
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-multimodule-versioning-0/gradle/wrapper/gradle-wrapper.jar
Binary files differ
diff --git a/dokka-integration-tests/gradle/projects/it-multimodule-versioning-0/gradle/wrapper/gradle-wrapper.properties b/dokka-integration-tests/gradle/projects/it-multimodule-versioning-0/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 00000000..cc6c9292
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-multimodule-versioning-0/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,10 @@
+#
+# Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
+#
+
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-bin.zip
+networkTimeout=10000
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
diff --git a/dokka-integration-tests/gradle/projects/it-multimodule-versioning-0/gradlew b/dokka-integration-tests/gradle/projects/it-multimodule-versioning-0/gradlew
new file mode 100755
index 00000000..65dcd68d
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-multimodule-versioning-0/gradlew
@@ -0,0 +1,244 @@
+#!/bin/sh
+
+#
+# Copyright © 2015-2021 the original authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+##############################################################################
+#
+# Gradle start up script for POSIX generated by Gradle.
+#
+# Important for running:
+#
+# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
+# noncompliant, but you have some other compliant shell such as ksh or
+# bash, then to run this script, type that shell name before the whole
+# command line, like:
+#
+# ksh Gradle
+#
+# Busybox and similar reduced shells will NOT work, because this script
+# requires all of these POSIX shell features:
+# * functions;
+# * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
+# «${var#prefix}», «${var%suffix}», and «$( cmd )»;
+# * compound commands having a testable exit status, especially «case»;
+# * various built-in commands including «command», «set», and «ulimit».
+#
+# Important for patching:
+#
+# (2) This script targets any POSIX shell, so it avoids extensions provided
+# by Bash, Ksh, etc; in particular arrays are avoided.
+#
+# The "traditional" practice of packing multiple parameters into a
+# space-separated string is a well documented source of bugs and security
+# problems, so this is (mostly) avoided, by progressively accumulating
+# options in "$@", and eventually passing that to Java.
+#
+# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
+# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
+# see the in-line comments for details.
+#
+# There are tweaks for specific operating systems such as AIX, CygWin,
+# Darwin, MinGW, and NonStop.
+#
+# (3) This script is generated from the Groovy template
+# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
+# within the Gradle project.
+#
+# You can find Gradle at https://github.com/gradle/gradle/.
+#
+##############################################################################
+
+# Attempt to set APP_HOME
+
+# Resolve links: $0 may be a link
+app_path=$0
+
+# Need this for daisy-chained symlinks.
+while
+ APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path
+ [ -h "$app_path" ]
+do
+ ls=$( ls -ld "$app_path" )
+ link=${ls#*' -> '}
+ case $link in #(
+ /*) app_path=$link ;; #(
+ *) app_path=$APP_HOME$link ;;
+ esac
+done
+
+# This is normally unused
+# shellcheck disable=SC2034
+APP_BASE_NAME=${0##*/}
+APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD=maximum
+
+warn () {
+ echo "$*"
+} >&2
+
+die () {
+ echo
+ echo "$*"
+ echo
+ exit 1
+} >&2
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+nonstop=false
+case "$( uname )" in #(
+ CYGWIN* ) cygwin=true ;; #(
+ Darwin* ) darwin=true ;; #(
+ MSYS* | MINGW* ) msys=true ;; #(
+ NONSTOP* ) nonstop=true ;;
+esac
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+ if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+ # IBM's JDK on AIX uses strange locations for the executables
+ JAVACMD=$JAVA_HOME/jre/sh/java
+ else
+ JAVACMD=$JAVA_HOME/bin/java
+ fi
+ if [ ! -x "$JAVACMD" ] ; then
+ die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+ fi
+else
+ JAVACMD=java
+ which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
+ case $MAX_FD in #(
+ max*)
+ # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
+ # shellcheck disable=SC3045
+ MAX_FD=$( ulimit -H -n ) ||
+ warn "Could not query maximum file descriptor limit"
+ esac
+ case $MAX_FD in #(
+ '' | soft) :;; #(
+ *)
+ # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
+ # shellcheck disable=SC3045
+ ulimit -n "$MAX_FD" ||
+ warn "Could not set maximum file descriptor limit to $MAX_FD"
+ esac
+fi
+
+# Collect all arguments for the java command, stacking in reverse order:
+# * args from the command line
+# * the main class name
+# * -classpath
+# * -D...appname settings
+# * --module-path (only if needed)
+# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
+
+# For Cygwin or MSYS, switch paths to Windows format before running java
+if "$cygwin" || "$msys" ; then
+ APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
+ CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
+
+ JAVACMD=$( cygpath --unix "$JAVACMD" )
+
+ # Now convert the arguments - kludge to limit ourselves to /bin/sh
+ for arg do
+ if
+ case $arg in #(
+ -*) false ;; # don't mess with options #(
+ /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath
+ [ -e "$t" ] ;; #(
+ *) false ;;
+ esac
+ then
+ arg=$( cygpath --path --ignore --mixed "$arg" )
+ fi
+ # Roll the args list around exactly as many times as the number of
+ # args, so each arg winds up back in the position where it started, but
+ # possibly modified.
+ #
+ # NB: a `for` loop captures its iteration list before it begins, so
+ # changing the positional parameters here affects neither the number of
+ # iterations, nor the values presented in `arg`.
+ shift # remove old arg
+ set -- "$@" "$arg" # push replacement arg
+ done
+fi
+
+# Collect all arguments for the java command;
+# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of
+# shell script including quotes and variable substitutions, so put them in
+# double quotes to make sure that they get re-expanded; and
+# * put everything else in single quotes, so that it's not re-expanded.
+
+set -- \
+ "-Dorg.gradle.appname=$APP_BASE_NAME" \
+ -classpath "$CLASSPATH" \
+ org.gradle.wrapper.GradleWrapperMain \
+ "$@"
+
+# Stop when "xargs" is not available.
+if ! command -v xargs >/dev/null 2>&1
+then
+ die "xargs is not available"
+fi
+
+# Use "xargs" to parse quoted args.
+#
+# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
+#
+# In Bash we could simply go:
+#
+# readarray ARGS < <( xargs -n1 <<<"$var" ) &&
+# set -- "${ARGS[@]}" "$@"
+#
+# but POSIX shell has neither arrays nor command substitution, so instead we
+# post-process each arg (as a line of input to sed) to backslash-escape any
+# character that might be a shell metacharacter, then use eval to reverse
+# that process (while maintaining the separation between arguments), and wrap
+# the whole thing up as a single "set" statement.
+#
+# This will of course break if any of these variables contains a newline or
+# an unmatched quote.
+#
+
+eval "set -- $(
+ printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
+ xargs -n1 |
+ sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
+ tr '\n' ' '
+ )" '"$@"'
+
+exec "$JAVACMD" "$@"
diff --git a/dokka-integration-tests/gradle/projects/it-multimodule-versioning-0/gradlew.bat b/dokka-integration-tests/gradle/projects/it-multimodule-versioning-0/gradlew.bat
new file mode 100644
index 00000000..6689b85b
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-multimodule-versioning-0/gradlew.bat
@@ -0,0 +1,92 @@
+@rem
+@rem Copyright 2015 the original author or authors.
+@rem
+@rem Licensed under the Apache License, Version 2.0 (the "License");
+@rem you may not use this file except in compliance with the License.
+@rem You may obtain a copy of the License at
+@rem
+@rem https://www.apache.org/licenses/LICENSE-2.0
+@rem
+@rem Unless required by applicable law or agreed to in writing, software
+@rem distributed under the License is distributed on an "AS IS" BASIS,
+@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@rem See the License for the specific language governing permissions and
+@rem limitations under the License.
+@rem
+
+@if "%DEBUG%"=="" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%"=="" set DIRNAME=.
+@rem This is normally unused
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Resolve any "." and ".." in APP_HOME to make it shorter.
+for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if %ERRORLEVEL% equ 0 goto execute
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto execute
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
+
+:end
+@rem End local scope for the variables with windows NT shell
+if %ERRORLEVEL% equ 0 goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+set EXIT_CODE=%ERRORLEVEL%
+if %EXIT_CODE% equ 0 set EXIT_CODE=1
+if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE%
+exit /b %EXIT_CODE%
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/dokka-integration-tests/gradle/projects/it-multimodule-versioning-0/second/build.gradle b/dokka-integration-tests/gradle/projects/it-multimodule-versioning-0/second/build.gradle
new file mode 100644
index 00000000..cf1d1f21
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-multimodule-versioning-0/second/build.gradle
@@ -0,0 +1,3 @@
+dependencies {
+ implementation project(":first")
+}
diff --git a/dokka-integration-tests/gradle/projects/it-multimodule-versioning-0/second/src/main/kotlin/bar/SecondClass.kt b/dokka-integration-tests/gradle/projects/it-multimodule-versioning-0/second/src/main/kotlin/bar/SecondClass.kt
new file mode 100644
index 00000000..6a0c935e
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-multimodule-versioning-0/second/src/main/kotlin/bar/SecondClass.kt
@@ -0,0 +1,21 @@
+package bar
+/**
+ * Second class in second module description [foo.FirstClass]
+ * @author John Doe
+ * @version 0.1.3
+ * @param name Name description text text text.
+*/
+class SecondClass(val name: String) {
+ val firstProperty = "propertystring"
+ /**
+ * Second property in second module description [foo.FirstSubclass]
+ */
+ var secondProperty: String = ""
+ set(value) {
+ println("Second property not set")
+ }
+
+ init {
+ println("InitializerBlock")
+ }
+}
diff --git a/dokka-integration-tests/gradle/projects/it-multimodule-versioning-0/settings.gradle.kts b/dokka-integration-tests/gradle/projects/it-multimodule-versioning-0/settings.gradle.kts
new file mode 100644
index 00000000..fc6f9f91
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-multimodule-versioning-0/settings.gradle.kts
@@ -0,0 +1,8 @@
+/*
+ * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
+ */
+
+apply(from = "../template.settings.gradle.kts")
+rootProject.name = "it-multimodule-versioning-0"
+include(":first")
+include(":second")
diff --git a/dokka-integration-tests/gradle/projects/it-multiplatform-0/build.gradle.kts b/dokka-integration-tests/gradle/projects/it-multiplatform-0/build.gradle.kts
new file mode 100644
index 00000000..a00b4b8d
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-multiplatform-0/build.gradle.kts
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
+ */
+
+import org.jetbrains.dokka.gradle.DokkaTask
+import java.net.URL
+
+plugins {
+ kotlin("multiplatform")
+ id("org.jetbrains.dokka")
+}
+
+apply(from = "../template.root.gradle.kts")
+
+kotlin {
+ jvm()
+ linuxX64("linux")
+ macosX64("macos")
+ js(IR) // Starting with Kotlin 1.9.0, using compiler types LEGACY or BOTH leads to an error.
+ //TODO Add wasm when kx.coroutines will be supported and published into the main repo
+ sourceSets {
+ val commonMain by sourceSets.getting
+ val linuxMain by sourceSets.getting
+ val macosMain by sourceSets.getting
+ val desktopMain by sourceSets.creating {
+ dependsOn(commonMain)
+ linuxMain.dependsOn(this)
+ macosMain.dependsOn(this)
+ }
+ named("commonMain") {
+ dependencies {
+ if (properties["dokka_it_kotlin_version"] in listOf("1.4.32", "1.5.31"))
+ // otherwise for a modern versin of coroutines:
+ // Failed to resolve Kotlin library: project/build/kotlinSourceSetMetadata/commonMain/org.jetbrains.kotlinx-kotlinx-coroutines-core/org.jetbrains.kotlinx-kotlinx-coroutines-core-commonMain.klib
+ implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.9")
+ else
+ implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4")
+ }
+ }
+ }
+}
+
+tasks.withType<DokkaTask>().configureEach {
+ dokkaSourceSets {
+ configureEach {
+ externalDocumentationLink {
+ url.set(URL("https://kotlinlang.org/api/kotlinx.coroutines/"))
+ //packageListUrl.set(URL("https://kotlinlang.org/api/kotlinx.coroutines/package-list"))
+ }
+ }
+ }
+}
diff --git a/dokka-integration-tests/gradle/projects/it-multiplatform-0/gradle.properties b/dokka-integration-tests/gradle/projects/it-multiplatform-0/gradle.properties
new file mode 100644
index 00000000..5904fc21
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-multiplatform-0/gradle.properties
@@ -0,0 +1,5 @@
+#
+# Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
+#
+
+dokka_it_kotlin_version=1.9.20
diff --git a/dokka-integration-tests/gradle/projects/it-multiplatform-0/gradle/wrapper/gradle-wrapper.jar b/dokka-integration-tests/gradle/projects/it-multiplatform-0/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 00000000..f3d88b1c
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-multiplatform-0/gradle/wrapper/gradle-wrapper.jar
Binary files differ
diff --git a/dokka-integration-tests/gradle/projects/it-multiplatform-0/gradle/wrapper/gradle-wrapper.properties b/dokka-integration-tests/gradle/projects/it-multiplatform-0/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 00000000..a434026d
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-multiplatform-0/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,9 @@
+#
+# Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
+#
+
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-6.9.2-bin.zip
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
diff --git a/dokka-integration-tests/gradle/projects/it-multiplatform-0/gradlew b/dokka-integration-tests/gradle/projects/it-multiplatform-0/gradlew
new file mode 100755
index 00000000..2fe81a7d
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-multiplatform-0/gradlew
@@ -0,0 +1,183 @@
+#!/usr/bin/env sh
+
+#
+# Copyright 2015 the original author or authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+##############################################################################
+##
+## Gradle start up script for UN*X
+##
+##############################################################################
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+ ls=`ls -ld "$PRG"`
+ link=`expr "$ls" : '.*-> \(.*\)$'`
+ if expr "$link" : '/.*' > /dev/null; then
+ PRG="$link"
+ else
+ PRG=`dirname "$PRG"`"/$link"
+ fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn () {
+ echo "$*"
+}
+
+die () {
+ echo
+ echo "$*"
+ echo
+ exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+nonstop=false
+case "`uname`" in
+ CYGWIN* )
+ cygwin=true
+ ;;
+ Darwin* )
+ darwin=true
+ ;;
+ MINGW* )
+ msys=true
+ ;;
+ NONSTOP* )
+ nonstop=true
+ ;;
+esac
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+ if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+ # IBM's JDK on AIX uses strange locations for the executables
+ JAVACMD="$JAVA_HOME/jre/sh/java"
+ else
+ JAVACMD="$JAVA_HOME/bin/java"
+ fi
+ if [ ! -x "$JAVACMD" ] ; then
+ die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+ fi
+else
+ JAVACMD="java"
+ which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
+ MAX_FD_LIMIT=`ulimit -H -n`
+ if [ $? -eq 0 ] ; then
+ if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+ MAX_FD="$MAX_FD_LIMIT"
+ fi
+ ulimit -n $MAX_FD
+ if [ $? -ne 0 ] ; then
+ warn "Could not set maximum file descriptor limit: $MAX_FD"
+ fi
+ else
+ warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+ fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+ GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin or MSYS, switch paths to Windows format before running java
+if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
+ APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+ CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+ JAVACMD=`cygpath --unix "$JAVACMD"`
+
+ # We build the pattern for arguments to be converted via cygpath
+ ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+ SEP=""
+ for dir in $ROOTDIRSRAW ; do
+ ROOTDIRS="$ROOTDIRS$SEP$dir"
+ SEP="|"
+ done
+ OURCYGPATTERN="(^($ROOTDIRS))"
+ # Add a user-defined pattern to the cygpath arguments
+ if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+ OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+ fi
+ # Now convert the arguments - kludge to limit ourselves to /bin/sh
+ i=0
+ for arg in "$@" ; do
+ CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+ CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
+
+ if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
+ eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+ else
+ eval `echo args$i`="\"$arg\""
+ fi
+ i=`expr $i + 1`
+ done
+ case $i in
+ 0) set -- ;;
+ 1) set -- "$args0" ;;
+ 2) set -- "$args0" "$args1" ;;
+ 3) set -- "$args0" "$args1" "$args2" ;;
+ 4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+ 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+ 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+ 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+ 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+ 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+ esac
+fi
+
+# Escape application args
+save () {
+ for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
+ echo " "
+}
+APP_ARGS=`save "$@"`
+
+# Collect all arguments for the java command, following the shell quoting and substitution rules
+eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
+
+exec "$JAVACMD" "$@"
diff --git a/dokka-integration-tests/gradle/projects/it-multiplatform-0/gradlew.bat b/dokka-integration-tests/gradle/projects/it-multiplatform-0/gradlew.bat
new file mode 100644
index 00000000..24467a14
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-multiplatform-0/gradlew.bat
@@ -0,0 +1,100 @@
+@rem
+@rem Copyright 2015 the original author or authors.
+@rem
+@rem Licensed under the Apache License, Version 2.0 (the "License");
+@rem you may not use this file except in compliance with the License.
+@rem You may obtain a copy of the License at
+@rem
+@rem https://www.apache.org/licenses/LICENSE-2.0
+@rem
+@rem Unless required by applicable law or agreed to in writing, software
+@rem distributed under the License is distributed on an "AS IS" BASIS,
+@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@rem See the License for the specific language governing permissions and
+@rem limitations under the License.
+@rem
+
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto init
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto init
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:init
+@rem Get command-line arguments, handling Windows variants
+
+if not "%OS%" == "Windows_NT" goto win9xME_args
+
+:win9xME_args
+@rem Slurp the command line arguments.
+set CMD_LINE_ARGS=
+set _SKIP=2
+
+:win9xME_args_slurp
+if "x%~1" == "x" goto execute
+
+set CMD_LINE_ARGS=%*
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/dokka-integration-tests/gradle/projects/it-multiplatform-0/settings.gradle.kts b/dokka-integration-tests/gradle/projects/it-multiplatform-0/settings.gradle.kts
new file mode 100644
index 00000000..0f1c3d6c
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-multiplatform-0/settings.gradle.kts
@@ -0,0 +1,6 @@
+/*
+ * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
+ */
+
+apply(from = "../template.settings.gradle.kts")
+rootProject.name = "it-multiplatform-0"
diff --git a/dokka-integration-tests/gradle/projects/it-multiplatform-0/src/commonMain/kotlin/it/mpp0/CommonMainClass.kt b/dokka-integration-tests/gradle/projects/it-multiplatform-0/src/commonMain/kotlin/it/mpp0/CommonMainClass.kt
new file mode 100644
index 00000000..499a4f1e
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-multiplatform-0/src/commonMain/kotlin/it/mpp0/CommonMainClass.kt
@@ -0,0 +1,8 @@
+package it.mpp0
+
+/**
+ * This class is defined in commonMain
+ */
+class CommonMainClass {
+ fun publicFunction(): String = "public"
+}
diff --git a/dokka-integration-tests/gradle/projects/it-multiplatform-0/src/commonMain/kotlin/it/mpp0/ExpectedClass.kt b/dokka-integration-tests/gradle/projects/it-multiplatform-0/src/commonMain/kotlin/it/mpp0/ExpectedClass.kt
new file mode 100644
index 00000000..e610b09a
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-multiplatform-0/src/commonMain/kotlin/it/mpp0/ExpectedClass.kt
@@ -0,0 +1,5 @@
+package it.mpp0
+
+expect class ExpectedClass {
+ val platform: String
+}
diff --git a/dokka-integration-tests/gradle/projects/it-multiplatform-0/src/commonMain/kotlin/it/mpp0/coroutines.kt b/dokka-integration-tests/gradle/projects/it-multiplatform-0/src/commonMain/kotlin/it/mpp0/coroutines.kt
new file mode 100644
index 00000000..8eee326f
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-multiplatform-0/src/commonMain/kotlin/it/mpp0/coroutines.kt
@@ -0,0 +1,5 @@
+package it.mpp0
+
+import kotlinx.coroutines.CoroutineScope
+
+expect fun <T> CoroutineScope.runBlocking(block: suspend () -> T) : T
diff --git a/dokka-integration-tests/gradle/projects/it-multiplatform-0/src/desktopMain/kotlin/it/mpp0/CPointerExtension.kt b/dokka-integration-tests/gradle/projects/it-multiplatform-0/src/desktopMain/kotlin/it/mpp0/CPointerExtension.kt
new file mode 100644
index 00000000..342a749e
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-multiplatform-0/src/desktopMain/kotlin/it/mpp0/CPointerExtension.kt
@@ -0,0 +1,11 @@
+package it.mpp0
+
+import kotlinx.cinterop.CPointed
+import kotlinx.cinterop.CPointer
+
+/**
+ * Will print the raw value
+ */
+fun CPointer<CPointed>.customExtension() {
+ println(this.rawValue)
+}
diff --git a/dokka-integration-tests/gradle/projects/it-multiplatform-0/src/desktopMain/kotlin/it/mpp0/ExpectedClass.kt b/dokka-integration-tests/gradle/projects/it-multiplatform-0/src/desktopMain/kotlin/it/mpp0/ExpectedClass.kt
new file mode 100644
index 00000000..19070a96
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-multiplatform-0/src/desktopMain/kotlin/it/mpp0/ExpectedClass.kt
@@ -0,0 +1,5 @@
+package it.mpp0
+
+actual class ExpectedClass {
+ actual val platform: String = "linux"
+}
diff --git a/dokka-integration-tests/gradle/projects/it-multiplatform-0/src/jsMain/kotlin/it/mpp0/ExpectedClass.kt b/dokka-integration-tests/gradle/projects/it-multiplatform-0/src/jsMain/kotlin/it/mpp0/ExpectedClass.kt
new file mode 100644
index 00000000..1e4a6d22
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-multiplatform-0/src/jsMain/kotlin/it/mpp0/ExpectedClass.kt
@@ -0,0 +1,5 @@
+package it.mpp0
+
+actual class ExpectedClass {
+ actual val platform: String = "js"
+}
diff --git a/dokka-integration-tests/gradle/projects/it-multiplatform-0/src/jsMain/kotlin/it/mpp0/runBlocking.kt b/dokka-integration-tests/gradle/projects/it-multiplatform-0/src/jsMain/kotlin/it/mpp0/runBlocking.kt
new file mode 100644
index 00000000..03b3b0ea
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-multiplatform-0/src/jsMain/kotlin/it/mpp0/runBlocking.kt
@@ -0,0 +1,7 @@
+package it.mpp0
+
+import kotlinx.coroutines.CoroutineScope
+
+actual fun <T> CoroutineScope.runBlocking(block: suspend () -> T): T {
+ TODO("Not yet implemented")
+}
diff --git a/dokka-integration-tests/gradle/projects/it-multiplatform-0/src/jvmMain/kotlin/it/mpp0/ExpectedClass.kt b/dokka-integration-tests/gradle/projects/it-multiplatform-0/src/jvmMain/kotlin/it/mpp0/ExpectedClass.kt
new file mode 100644
index 00000000..6de30de6
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-multiplatform-0/src/jvmMain/kotlin/it/mpp0/ExpectedClass.kt
@@ -0,0 +1,11 @@
+package it.mpp0
+
+actual class ExpectedClass {
+ actual val platform: String = "jvm"
+
+ /**
+ * This function can only be used by JVM consumers
+ */
+ fun jvmOnlyFunction() = Unit
+
+}
diff --git a/dokka-integration-tests/gradle/projects/it-multiplatform-0/src/jvmMain/kotlin/it/mpp0/JvmOnlyClass.kt b/dokka-integration-tests/gradle/projects/it-multiplatform-0/src/jvmMain/kotlin/it/mpp0/JvmOnlyClass.kt
new file mode 100644
index 00000000..21101a89
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-multiplatform-0/src/jvmMain/kotlin/it/mpp0/JvmOnlyClass.kt
@@ -0,0 +1,13 @@
+@file:Suppress("unused")
+
+package it.mpp0
+
+/**
+ * This class can only be used by JVM consumers
+ */
+class JvmOnlyClass {
+ /**
+ * This function can only be used by JVM consumers
+ */
+ fun myJvm() = println("HI")
+}
diff --git a/dokka-integration-tests/gradle/projects/it-multiplatform-0/src/jvmMain/kotlin/it/mpp0/runBlocking.kt b/dokka-integration-tests/gradle/projects/it-multiplatform-0/src/jvmMain/kotlin/it/mpp0/runBlocking.kt
new file mode 100644
index 00000000..03b3b0ea
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-multiplatform-0/src/jvmMain/kotlin/it/mpp0/runBlocking.kt
@@ -0,0 +1,7 @@
+package it.mpp0
+
+import kotlinx.coroutines.CoroutineScope
+
+actual fun <T> CoroutineScope.runBlocking(block: suspend () -> T): T {
+ TODO("Not yet implemented")
+}
diff --git a/dokka-integration-tests/gradle/projects/it-multiplatform-0/src/linuxMain/kotlin/it/mpp0/CPointerExtension.kt b/dokka-integration-tests/gradle/projects/it-multiplatform-0/src/linuxMain/kotlin/it/mpp0/CPointerExtension.kt
new file mode 100644
index 00000000..342a749e
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-multiplatform-0/src/linuxMain/kotlin/it/mpp0/CPointerExtension.kt
@@ -0,0 +1,11 @@
+package it.mpp0
+
+import kotlinx.cinterop.CPointed
+import kotlinx.cinterop.CPointer
+
+/**
+ * Will print the raw value
+ */
+fun CPointer<CPointed>.customExtension() {
+ println(this.rawValue)
+}
diff --git a/dokka-integration-tests/gradle/projects/it-multiplatform-0/src/linuxMain/kotlin/it/mpp0/ExpectedClass.kt b/dokka-integration-tests/gradle/projects/it-multiplatform-0/src/linuxMain/kotlin/it/mpp0/ExpectedClass.kt
new file mode 100644
index 00000000..19070a96
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-multiplatform-0/src/linuxMain/kotlin/it/mpp0/ExpectedClass.kt
@@ -0,0 +1,5 @@
+package it.mpp0
+
+actual class ExpectedClass {
+ actual val platform: String = "linux"
+}
diff --git a/dokka-integration-tests/gradle/projects/it-multiplatform-0/src/linuxMain/kotlin/it/mpp0/runBlocking.kt b/dokka-integration-tests/gradle/projects/it-multiplatform-0/src/linuxMain/kotlin/it/mpp0/runBlocking.kt
new file mode 100644
index 00000000..b56fb80a
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-multiplatform-0/src/linuxMain/kotlin/it/mpp0/runBlocking.kt
@@ -0,0 +1,13 @@
+package it.mpp0
+
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.Deferred
+import kotlinx.coroutines.async
+
+actual fun <T> CoroutineScope.runBlocking(block: suspend () -> T): T {
+ TODO("Not yet implemented")
+}
+
+fun <T> CoroutineScope.customAsync(block: suspend () -> T): Deferred<T> {
+ return async { block() }
+}
diff --git a/dokka-integration-tests/gradle/projects/it-multiplatform-0/src/macosMain/kotlin/it/mpp0/ExpectedClass.kt b/dokka-integration-tests/gradle/projects/it-multiplatform-0/src/macosMain/kotlin/it/mpp0/ExpectedClass.kt
new file mode 100644
index 00000000..7a4a8f75
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-multiplatform-0/src/macosMain/kotlin/it/mpp0/ExpectedClass.kt
@@ -0,0 +1,5 @@
+package it.mpp0
+
+actual class ExpectedClass {
+ actual val platform: String = "macos"
+}
diff --git a/dokka-integration-tests/gradle/projects/it-multiplatform-0/src/macosMain/kotlin/it/mpp0/runBlocking.kt b/dokka-integration-tests/gradle/projects/it-multiplatform-0/src/macosMain/kotlin/it/mpp0/runBlocking.kt
new file mode 100644
index 00000000..03b3b0ea
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-multiplatform-0/src/macosMain/kotlin/it/mpp0/runBlocking.kt
@@ -0,0 +1,7 @@
+package it.mpp0
+
+import kotlinx.coroutines.CoroutineScope
+
+actual fun <T> CoroutineScope.runBlocking(block: suspend () -> T): T {
+ TODO("Not yet implemented")
+}
diff --git a/dokka-integration-tests/gradle/projects/it-sequential-tasks-execution-stress/build.gradle.kts b/dokka-integration-tests/gradle/projects/it-sequential-tasks-execution-stress/build.gradle.kts
new file mode 100644
index 00000000..8ef23d4b
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-sequential-tasks-execution-stress/build.gradle.kts
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
+ */
+
+import org.jetbrains.dokka.gradle.DokkaTask
+import org.jetbrains.dokka.gradle.kotlinSourceSet
+import org.jetbrains.dokka.base.DokkaBase
+import org.jetbrains.dokka.base.DokkaBaseConfiguration
+import org.jetbrains.dokka.DokkaConfiguration
+import java.net.URL
+
+plugins {
+ kotlin("jvm")
+ id("org.jetbrains.dokka")
+}
+
+buildscript {
+ dependencies {
+ classpath("org.jetbrains.dokka:dokka-base:${System.getenv("DOKKA_VERSION")}")
+ }
+}
+
+apply(from = "../template.root.gradle.kts")
+
+fun createTask(name: String) {
+ tasks.register(name, org.jetbrains.dokka.gradle.DokkaTask::class) {
+ dokkaSourceSets {
+ moduleName.set("Some example")
+ register("kotlin-stdlib-common") {
+ sourceRoots.from("src/main/java")
+ sourceRoots.from("src/main/kotlin")
+ samples.from("src/main/kotlin")
+ }
+ }
+ }
+}
+
+task("runTasks") {
+ val taskNumber = (properties["task_number"] as String).toInt()
+ repeat(taskNumber) { i ->
+ createTask("task_"+i)
+ dependsOn ("task_"+i)
+ }
+}
diff --git a/dokka-integration-tests/gradle/projects/it-sequential-tasks-execution-stress/gradle.properties b/dokka-integration-tests/gradle/projects/it-sequential-tasks-execution-stress/gradle.properties
new file mode 100644
index 00000000..c49881b9
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-sequential-tasks-execution-stress/gradle.properties
@@ -0,0 +1,6 @@
+#
+# Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
+#
+
+dokka_it_kotlin_version=1.9.20
+task_number=100
diff --git a/dokka-integration-tests/gradle/projects/it-sequential-tasks-execution-stress/gradle/wrapper/gradle-wrapper.jar b/dokka-integration-tests/gradle/projects/it-sequential-tasks-execution-stress/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 00000000..62d4c053
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-sequential-tasks-execution-stress/gradle/wrapper/gradle-wrapper.jar
Binary files differ
diff --git a/dokka-integration-tests/gradle/projects/it-sequential-tasks-execution-stress/gradle/wrapper/gradle-wrapper.properties b/dokka-integration-tests/gradle/projects/it-sequential-tasks-execution-stress/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 00000000..a434026d
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-sequential-tasks-execution-stress/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,9 @@
+#
+# Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
+#
+
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-6.9.2-bin.zip
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
diff --git a/dokka-integration-tests/gradle/projects/it-sequential-tasks-execution-stress/gradlew b/dokka-integration-tests/gradle/projects/it-sequential-tasks-execution-stress/gradlew
new file mode 100755
index 00000000..fbd7c515
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-sequential-tasks-execution-stress/gradlew
@@ -0,0 +1,185 @@
+#!/usr/bin/env sh
+
+#
+# Copyright 2015 the original author or authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+##############################################################################
+##
+## Gradle start up script for UN*X
+##
+##############################################################################
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+ ls=`ls -ld "$PRG"`
+ link=`expr "$ls" : '.*-> \(.*\)$'`
+ if expr "$link" : '/.*' > /dev/null; then
+ PRG="$link"
+ else
+ PRG=`dirname "$PRG"`"/$link"
+ fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn () {
+ echo "$*"
+}
+
+die () {
+ echo
+ echo "$*"
+ echo
+ exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+nonstop=false
+case "`uname`" in
+ CYGWIN* )
+ cygwin=true
+ ;;
+ Darwin* )
+ darwin=true
+ ;;
+ MINGW* )
+ msys=true
+ ;;
+ NONSTOP* )
+ nonstop=true
+ ;;
+esac
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+ if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+ # IBM's JDK on AIX uses strange locations for the executables
+ JAVACMD="$JAVA_HOME/jre/sh/java"
+ else
+ JAVACMD="$JAVA_HOME/bin/java"
+ fi
+ if [ ! -x "$JAVACMD" ] ; then
+ die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+ fi
+else
+ JAVACMD="java"
+ which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
+ MAX_FD_LIMIT=`ulimit -H -n`
+ if [ $? -eq 0 ] ; then
+ if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+ MAX_FD="$MAX_FD_LIMIT"
+ fi
+ ulimit -n $MAX_FD
+ if [ $? -ne 0 ] ; then
+ warn "Could not set maximum file descriptor limit: $MAX_FD"
+ fi
+ else
+ warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+ fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+ GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin or MSYS, switch paths to Windows format before running java
+if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
+ APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+ CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+
+ JAVACMD=`cygpath --unix "$JAVACMD"`
+
+ # We build the pattern for arguments to be converted via cygpath
+ ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+ SEP=""
+ for dir in $ROOTDIRSRAW ; do
+ ROOTDIRS="$ROOTDIRS$SEP$dir"
+ SEP="|"
+ done
+ OURCYGPATTERN="(^($ROOTDIRS))"
+ # Add a user-defined pattern to the cygpath arguments
+ if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+ OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+ fi
+ # Now convert the arguments - kludge to limit ourselves to /bin/sh
+ i=0
+ for arg in "$@" ; do
+ CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+ CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
+
+ if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
+ eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+ else
+ eval `echo args$i`="\"$arg\""
+ fi
+ i=`expr $i + 1`
+ done
+ case $i in
+ 0) set -- ;;
+ 1) set -- "$args0" ;;
+ 2) set -- "$args0" "$args1" ;;
+ 3) set -- "$args0" "$args1" "$args2" ;;
+ 4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+ 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+ 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+ 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+ 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+ 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+ esac
+fi
+
+# Escape application args
+save () {
+ for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
+ echo " "
+}
+APP_ARGS=`save "$@"`
+
+# Collect all arguments for the java command, following the shell quoting and substitution rules
+eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
+
+exec "$JAVACMD" "$@"
diff --git a/dokka-integration-tests/gradle/projects/it-sequential-tasks-execution-stress/gradlew.bat b/dokka-integration-tests/gradle/projects/it-sequential-tasks-execution-stress/gradlew.bat
new file mode 100644
index 00000000..a9f778a7
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-sequential-tasks-execution-stress/gradlew.bat
@@ -0,0 +1,104 @@
+@rem
+@rem Copyright 2015 the original author or authors.
+@rem
+@rem Licensed under the Apache License, Version 2.0 (the "License");
+@rem you may not use this file except in compliance with the License.
+@rem You may obtain a copy of the License at
+@rem
+@rem https://www.apache.org/licenses/LICENSE-2.0
+@rem
+@rem Unless required by applicable law or agreed to in writing, software
+@rem distributed under the License is distributed on an "AS IS" BASIS,
+@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@rem See the License for the specific language governing permissions and
+@rem limitations under the License.
+@rem
+
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Resolve any "." and ".." in APP_HOME to make it shorter.
+for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto init
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto init
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:init
+@rem Get command-line arguments, handling Windows variants
+
+if not "%OS%" == "Windows_NT" goto win9xME_args
+
+:win9xME_args
+@rem Slurp the command line arguments.
+set CMD_LINE_ARGS=
+set _SKIP=2
+
+:win9xME_args_slurp
+if "x%~1" == "x" goto execute
+
+set CMD_LINE_ARGS=%*
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/dokka-integration-tests/gradle/projects/it-sequential-tasks-execution-stress/settings.gradle.kts b/dokka-integration-tests/gradle/projects/it-sequential-tasks-execution-stress/settings.gradle.kts
new file mode 100644
index 00000000..91c4c2f2
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-sequential-tasks-execution-stress/settings.gradle.kts
@@ -0,0 +1,9 @@
+/*
+ * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
+ */
+
+@file:Suppress("LocalVariableName", "UnstableApiUsage")
+
+apply(from = "../template.settings.gradle.kts")
+rootProject.name = "it-sequential-tasks-execution-stress"
+
diff --git a/dokka-integration-tests/gradle/projects/it-sequential-tasks-execution-stress/src/main/java/it/basic/java/SampleJavaClass.java b/dokka-integration-tests/gradle/projects/it-sequential-tasks-execution-stress/src/main/java/it/basic/java/SampleJavaClass.java
new file mode 100644
index 00000000..23b0202c
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-sequential-tasks-execution-stress/src/main/java/it/basic/java/SampleJavaClass.java
@@ -0,0 +1,17 @@
+package it.basic.java;
+
+import it.basic.PublicClass;
+
+/**
+ * This class is, unlike {@link PublicClass}, written in Java
+ */
+@SuppressWarnings("unused")
+public class SampleJavaClass {
+
+ /**
+ * @return Empty instance of {@link PublicClass}
+ */
+ public PublicClass publicDocumentedFunction() {
+ return new PublicClass();
+ }
+}
diff --git a/dokka-integration-tests/gradle/projects/it-sequential-tasks-execution-stress/src/main/kotlin/RootPackageClass.kt b/dokka-integration-tests/gradle/projects/it-sequential-tasks-execution-stress/src/main/kotlin/RootPackageClass.kt
new file mode 100644
index 00000000..8ff6c750
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-sequential-tasks-execution-stress/src/main/kotlin/RootPackageClass.kt
@@ -0,0 +1,8 @@
+@file:Suppress("unused")
+
+/**
+ * A class that lives inside the root package
+ */
+class RootPackageClass {
+ val description = "I do live in the root package!"
+}
diff --git a/dokka-integration-tests/gradle/projects/it-wasm-basic/build.gradle.kts b/dokka-integration-tests/gradle/projects/it-wasm-basic/build.gradle.kts
new file mode 100644
index 00000000..251d1b8f
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-wasm-basic/build.gradle.kts
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
+ */
+
+import org.jetbrains.dokka.gradle.DokkaTask
+import java.net.URL
+
+plugins {
+ kotlin("multiplatform")
+ id("org.jetbrains.dokka")
+}
+
+apply(from = "../template.root.gradle.kts")
+
+repositories {
+ // Remove it when wasm target will be published into public maven repository
+ maven("https://maven.pkg.jetbrains.space/kotlin/p/wasm/experimental")
+}
+
+kotlin {
+ wasm()
+ sourceSets {
+ val wasmMain by getting {
+ dependencies {
+ implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4-wasm1")
+ implementation("org.jetbrains.kotlinx:atomicfu-wasm:0.18.5-wasm1")
+ }
+ }
+ }
+}
+
+tasks.withType<DokkaTask>().configureEach {
+ dokkaSourceSets {
+ configureEach {
+ externalDocumentationLink {
+ url.set(URL("https://kotlinlang.org/api/kotlinx.coroutines/"))
+ }
+ }
+ }
+}
+
+// HACK: some dependencies (coroutines -wasm0 and atomicfu -wasm0) reference deleted *-dev libs
+configurations.all {
+ val conf = this
+ resolutionStrategy.eachDependency {
+ if (requested.version == "1.8.20-dev-3308") {
+ println("Substitute deleted version ${requested.module}:${requested.version} for ${conf.name}")
+ useVersion(project.properties["dokka_it_kotlin_version"] as String)
+ }
+ }
+}
diff --git a/dokka-integration-tests/gradle/projects/it-wasm-basic/gradle.properties b/dokka-integration-tests/gradle/projects/it-wasm-basic/gradle.properties
new file mode 100644
index 00000000..5904fc21
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-wasm-basic/gradle.properties
@@ -0,0 +1,5 @@
+#
+# Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
+#
+
+dokka_it_kotlin_version=1.9.20
diff --git a/dokka-integration-tests/gradle/projects/it-wasm-basic/gradle/wrapper/gradle-wrapper.jar b/dokka-integration-tests/gradle/projects/it-wasm-basic/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 00000000..f3d88b1c
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-wasm-basic/gradle/wrapper/gradle-wrapper.jar
Binary files differ
diff --git a/dokka-integration-tests/gradle/projects/it-wasm-basic/gradle/wrapper/gradle-wrapper.properties b/dokka-integration-tests/gradle/projects/it-wasm-basic/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 00000000..a434026d
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-wasm-basic/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,9 @@
+#
+# Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
+#
+
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-6.9.2-bin.zip
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
diff --git a/dokka-integration-tests/gradle/projects/it-wasm-basic/gradlew b/dokka-integration-tests/gradle/projects/it-wasm-basic/gradlew
new file mode 100755
index 00000000..2fe81a7d
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-wasm-basic/gradlew
@@ -0,0 +1,183 @@
+#!/usr/bin/env sh
+
+#
+# Copyright 2015 the original author or authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+##############################################################################
+##
+## Gradle start up script for UN*X
+##
+##############################################################################
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+ ls=`ls -ld "$PRG"`
+ link=`expr "$ls" : '.*-> \(.*\)$'`
+ if expr "$link" : '/.*' > /dev/null; then
+ PRG="$link"
+ else
+ PRG=`dirname "$PRG"`"/$link"
+ fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn () {
+ echo "$*"
+}
+
+die () {
+ echo
+ echo "$*"
+ echo
+ exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+nonstop=false
+case "`uname`" in
+ CYGWIN* )
+ cygwin=true
+ ;;
+ Darwin* )
+ darwin=true
+ ;;
+ MINGW* )
+ msys=true
+ ;;
+ NONSTOP* )
+ nonstop=true
+ ;;
+esac
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+ if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+ # IBM's JDK on AIX uses strange locations for the executables
+ JAVACMD="$JAVA_HOME/jre/sh/java"
+ else
+ JAVACMD="$JAVA_HOME/bin/java"
+ fi
+ if [ ! -x "$JAVACMD" ] ; then
+ die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+ fi
+else
+ JAVACMD="java"
+ which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
+ MAX_FD_LIMIT=`ulimit -H -n`
+ if [ $? -eq 0 ] ; then
+ if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+ MAX_FD="$MAX_FD_LIMIT"
+ fi
+ ulimit -n $MAX_FD
+ if [ $? -ne 0 ] ; then
+ warn "Could not set maximum file descriptor limit: $MAX_FD"
+ fi
+ else
+ warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+ fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+ GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin or MSYS, switch paths to Windows format before running java
+if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
+ APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+ CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+ JAVACMD=`cygpath --unix "$JAVACMD"`
+
+ # We build the pattern for arguments to be converted via cygpath
+ ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+ SEP=""
+ for dir in $ROOTDIRSRAW ; do
+ ROOTDIRS="$ROOTDIRS$SEP$dir"
+ SEP="|"
+ done
+ OURCYGPATTERN="(^($ROOTDIRS))"
+ # Add a user-defined pattern to the cygpath arguments
+ if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+ OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+ fi
+ # Now convert the arguments - kludge to limit ourselves to /bin/sh
+ i=0
+ for arg in "$@" ; do
+ CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+ CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
+
+ if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
+ eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+ else
+ eval `echo args$i`="\"$arg\""
+ fi
+ i=`expr $i + 1`
+ done
+ case $i in
+ 0) set -- ;;
+ 1) set -- "$args0" ;;
+ 2) set -- "$args0" "$args1" ;;
+ 3) set -- "$args0" "$args1" "$args2" ;;
+ 4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+ 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+ 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+ 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+ 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+ 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+ esac
+fi
+
+# Escape application args
+save () {
+ for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
+ echo " "
+}
+APP_ARGS=`save "$@"`
+
+# Collect all arguments for the java command, following the shell quoting and substitution rules
+eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
+
+exec "$JAVACMD" "$@"
diff --git a/dokka-integration-tests/gradle/projects/it-wasm-basic/gradlew.bat b/dokka-integration-tests/gradle/projects/it-wasm-basic/gradlew.bat
new file mode 100644
index 00000000..24467a14
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-wasm-basic/gradlew.bat
@@ -0,0 +1,100 @@
+@rem
+@rem Copyright 2015 the original author or authors.
+@rem
+@rem Licensed under the Apache License, Version 2.0 (the "License");
+@rem you may not use this file except in compliance with the License.
+@rem You may obtain a copy of the License at
+@rem
+@rem https://www.apache.org/licenses/LICENSE-2.0
+@rem
+@rem Unless required by applicable law or agreed to in writing, software
+@rem distributed under the License is distributed on an "AS IS" BASIS,
+@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@rem See the License for the specific language governing permissions and
+@rem limitations under the License.
+@rem
+
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto init
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto init
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:init
+@rem Get command-line arguments, handling Windows variants
+
+if not "%OS%" == "Windows_NT" goto win9xME_args
+
+:win9xME_args
+@rem Slurp the command line arguments.
+set CMD_LINE_ARGS=
+set _SKIP=2
+
+:win9xME_args_slurp
+if "x%~1" == "x" goto execute
+
+set CMD_LINE_ARGS=%*
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/dokka-integration-tests/gradle/projects/it-wasm-basic/settings.gradle.kts b/dokka-integration-tests/gradle/projects/it-wasm-basic/settings.gradle.kts
new file mode 100644
index 00000000..053fcdba
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-wasm-basic/settings.gradle.kts
@@ -0,0 +1,6 @@
+/*
+ * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
+ */
+
+apply(from = "../template.settings.gradle.kts")
+rootProject.name = "it-wasm-basic"
diff --git a/dokka-integration-tests/gradle/projects/it-wasm-basic/src/wasmMain/kotlin/RootPackageClass.kt b/dokka-integration-tests/gradle/projects/it-wasm-basic/src/wasmMain/kotlin/RootPackageClass.kt
new file mode 100644
index 00000000..a2d05dff
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-wasm-basic/src/wasmMain/kotlin/RootPackageClass.kt
@@ -0,0 +1,30 @@
+@file:Suppress("unused")
+
+import org.w3c.dom.HTMLAnchorElement
+import kotlinx.coroutines.CoroutineScope
+
+/**
+ * A class that lives inside the root package
+ */
+class RootPackageClass {
+ val description = "I do live in the root package!"
+}
+
+fun test(list: MutableList<Int>) = "list"
+
+@JsModule("is-sorted")
+@JsNonModule
+external fun <T> sorted(a: Array<T>): Boolean
+
+// this declaration can be used to check deserialization of dynamic type
+external interface TextLinkProps: AnchorHTMLAttributes<HTMLAnchorElement>
+
+// this declaration uses external library and external documentation link
+fun CoroutineScope.externalClass() = "some string"
+
+/**
+ * Some external function with JsFun
+ * @see kotlin.JsFun
+ */
+@kotlin.JsFun("xxx")
+external fun externalFun() \ No newline at end of file
diff --git a/dokka-integration-tests/gradle/projects/it-wasm-basic/src/wasmMain/kotlin/it/basic/PublicClass.kt b/dokka-integration-tests/gradle/projects/it-wasm-basic/src/wasmMain/kotlin/it/basic/PublicClass.kt
new file mode 100644
index 00000000..fc4b36bd
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-wasm-basic/src/wasmMain/kotlin/it/basic/PublicClass.kt
@@ -0,0 +1,53 @@
+@file:Suppress("unused")
+
+package it.basic
+
+import RootPackageClass
+
+/**
+ * This class, unlike [RootPackageClass] is located in a sub-package
+ */
+class PublicClass {
+ /**
+ * This function is public and documented
+ */
+ fun publicDocumentedFunction(): String = ""
+
+ fun publicUndocumentedFunction(): String = ""
+
+ /**
+ * This function is internal and documented
+ */
+ internal fun internalDocumentedFunction(): String = ""
+
+ internal fun internalUndocumentedFunction(): String = ""
+
+ /**
+ * This function is private and documented
+ */
+ private fun privateDocumentedFunction(): String = ""
+
+ private fun privateUndocumentedFunction(): String = ""
+
+
+ /**
+ * This property is public and documented
+ */
+ val publicDocumentedProperty: Int = 0
+
+ val publicUndocumentedProperty: Int = 0
+
+ /**
+ * This property internal and documented
+ */
+ val internalDocumentedProperty: Int = 0
+
+ val internalUndocumentedProperty: Int = 0
+
+ /**
+ * This property private and documented
+ */
+ private val privateDocumentedProperty: Int = 0
+
+ private val privateUndocumentedProperty: Int = 0
+}
diff --git a/dokka-integration-tests/gradle/projects/it-wasm-basic/src/wasmMain/kotlin/it/internal/InternalClass.kt b/dokka-integration-tests/gradle/projects/it-wasm-basic/src/wasmMain/kotlin/it/internal/InternalClass.kt
new file mode 100644
index 00000000..7d42b978
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-wasm-basic/src/wasmMain/kotlin/it/internal/InternalClass.kt
@@ -0,0 +1,7 @@
+package it.internal
+
+/**
+ * §INTERNAL§
+ * This class is internal and should not be rendered
+ */
+internal class InternalClass
diff --git a/dokka-integration-tests/gradle/projects/it-wasm-basic/src/wasmMain/kotlin/it/suppressedByPackage/SuppressedByPackage.kt b/dokka-integration-tests/gradle/projects/it-wasm-basic/src/wasmMain/kotlin/it/suppressedByPackage/SuppressedByPackage.kt
new file mode 100644
index 00000000..d8dc9cff
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-wasm-basic/src/wasmMain/kotlin/it/suppressedByPackage/SuppressedByPackage.kt
@@ -0,0 +1,7 @@
+package it.suppressedByPackage
+
+/**
+ * §SUPPRESSED§
+ * This should not be rendered.
+ */
+class SuppressedByPackage
diff --git a/dokka-integration-tests/gradle/projects/it-wasm-basic/src/wasmMain/kotlin/it/suppressedByPath/SuppressedByPath.kt b/dokka-integration-tests/gradle/projects/it-wasm-basic/src/wasmMain/kotlin/it/suppressedByPath/SuppressedByPath.kt
new file mode 100644
index 00000000..4dda9da4
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-wasm-basic/src/wasmMain/kotlin/it/suppressedByPath/SuppressedByPath.kt
@@ -0,0 +1,7 @@
+package it.suppressedByPath
+
+/**
+ * §SUPPRESSED§
+ * This should not be rendered.
+ */
+class SuppressedByPath
diff --git a/dokka-integration-tests/gradle/projects/it-wasm-js-wasi-basic/build.gradle.kts b/dokka-integration-tests/gradle/projects/it-wasm-js-wasi-basic/build.gradle.kts
new file mode 100644
index 00000000..7039d483
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-wasm-js-wasi-basic/build.gradle.kts
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
+ */
+
+import org.jetbrains.dokka.gradle.DokkaTask
+import java.net.URL
+
+plugins {
+ kotlin("multiplatform")
+ id("org.jetbrains.dokka")
+}
+
+apply(from = "../template.root.gradle.kts")
+
+repositories {
+ // Remove it when wasm target will be published into public maven repository
+ maven("https://maven.pkg.jetbrains.space/kotlin/p/wasm/experimental")
+}
+
+kotlin {
+ wasmJs()
+ sourceSets {
+ val wasmJsMain by getting {
+ dependencies {
+ implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core-wasm-js:1.7.2-wasm3")
+ implementation("org.jetbrains.kotlinx:atomicfu-wasm-js:0.22.0-wasm2") }
+ }
+ }
+ wasmWasi()
+}
+
+tasks.withType<DokkaTask>().configureEach {
+ dokkaSourceSets {
+ configureEach {
+ externalDocumentationLink {
+ url.set(URL("https://kotlinlang.org/api/kotlinx.coroutines/"))
+ }
+ }
+ }
+}
diff --git a/dokka-integration-tests/gradle/projects/it-wasm-js-wasi-basic/gradle.properties b/dokka-integration-tests/gradle/projects/it-wasm-js-wasi-basic/gradle.properties
new file mode 100644
index 00000000..5904fc21
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-wasm-js-wasi-basic/gradle.properties
@@ -0,0 +1,5 @@
+#
+# Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
+#
+
+dokka_it_kotlin_version=1.9.20
diff --git a/dokka-integration-tests/gradle/projects/it-wasm-js-wasi-basic/gradle/wrapper/gradle-wrapper.jar b/dokka-integration-tests/gradle/projects/it-wasm-js-wasi-basic/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 00000000..f3d88b1c
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-wasm-js-wasi-basic/gradle/wrapper/gradle-wrapper.jar
Binary files differ
diff --git a/dokka-integration-tests/gradle/projects/it-wasm-js-wasi-basic/gradle/wrapper/gradle-wrapper.properties b/dokka-integration-tests/gradle/projects/it-wasm-js-wasi-basic/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 00000000..1c3c4578
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-wasm-js-wasi-basic/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,9 @@
+#
+# Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
+#
+
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.3-bin.zip
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
diff --git a/dokka-integration-tests/gradle/projects/it-wasm-js-wasi-basic/gradlew b/dokka-integration-tests/gradle/projects/it-wasm-js-wasi-basic/gradlew
new file mode 100755
index 00000000..2fe81a7d
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-wasm-js-wasi-basic/gradlew
@@ -0,0 +1,183 @@
+#!/usr/bin/env sh
+
+#
+# Copyright 2015 the original author or authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+##############################################################################
+##
+## Gradle start up script for UN*X
+##
+##############################################################################
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+ ls=`ls -ld "$PRG"`
+ link=`expr "$ls" : '.*-> \(.*\)$'`
+ if expr "$link" : '/.*' > /dev/null; then
+ PRG="$link"
+ else
+ PRG=`dirname "$PRG"`"/$link"
+ fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn () {
+ echo "$*"
+}
+
+die () {
+ echo
+ echo "$*"
+ echo
+ exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+nonstop=false
+case "`uname`" in
+ CYGWIN* )
+ cygwin=true
+ ;;
+ Darwin* )
+ darwin=true
+ ;;
+ MINGW* )
+ msys=true
+ ;;
+ NONSTOP* )
+ nonstop=true
+ ;;
+esac
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+ if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+ # IBM's JDK on AIX uses strange locations for the executables
+ JAVACMD="$JAVA_HOME/jre/sh/java"
+ else
+ JAVACMD="$JAVA_HOME/bin/java"
+ fi
+ if [ ! -x "$JAVACMD" ] ; then
+ die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+ fi
+else
+ JAVACMD="java"
+ which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
+ MAX_FD_LIMIT=`ulimit -H -n`
+ if [ $? -eq 0 ] ; then
+ if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+ MAX_FD="$MAX_FD_LIMIT"
+ fi
+ ulimit -n $MAX_FD
+ if [ $? -ne 0 ] ; then
+ warn "Could not set maximum file descriptor limit: $MAX_FD"
+ fi
+ else
+ warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+ fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+ GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin or MSYS, switch paths to Windows format before running java
+if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
+ APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+ CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+ JAVACMD=`cygpath --unix "$JAVACMD"`
+
+ # We build the pattern for arguments to be converted via cygpath
+ ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+ SEP=""
+ for dir in $ROOTDIRSRAW ; do
+ ROOTDIRS="$ROOTDIRS$SEP$dir"
+ SEP="|"
+ done
+ OURCYGPATTERN="(^($ROOTDIRS))"
+ # Add a user-defined pattern to the cygpath arguments
+ if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+ OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+ fi
+ # Now convert the arguments - kludge to limit ourselves to /bin/sh
+ i=0
+ for arg in "$@" ; do
+ CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+ CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
+
+ if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
+ eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+ else
+ eval `echo args$i`="\"$arg\""
+ fi
+ i=`expr $i + 1`
+ done
+ case $i in
+ 0) set -- ;;
+ 1) set -- "$args0" ;;
+ 2) set -- "$args0" "$args1" ;;
+ 3) set -- "$args0" "$args1" "$args2" ;;
+ 4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+ 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+ 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+ 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+ 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+ 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+ esac
+fi
+
+# Escape application args
+save () {
+ for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
+ echo " "
+}
+APP_ARGS=`save "$@"`
+
+# Collect all arguments for the java command, following the shell quoting and substitution rules
+eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
+
+exec "$JAVACMD" "$@"
diff --git a/dokka-integration-tests/gradle/projects/it-wasm-js-wasi-basic/gradlew.bat b/dokka-integration-tests/gradle/projects/it-wasm-js-wasi-basic/gradlew.bat
new file mode 100644
index 00000000..24467a14
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-wasm-js-wasi-basic/gradlew.bat
@@ -0,0 +1,100 @@
+@rem
+@rem Copyright 2015 the original author or authors.
+@rem
+@rem Licensed under the Apache License, Version 2.0 (the "License");
+@rem you may not use this file except in compliance with the License.
+@rem You may obtain a copy of the License at
+@rem
+@rem https://www.apache.org/licenses/LICENSE-2.0
+@rem
+@rem Unless required by applicable law or agreed to in writing, software
+@rem distributed under the License is distributed on an "AS IS" BASIS,
+@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@rem See the License for the specific language governing permissions and
+@rem limitations under the License.
+@rem
+
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto init
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto init
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:init
+@rem Get command-line arguments, handling Windows variants
+
+if not "%OS%" == "Windows_NT" goto win9xME_args
+
+:win9xME_args
+@rem Slurp the command line arguments.
+set CMD_LINE_ARGS=
+set _SKIP=2
+
+:win9xME_args_slurp
+if "x%~1" == "x" goto execute
+
+set CMD_LINE_ARGS=%*
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/dokka-integration-tests/gradle/projects/it-wasm-js-wasi-basic/settings.gradle.kts b/dokka-integration-tests/gradle/projects/it-wasm-js-wasi-basic/settings.gradle.kts
new file mode 100644
index 00000000..6e268072
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-wasm-js-wasi-basic/settings.gradle.kts
@@ -0,0 +1,6 @@
+/*
+ * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
+ */
+
+apply(from = "../template.settings.gradle.kts")
+rootProject.name = "it-wasm-js-wasi-basic"
diff --git a/dokka-integration-tests/gradle/projects/it-wasm-js-wasi-basic/src/wasmJsMain/kotlin/RootPackageClass.kt b/dokka-integration-tests/gradle/projects/it-wasm-js-wasi-basic/src/wasmJsMain/kotlin/RootPackageClass.kt
new file mode 100644
index 00000000..a2d05dff
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-wasm-js-wasi-basic/src/wasmJsMain/kotlin/RootPackageClass.kt
@@ -0,0 +1,30 @@
+@file:Suppress("unused")
+
+import org.w3c.dom.HTMLAnchorElement
+import kotlinx.coroutines.CoroutineScope
+
+/**
+ * A class that lives inside the root package
+ */
+class RootPackageClass {
+ val description = "I do live in the root package!"
+}
+
+fun test(list: MutableList<Int>) = "list"
+
+@JsModule("is-sorted")
+@JsNonModule
+external fun <T> sorted(a: Array<T>): Boolean
+
+// this declaration can be used to check deserialization of dynamic type
+external interface TextLinkProps: AnchorHTMLAttributes<HTMLAnchorElement>
+
+// this declaration uses external library and external documentation link
+fun CoroutineScope.externalClass() = "some string"
+
+/**
+ * Some external function with JsFun
+ * @see kotlin.JsFun
+ */
+@kotlin.JsFun("xxx")
+external fun externalFun() \ No newline at end of file
diff --git a/dokka-integration-tests/gradle/projects/it-wasm-js-wasi-basic/src/wasmJsMain/kotlin/it/basic/PublicClass.kt b/dokka-integration-tests/gradle/projects/it-wasm-js-wasi-basic/src/wasmJsMain/kotlin/it/basic/PublicClass.kt
new file mode 100644
index 00000000..fc4b36bd
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-wasm-js-wasi-basic/src/wasmJsMain/kotlin/it/basic/PublicClass.kt
@@ -0,0 +1,53 @@
+@file:Suppress("unused")
+
+package it.basic
+
+import RootPackageClass
+
+/**
+ * This class, unlike [RootPackageClass] is located in a sub-package
+ */
+class PublicClass {
+ /**
+ * This function is public and documented
+ */
+ fun publicDocumentedFunction(): String = ""
+
+ fun publicUndocumentedFunction(): String = ""
+
+ /**
+ * This function is internal and documented
+ */
+ internal fun internalDocumentedFunction(): String = ""
+
+ internal fun internalUndocumentedFunction(): String = ""
+
+ /**
+ * This function is private and documented
+ */
+ private fun privateDocumentedFunction(): String = ""
+
+ private fun privateUndocumentedFunction(): String = ""
+
+
+ /**
+ * This property is public and documented
+ */
+ val publicDocumentedProperty: Int = 0
+
+ val publicUndocumentedProperty: Int = 0
+
+ /**
+ * This property internal and documented
+ */
+ val internalDocumentedProperty: Int = 0
+
+ val internalUndocumentedProperty: Int = 0
+
+ /**
+ * This property private and documented
+ */
+ private val privateDocumentedProperty: Int = 0
+
+ private val privateUndocumentedProperty: Int = 0
+}
diff --git a/dokka-integration-tests/gradle/projects/it-wasm-js-wasi-basic/src/wasmJsMain/kotlin/it/internal/InternalClass.kt b/dokka-integration-tests/gradle/projects/it-wasm-js-wasi-basic/src/wasmJsMain/kotlin/it/internal/InternalClass.kt
new file mode 100644
index 00000000..7d42b978
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-wasm-js-wasi-basic/src/wasmJsMain/kotlin/it/internal/InternalClass.kt
@@ -0,0 +1,7 @@
+package it.internal
+
+/**
+ * §INTERNAL§
+ * This class is internal and should not be rendered
+ */
+internal class InternalClass
diff --git a/dokka-integration-tests/gradle/projects/it-wasm-js-wasi-basic/src/wasmJsMain/kotlin/it/suppressedByPackage/SuppressedByPackage.kt b/dokka-integration-tests/gradle/projects/it-wasm-js-wasi-basic/src/wasmJsMain/kotlin/it/suppressedByPackage/SuppressedByPackage.kt
new file mode 100644
index 00000000..d8dc9cff
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-wasm-js-wasi-basic/src/wasmJsMain/kotlin/it/suppressedByPackage/SuppressedByPackage.kt
@@ -0,0 +1,7 @@
+package it.suppressedByPackage
+
+/**
+ * §SUPPRESSED§
+ * This should not be rendered.
+ */
+class SuppressedByPackage
diff --git a/dokka-integration-tests/gradle/projects/it-wasm-js-wasi-basic/src/wasmJsMain/kotlin/it/suppressedByPath/SuppressedByPath.kt b/dokka-integration-tests/gradle/projects/it-wasm-js-wasi-basic/src/wasmJsMain/kotlin/it/suppressedByPath/SuppressedByPath.kt
new file mode 100644
index 00000000..4dda9da4
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-wasm-js-wasi-basic/src/wasmJsMain/kotlin/it/suppressedByPath/SuppressedByPath.kt
@@ -0,0 +1,7 @@
+package it.suppressedByPath
+
+/**
+ * §SUPPRESSED§
+ * This should not be rendered.
+ */
+class SuppressedByPath
diff --git a/dokka-integration-tests/gradle/projects/it-wasm-js-wasi-basic/src/wasmWasiMain/kotlin/RootPackageClass.kt b/dokka-integration-tests/gradle/projects/it-wasm-js-wasi-basic/src/wasmWasiMain/kotlin/RootPackageClass.kt
new file mode 100644
index 00000000..6735459c
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-wasm-js-wasi-basic/src/wasmWasiMain/kotlin/RootPackageClass.kt
@@ -0,0 +1,10 @@
+@file:Suppress("unused")
+
+/**
+ * A class that lives inside the root package
+ */
+class RootPackageClass {
+ val description = "I do live in the root package!"
+}
+
+fun test(list: MutableList<Int>) = "list" \ No newline at end of file
diff --git a/dokka-integration-tests/gradle/projects/it-wasm-js-wasi-basic/src/wasmWasiMain/kotlin/it/basic/PublicClass.kt b/dokka-integration-tests/gradle/projects/it-wasm-js-wasi-basic/src/wasmWasiMain/kotlin/it/basic/PublicClass.kt
new file mode 100644
index 00000000..fc4b36bd
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-wasm-js-wasi-basic/src/wasmWasiMain/kotlin/it/basic/PublicClass.kt
@@ -0,0 +1,53 @@
+@file:Suppress("unused")
+
+package it.basic
+
+import RootPackageClass
+
+/**
+ * This class, unlike [RootPackageClass] is located in a sub-package
+ */
+class PublicClass {
+ /**
+ * This function is public and documented
+ */
+ fun publicDocumentedFunction(): String = ""
+
+ fun publicUndocumentedFunction(): String = ""
+
+ /**
+ * This function is internal and documented
+ */
+ internal fun internalDocumentedFunction(): String = ""
+
+ internal fun internalUndocumentedFunction(): String = ""
+
+ /**
+ * This function is private and documented
+ */
+ private fun privateDocumentedFunction(): String = ""
+
+ private fun privateUndocumentedFunction(): String = ""
+
+
+ /**
+ * This property is public and documented
+ */
+ val publicDocumentedProperty: Int = 0
+
+ val publicUndocumentedProperty: Int = 0
+
+ /**
+ * This property internal and documented
+ */
+ val internalDocumentedProperty: Int = 0
+
+ val internalUndocumentedProperty: Int = 0
+
+ /**
+ * This property private and documented
+ */
+ private val privateDocumentedProperty: Int = 0
+
+ private val privateUndocumentedProperty: Int = 0
+}
diff --git a/dokka-integration-tests/gradle/projects/it-wasm-js-wasi-basic/src/wasmWasiMain/kotlin/it/internal/InternalClass.kt b/dokka-integration-tests/gradle/projects/it-wasm-js-wasi-basic/src/wasmWasiMain/kotlin/it/internal/InternalClass.kt
new file mode 100644
index 00000000..7d42b978
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-wasm-js-wasi-basic/src/wasmWasiMain/kotlin/it/internal/InternalClass.kt
@@ -0,0 +1,7 @@
+package it.internal
+
+/**
+ * §INTERNAL§
+ * This class is internal and should not be rendered
+ */
+internal class InternalClass
diff --git a/dokka-integration-tests/gradle/projects/it-wasm-js-wasi-basic/src/wasmWasiMain/kotlin/it/suppressedByPackage/SuppressedByPackage.kt b/dokka-integration-tests/gradle/projects/it-wasm-js-wasi-basic/src/wasmWasiMain/kotlin/it/suppressedByPackage/SuppressedByPackage.kt
new file mode 100644
index 00000000..d8dc9cff
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-wasm-js-wasi-basic/src/wasmWasiMain/kotlin/it/suppressedByPackage/SuppressedByPackage.kt
@@ -0,0 +1,7 @@
+package it.suppressedByPackage
+
+/**
+ * §SUPPRESSED§
+ * This should not be rendered.
+ */
+class SuppressedByPackage
diff --git a/dokka-integration-tests/gradle/projects/it-wasm-js-wasi-basic/src/wasmWasiMain/kotlin/it/suppressedByPath/SuppressedByPath.kt b/dokka-integration-tests/gradle/projects/it-wasm-js-wasi-basic/src/wasmWasiMain/kotlin/it/suppressedByPath/SuppressedByPath.kt
new file mode 100644
index 00000000..4dda9da4
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/it-wasm-js-wasi-basic/src/wasmWasiMain/kotlin/it/suppressedByPath/SuppressedByPath.kt
@@ -0,0 +1,7 @@
+package it.suppressedByPath
+
+/**
+ * §SUPPRESSED§
+ * This should not be rendered.
+ */
+class SuppressedByPath
diff --git a/dokka-integration-tests/gradle/projects/serialization/kotlinx-serialization b/dokka-integration-tests/gradle/projects/serialization/kotlinx-serialization
new file mode 160000
+Subproject ed1b05707ec27f8864c8b42235b299bdb5e0015
diff --git a/dokka-integration-tests/gradle/projects/serialization/serialization.diff b/dokka-integration-tests/gradle/projects/serialization/serialization.diff
new file mode 100644
index 00000000..cc2eb460
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/serialization/serialization.diff
@@ -0,0 +1,29 @@
+diff --git a/build.gradle b/build.gradle
+index 73b566ae..c7224a7a 100644
+--- a/build.gradle
++++ b/build.gradle
+@@ -76,9 +76,10 @@ buildscript {
+ }
+
+ dependencies {
++ def dokkaVersion = System.getenv('DOKKA_VERSION')
+ classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
+ classpath "org.jetbrains.kotlin:kotlin-serialization:$kotlin_version"
+- classpath "org.jetbrains.dokka:dokka-gradle-plugin:$dokka_version"
++ classpath "org.jetbrains.dokka:dokka-gradle-plugin:$dokkaVersion"
+ classpath "org.jetbrains.kotlinx:kover:$kover_version"
+ classpath "org.jetbrains.kotlinx:binary-compatibility-validator:$validator_version"
+ classpath "org.jetbrains.kotlinx:kotlinx-knit:$knit_version"
+diff --git a/gradle.properties b/gradle.properties
+index 5ef66cd9..7e7323fd 100644
+--- a/gradle.properties
++++ b/gradle.properties
+@@ -13,7 +13,7 @@ kotlin.version.snapshot=1.9.255-SNAPSHOT
+
+ junit_version=4.12
+ jackson_version=2.10.0.pr1
+-dokka_version=1.8.10
++dokka_version=non-existing-sanity-check-SNAPSHOT
+ native.deploy=
+ validator_version=0.13.2
+ knit_version=0.5.0-Beta
diff --git a/dokka-integration-tests/gradle/projects/serialization/template.root.gradle.kts b/dokka-integration-tests/gradle/projects/serialization/template.root.gradle.kts
new file mode 120000
index 00000000..895ca83d
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/serialization/template.root.gradle.kts
@@ -0,0 +1 @@
+../template.root.gradle.kts \ No newline at end of file
diff --git a/dokka-integration-tests/gradle/projects/serialization/template.settings.gradle.kts b/dokka-integration-tests/gradle/projects/serialization/template.settings.gradle.kts
new file mode 120000
index 00000000..7b43b3e7
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/serialization/template.settings.gradle.kts
@@ -0,0 +1 @@
+../template.settings.gradle.kts \ No newline at end of file
diff --git a/dokka-integration-tests/gradle/projects/template.root.gradle.kts b/dokka-integration-tests/gradle/projects/template.root.gradle.kts
new file mode 100644
index 00000000..46cb2d6f
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/template.root.gradle.kts
@@ -0,0 +1,29 @@
+/*
+ * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
+ */
+
+allprojects {
+ repositories {
+ mavenLocal {
+ content {
+ includeGroup("org.jetbrains.dokka")
+ }
+ }
+ mavenCentral()
+ google()
+ maven("https://maven.pkg.jetbrains.space/public/p/kotlinx-html/maven") {
+ content {
+ includeGroup("org.jetbrains.kotlinx")
+ }
+ }
+ }
+}
+
+afterEvaluate {
+ logger.quiet("Gradle version: ${gradle.gradleVersion}")
+ logger.quiet("Kotlin version: ${properties["dokka_it_kotlin_version"]}")
+ logger.quiet("Dokka version: ${properties["dokka_it_dokka_version"]}")
+ properties["dokka_it_android_gradle_plugin_version"]?.let { androidVersion ->
+ logger.quiet("Android version: $androidVersion")
+ }
+}
diff --git a/dokka-integration-tests/gradle/projects/template.settings.gradle.kts b/dokka-integration-tests/gradle/projects/template.settings.gradle.kts
new file mode 100644
index 00000000..9cf3abe7
--- /dev/null
+++ b/dokka-integration-tests/gradle/projects/template.settings.gradle.kts
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
+ */
+
+@file:Suppress("LocalVariableName", "UnstableApiUsage")
+
+pluginManagement {
+ val dokka_it_kotlin_version: String by settings
+ val dokka_it_dokka_version: String by settings
+ val dokka_it_android_gradle_plugin_version: String? by settings
+
+ plugins {
+ id("org.jetbrains.kotlin.js") version dokka_it_kotlin_version
+ id("org.jetbrains.kotlin.jvm") version dokka_it_kotlin_version
+ id("org.jetbrains.kotlin.android") version dokka_it_kotlin_version
+ id("org.jetbrains.kotlin.multiplatform") version dokka_it_kotlin_version
+ id("org.jetbrains.dokka") version dokka_it_dokka_version
+ }
+
+ resolutionStrategy {
+ eachPlugin {
+ if (requested.id.id == "org.jetbrains.dokka") {
+ useModule("org.jetbrains.dokka:dokka-gradle-plugin:${System.getenv("DOKKA_VERSION")}")
+ }
+
+ if (requested.id.id == "com.android.library") {
+ useModule("com.android.tools.build:gradle:$dokka_it_android_gradle_plugin_version")
+ }
+
+ if (requested.id.id == "com.android.application") {
+ useModule("com.android.tools.build:gradle:$dokka_it_android_gradle_plugin_version")
+ }
+ }
+ }
+ repositories {
+ mavenLocal {
+ content {
+ includeGroup("org.jetbrains.dokka")
+ }
+ }
+ mavenCentral()
+ gradlePluginPortal()
+ google()
+ }
+}