aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.github/workflows/s3-cleanup.yml21
-rw-r--r--.github/workflows/s3-snapshots.yml132
-rw-r--r--.gitmodules12
-rw-r--r--core/src/main/kotlin/plugability/extensions.kt2
-rw-r--r--gradle.properties2
-rwxr-xr-xintegration-tests/aws_sync.sh34
-rw-r--r--integration-tests/build.gradle.kts1
-rw-r--r--integration-tests/gradle/projects/coroutines/coroutines.diff588
m---------integration-tests/gradle/projects/coroutines/kotlinx-coroutines0
l---------integration-tests/gradle/projects/coroutines/template.root.gradle.kts1
l---------integration-tests/gradle/projects/coroutines/template.settings.gradle.kts1
m---------integration-tests/gradle/projects/serialization/kotlinx-serialization0
-rw-r--r--integration-tests/gradle/projects/serialization/serialization.diff48
l---------integration-tests/gradle/projects/serialization/template.root.gradle.kts1
l---------integration-tests/gradle/projects/serialization/template.settings.gradle.kts1
m---------integration-tests/gradle/projects/stdlib/kotlin-dokka-stdlib0
-rw-r--r--integration-tests/gradle/projects/stdlib/stdlib.diff567
l---------integration-tests/gradle/projects/stdlib/template.root.gradle.kts1
l---------integration-tests/gradle/projects/stdlib/template.settings.gradle.kts1
-rw-r--r--integration-tests/gradle/src/integrationTest/kotlin/org/jetbrains/dokka/it/gradle/kotlin/CoroutinesGradleIntegrationTest.kt50
-rw-r--r--integration-tests/gradle/src/integrationTest/kotlin/org/jetbrains/dokka/it/gradle/kotlin/SerializationGradleIntegrationTest.kt49
-rw-r--r--integration-tests/gradle/src/integrationTest/kotlin/org/jetbrains/dokka/it/gradle/kotlin/StdlibGradleIntegrationTest.kt50
m---------integration-tests/maven/projects/biojava/biojava0
-rw-r--r--integration-tests/maven/projects/biojava/biojava.diff42
-rw-r--r--integration-tests/maven/src/integrationTest/kotlin/org/jetbrains/dokka/it/maven/BiojavaIntegrationTest.kt59
-rw-r--r--integration-tests/src/main/kotlin/org/jetbrains/dokka/it/S3Project.kt16
-rw-r--r--integration-tests/src/main/kotlin/org/jetbrains/dokka/it/gitSubmoduleUtils.kt40
27 files changed, 1639 insertions, 80 deletions
diff --git a/.github/workflows/s3-cleanup.yml b/.github/workflows/s3-cleanup.yml
new file mode 100644
index 00000000..5193290d
--- /dev/null
+++ b/.github/workflows/s3-cleanup.yml
@@ -0,0 +1,21 @@
+name: S3-cleanup
+
+on: delete
+
+env:
+ branch-name: ${GITHUB_REF#refs/heads/}
+ bucket-name: 'dokka-snapshots'
+
+jobs:
+ cleanup:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Configure AWS credentials for S3 access
+ uses: aws-actions/configure-aws-credentials@v1
+ with:
+ aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
+ aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
+ aws-region: eu-central-1
+
+ - name: Delete branch from s3
+ run: aws s3 --recursive rm s3://${{ env.bucket-name }}/${{ env.branch-name }}
diff --git a/.github/workflows/s3-snapshots.yml b/.github/workflows/s3-snapshots.yml
index 29a4357f..0020adfe 100644
--- a/.github/workflows/s3-snapshots.yml
+++ b/.github/workflows/s3-snapshots.yml
@@ -1,4 +1,4 @@
-name: S3-snapshots
+name: Build example projects and publish them to s3
on: push
@@ -13,30 +13,19 @@ jobs:
- name: Checkout dokka
uses: actions/checkout@v2
with:
- path: dokka
+ submodules: true
- uses: actions/setup-java@v1
with:
- java-version: 11
+ java-version: 12
- name: Publish dokka locally
- run: ./gradlew clean publishToMavenLocal --stacktrace
- working-directory: ./dokka
-
- - name: Get current dokka version
- run: echo "::set-env name=DOKKA_VERSION::`./gradlew :properties | grep '^version:.*' | cut -d ' ' -f 2`"
- working-directory: ./dokka
-
- - name: Checkout coroutines
- uses: actions/checkout@v2
- with:
- repository: 'kamildoleglo/kotlinx.coroutines'
- ref: 'aws'
- path: coroutines
+ run: ./gradlew publishToMavenLocal --stacktrace
- name: Document coroutines
- run: ./gradlew clean dokkaHtml :dokkaHtmlMultimodule -Pdokka_version=$DOKKA_VERSION --stacktrace
- working-directory: ./coroutines
+ run: ./gradlew :integration-tests:gradle:integrationTest --tests org.jetbrains.dokka.it.gradle.kotlin.CoroutinesGradleIntegrationTest --stacktrace --info
+ env:
+ DOKKA_IT_AWS_PATH: /home/runner/work/dokka/coroutines
- name: Configure AWS credentials for S3 access
uses: aws-actions/configure-aws-credentials@v1
@@ -46,27 +35,10 @@ jobs:
aws-region: eu-central-1
- name: Copy files to dokka's S3 bucket
- run: |
- aws s3 --recursive rm s3://${{ env.bucket-name }}/${{ env.branch-name }}/coroutines/prev
- aws s3 --recursive mv s3://${{ env.bucket-name }}/${{ env.branch-name }}/coroutines/latest s3://${{ env.bucket-name }}/${{ env.branch-name }}/coroutines/prev
- aws s3 sync ./coroutines/htmlMultimodule s3://${{ env.bucket-name }}/${{ env.branch-name }}/coroutines/latest/htmlMultimodule
- aws s3 sync ./coroutines/ui/kotlinx-coroutines-android/build/dokka s3://${{ env.bucket-name }}/${{ env.branch-name }}/coroutines/latest/ui/kotlinx-coroutines-android/build/dokka
- aws s3 sync ./coroutines/kotlinx-coroutines-core/build/dokka s3://${{ env.bucket-name }}/${{ env.branch-name }}/coroutines/latest/kotlinx-coroutines-core/build/dokka
- aws s3 sync ./coroutines/kotlinx-coroutines-debug/build/dokka s3://${{ env.bucket-name }}/${{ env.branch-name }}/coroutines/latest/kotlinx-coroutines-debug/build/dokka
- aws s3 sync ./coroutines/integration/kotlinx-coroutines-guava/build/dokka s3://${{ env.bucket-name }}/${{ env.branch-name }}/coroutines/latest/integration/kotlinx-coroutines-guava/build/dokka
- aws s3 sync ./coroutines/ui/kotlinx-coroutines-javafx/build/dokka s3://${{ env.bucket-name }}/${{ env.branch-name }}/coroutines/latest/ui/kotlinx-coroutines-javafx/build/dokka
- aws s3 sync ./coroutines/integration/kotlinx-coroutines-jdk8/build/dokka s3://${{ env.bucket-name }}/${{ env.branch-name }}/coroutines/latest/integration/kotlinx-coroutines-jdk8/build/dokka
- aws s3 sync ./coroutines/reactive/kotlinx-coroutines-jdk9/build/dokka s3://${{ env.bucket-name }}/${{ env.branch-name }}/coroutines/latest/reactive/kotlinx-coroutines-jdk9/build/dokka
- aws s3 sync ./coroutines/integration/kotlinx-coroutines-play-services/build/dokka s3://${{ env.bucket-name }}/${{ env.branch-name }}/coroutines/latest/integration/kotlinx-coroutines-play-services/build/dokka
- aws s3 sync ./coroutines/reactive/kotlinx-coroutines-reactive/build/dokka s3://${{ env.bucket-name }}/${{ env.branch-name }}/coroutines/latest/reactive/kotlinx-coroutines-reactive/build/dokka
- aws s3 sync ./coroutines/reactive/kotlinx-coroutines-reactor/build/dokka s3://${{ env.bucket-name }}/${{ env.branch-name }}/coroutines/latest/reactive/kotlinx-coroutines-reactor/build/dokka
- aws s3 sync ./coroutines/reactive/kotlinx-coroutines-rx2/build/dokka s3://${{ env.bucket-name }}/${{ env.branch-name }}/coroutines/latest/reactive/kotlinx-coroutines-rx2/build/dokka
- aws s3 sync ./coroutines/reactive/kotlinx-coroutines-rx3/build/dokka s3://${{ env.bucket-name }}/${{ env.branch-name }}/coroutines/latest/reactive/kotlinx-coroutines-rx3/build/dokka
- aws s3 sync ./coroutines/integration/kotlinx-coroutines-slf4j/build/dokka s3://${{ env.bucket-name }}/${{ env.branch-name }}/coroutines/latest/integration/kotlinx-coroutines-slf4j/build/dokka
- aws s3 sync ./coroutines/ui/kotlinx-coroutines-swing/build/dokka s3://${{ env.bucket-name }}/${{ env.branch-name }}/coroutines/latest/ui/kotlinx-coroutines-swing/build/dokka
- aws s3 sync ./coroutines/kotlinx-coroutines-test/build/dokka s3://${{ env.bucket-name }}/${{ env.branch-name }}/coroutines/latest/kotlinx-coroutines-test/build/dokka
+ run: ./integration-tests/aws_sync.sh s3://${{ env.bucket-name }} coroutines ../coroutines
+
- name: Print link
- run: echo http://dokka-snapshots.s3.eu-central-1.amazonaws.com/${{ env.branch-name }}/coroutines/latest/htmlMultimodule/-modules.html
+ run: echo http://dokka-snapshots.s3.eu-central-1.amazonaws.com/${{ env.branch-name }}/coroutines/${GITHUB_SHA::7}/-modules.html
stdlib:
runs-on: ubuntu-latest
@@ -74,30 +46,19 @@ jobs:
- name: Checkout dokka
uses: actions/checkout@v2
with:
- path: dokka
+ submodules: true
- uses: actions/setup-java@v1
with:
- java-version: 11
+ java-version: 12
- name: Publish dokka locally
run: ./gradlew clean publishToMavenLocal --stacktrace
- working-directory: ./dokka
-
- - name: Get current dokka version
- run: echo "::set-env name=DOKKA_VERSION::`./gradlew :properties | grep '^version:.*' | cut -d ' ' -f 2`"
- working-directory: ./dokka
-
- - name: Checkout stdlib
- uses: actions/checkout@v2
- with:
- repository: 'kamildoleglo/kotlin-dokka-stdlib'
- ref: 'aws'
- path: stdlib
- name: Document stdlib
- run: ./gradlew clean callDokka -Pdokka_version=$DOKKA_VERSION --stacktrace
- working-directory: ./stdlib
+ run: ./gradlew :integration-tests:gradle:integrationTest --tests org.jetbrains.dokka.it.gradle.kotlin.StdlibGradleIntegrationTest --stacktrace --info
+ env:
+ DOKKA_IT_AWS_PATH: /home/runner/work/dokka/stdlib
- name: Configure AWS credentials for S3 access
uses: aws-actions/configure-aws-credentials@v1
@@ -107,44 +68,63 @@ jobs:
aws-region: eu-central-1
- name: Copy files to dokka's S3 bucket
- run: |
- aws s3 --recursive rm s3://${{ env.bucket-name }}/${{ env.branch-name }}/stdlib/prev
- aws s3 --recursive mv s3://${{ env.bucket-name }}/${{ env.branch-name }}/stdlib/latest s3://${{ env.bucket-name }}/${{ env.branch-name }}/stdlib/prev
- aws s3 sync ./stdlib/build/dokka s3://${{ env.bucket-name }}/${{ env.branch-name }}/stdlib/latest
+ run: ./integration-tests/aws_sync.sh s3://${{ env.bucket-name }} stdlib ../stdlib
- name: Print link
- run: echo http://dokka-snapshots.s3.eu-central-1.amazonaws.com/${{ env.branch-name }}/stdlib/latest/kotlin-stdlib/kotlin-stdlib/index.html
+ run: echo http://dokka-snapshots.s3.eu-central-1.amazonaws.com/${{ env.branch-name }}/stdlib/${GITHUB_SHA::7}/index.html
- biojava:
+ serialization:
runs-on: ubuntu-latest
steps:
- name: Checkout dokka
uses: actions/checkout@v2
with:
- path: dokka
+ submodules: true
- uses: actions/setup-java@v1
with:
- java-version: 11
+ java-version: 12
- name: Publish dokka locally
run: ./gradlew clean publishToMavenLocal --stacktrace
- working-directory: ./dokka
- - name: Get current dokka version
- run: echo "::set-env name=DOKKA_VERSION::`./gradlew :properties | grep '^version:.*' | cut -d ' ' -f 2`"
- working-directory: ./dokka
+ - name: Document serialization
+ run: ./gradlew :integration-tests:gradle:integrationTest --tests org.jetbrains.dokka.it.gradle.kotlin.SerializationGradleIntegrationTest --stacktrace --info
+ env:
+ DOKKA_IT_AWS_PATH: /home/runner/work/dokka/serialization
- - name: Checkout biojava
+ - name: Configure AWS credentials for S3 access
+ uses: aws-actions/configure-aws-credentials@v1
+ with:
+ aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
+ aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
+ aws-region: eu-central-1
+
+ - name: Copy files to dokka's S3 bucket
+ run: ./integration-tests/aws_sync.sh s3://${{ env.bucket-name }} serialization ../serialization
+
+ - name: Print link
+ run: echo http://dokka-snapshots.s3.eu-central-1.amazonaws.com/${{ env.branch-name }}/serialization/${GITHUB_SHA::7}/-modules.html
+
+ biojava:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout dokka
uses: actions/checkout@v2
with:
- repository: 'kamildoleglo/biojava'
- ref: 'aws'
- path: biojava
+ submodules: true
+
+ - uses: actions/setup-java@v1
+ with:
+ java-version: 12
+
+ - name: Publish dokka locally
+ run: ./gradlew clean publishToMavenLocal --stacktrace
- name: Document biojava-core
- run: mvn site -pl biojava-core "-Ddokka-version=$DOKKA_VERSION"
- working-directory: ./biojava
+ run: ./gradlew :integration-tests:maven:integrationTest --tests org.jetbrains.dokka.it.maven.BiojavaIntegrationTest --stacktrace --info
+ env:
+ DOKKA_IT_AWS_PATH: /home/runner/work/dokka/biojava
- name: Configure AWS credentials for S3 access
uses: aws-actions/configure-aws-credentials@v1
@@ -154,11 +134,7 @@ jobs:
aws-region: eu-central-1
- name: Copy files to dokka's S3 bucket
- run: |
- aws s3 --recursive rm s3://${{ env.bucket-name }}/${{ env.branch-name }}/biojava/prev
- aws s3 --recursive mv s3://${{ env.bucket-name }}/${{ env.branch-name }}/biojava/latest s3://${{ env.bucket-name }}/${{ env.branch-name }}/biojava/prev
- aws s3 sync ./biojava/biojava-core/target/dokkaJavadoc s3://${{ env.bucket-name }}/${{ env.branch-name }}/biojava/latest
+ run: ./integration-tests/aws_sync.sh s3://${{ env.bucket-name }} biojava ../biojava
- name: Print link
- run: echo http://dokka-snapshots.s3.eu-central-1.amazonaws.com/${{ env.branch-name }}/biojava/latest/index.html
-
+ run: echo http://dokka-snapshots.s3.eu-central-1.amazonaws.com/${{ env.branch-name }}/biojava/${GITHUB_SHA::7}/index.html
diff --git a/.gitmodules b/.gitmodules
new file mode 100644
index 00000000..89cd6fb9
--- /dev/null
+++ b/.gitmodules
@@ -0,0 +1,12 @@
+[submodule "integration-tests/gradle/projects/stdlib/kotlin-dokka-stdlib"]
+ path = integration-tests/gradle/projects/stdlib/kotlin-dokka-stdlib
+ url = https://github.com/JetBrains/kotlin-dokka-stdlib
+[submodule "integration-tests/gradle/projects/coroutines/kotlinx-coroutines"]
+ path = integration-tests/gradle/projects/coroutines/kotlinx-coroutines
+ url = https://github.com/Kotlin/kotlinx.coroutines
+[submodule "integration-tests/gradle/projects/serialization/kotlinx-serialization"]
+ path = integration-tests/gradle/projects/serialization/kotlinx-serialization
+ url = https://github.com/Kotlin/kotlinx.serialization
+[submodule "integration-tests/maven/projects/biojava/biojava"]
+ path = integration-tests/maven/projects/biojava/biojava
+ url = https://github.com/biojava/biojava
diff --git a/core/src/main/kotlin/plugability/extensions.kt b/core/src/main/kotlin/plugability/extensions.kt
index c6dd0b85..be45c237 100644
--- a/core/src/main/kotlin/plugability/extensions.kt
+++ b/core/src/main/kotlin/plugability/extensions.kt
@@ -84,4 +84,4 @@ class OrderDsl {
fun before(vararg extensions: Extension<*, *, *>) {
following += extensions
}
-} \ No newline at end of file
+}
diff --git a/gradle.properties b/gradle.properties
index df0f91ae..a48961e7 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -12,5 +12,5 @@ language_version=1.4
# Code style
kotlin.code.style=official
# Gradle settings
-org.gradle.jvmargs=-Xmx4g
+org.gradle.jvmargs=-Xmx4g -XX:MaxMetaspaceSize=1g
org.gradle.parallel=true
diff --git a/integration-tests/aws_sync.sh b/integration-tests/aws_sync.sh
new file mode 100755
index 00000000..fbc6d535
--- /dev/null
+++ b/integration-tests/aws_sync.sh
@@ -0,0 +1,34 @@
+#!/bin/bash
+
+commits_to_store=3
+
+if [ $# -lt 3 ]; then
+ echo "Too little arguments. Usage: ./aws_generate <s3_address> <project_name> <path_to_project_output_dir>"
+ exit 1
+fi
+
+aws_s3_address=${1%/} # Remove trailing slash if given
+project_name=$2
+project_path=$3
+
+current_branch=$(git branch --show-current)
+s3_project_address="${aws_s3_address}/${current_branch}/${project_name}/"
+last_commits=$(git log --pretty=format:%h -n $commits_to_store)
+
+# List all project versions
+dir=$(aws s3 ls "$s3_project_address" | awk '{print $2}')
+
+# Remove old versions
+for d in $dir; do
+ for commit in "${last_commits[@]}"; do
+ [[ $d == "$commit/" ]] && continue
+ aws s3 rm --recursive "$s3_project_address$d"
+ done
+done
+
+# Sync the new one
+commit_hash=$(git log -1 --format="%h")
+
+aws s3 sync "$project_path" "$s3_project_address$commit_hash/"
+
+echo "$commit_hash"
diff --git a/integration-tests/build.gradle.kts b/integration-tests/build.gradle.kts
index 76dfeb76..f0a534e9 100644
--- a/integration-tests/build.gradle.kts
+++ b/integration-tests/build.gradle.kts
@@ -62,4 +62,5 @@ dependencies {
val coroutines_version: String by project
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutines_version")
implementation("org.jsoup:jsoup:1.12.1")
+ implementation("org.eclipse.jgit:org.eclipse.jgit:5.9.0.202009080501-r")
}
diff --git a/integration-tests/gradle/projects/coroutines/coroutines.diff b/integration-tests/gradle/projects/coroutines/coroutines.diff
new file mode 100644
index 00000000..9892f4a6
--- /dev/null
+++ b/integration-tests/gradle/projects/coroutines/coroutines.diff
@@ -0,0 +1,588 @@
+diff --git a/build.gradle b/build.gradle
+index 79c7f355..d5209f10 100644
+--- a/build.gradle
++++ b/build.gradle
+@@ -4,18 +4,14 @@
+ import org.jetbrains.kotlin.konan.target.HostManager
+ import org.gradle.util.VersionNumber
+
+-apply plugin: 'jdk-convention'
+-apply from: rootProject.file("gradle/experimental.gradle")
+-
+-def rootModule = "kotlinx.coroutines"
+-def coreModule = "kotlinx-coroutines-core"
++buildscript {
++ def rootModule = "kotlinx.coroutines"
++ def coreModule = "kotlinx-coroutines-core"
+ // Not applicable for Kotlin plugin
+-def sourceless = ['kotlinx.coroutines', 'site', 'kotlinx-coroutines-bom', 'integration-testing']
+-def internal = ['kotlinx.coroutines', 'site', 'benchmarks', 'js-stub', 'stdlib-stubs', 'integration-testing']
++ def sourceless = ['kotlinx.coroutines', 'site', 'kotlinx-coroutines-bom', 'integration-testing']
++ def internal = ['kotlinx.coroutines', 'site', 'benchmarks', 'js-stub', 'stdlib-stubs', 'integration-testing']
+ // Not published
+-def unpublished = internal + ['example-frontend-js', 'android-unit-tests']
+-
+-buildscript {
++ def unpublished = internal + ['example-frontend-js', 'android-unit-tests']
+ /*
+ * These property group is used to build kotlinx.coroutines against Kotlin compiler snapshot.
+ * How does it work:
+@@ -74,7 +70,6 @@ buildscript {
+
+ dependencies {
+ classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
+- classpath "org.jetbrains.dokka:dokka-gradle-plugin:$dokka_version"
+ classpath "org.jetbrains.kotlinx:atomicfu-gradle-plugin:$atomicfu_version"
+ classpath "org.jetbrains.kotlinx:kotlinx-knit:$knit_version"
+ classpath "com.moowork.gradle:gradle-node-plugin:$gradle_node_version"
+@@ -87,6 +82,21 @@ buildscript {
+ CacheRedirector.configureBuildScript(buildscript, rootProject)
+ }
+
++plugins {
++ id("org.jetbrains.dokka")
++}
++
++apply plugin: 'jdk-convention'
++apply from: rootProject.file("gradle/experimental.gradle")
++apply from: "../template.root.gradle.kts"
++
++def rootModule = "kotlinx.coroutines"
++def coreModule = "kotlinx-coroutines-core"
++def sourceless = ['kotlinx.coroutines', 'site', 'kotlinx-coroutines-bom', 'integration-testing']
++def internal = ['kotlinx.coroutines', 'site', 'benchmarks', 'js-stub', 'stdlib-stubs', 'integration-testing']
++def unpublished = internal + ['example-frontend-js', 'android-unit-tests']
++
++
+ import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType
+
+ // todo:KLUDGE: Hierarchical project structures are not fully supported in IDEA, enable only for a regular built
+@@ -271,7 +281,7 @@ configure(subprojects.findAll {
+ }
+
+ def core_docs_url = "https://kotlin.github.io/kotlinx.coroutines/$coreModule/"
+-def core_docs_file = "$projectDir/kotlinx-coroutines-core/build/dokka/kotlinx-coroutines-core/package-list"
++def core_docs_file = "$projectDir/kotlinx-coroutines-core/build/dokka/html/kotlinx-coroutines-core/package-list"
+
+ configure(subprojects.findAll { !unpublished.contains(it.name) }) {
+ if (it.name != 'kotlinx-coroutines-bom') {
+@@ -283,11 +293,15 @@ configure(subprojects.findAll { !unpublished.contains(it.name) }) {
+ configure(subprojects.findAll { !unpublished.contains(it.name) }) {
+ if (it.name != "kotlinx-coroutines-bom") {
+ if (it.name != coreModule) {
+- dokka.dependsOn project(":$coreModule").dokka
+- tasks.withType(dokka.getClass()) {
+- externalDocumentationLink {
+- url = new URL(core_docs_url)
+- packageListUrl = new File(core_docs_file).toURI().toURL()
++ dokkaHtml.dependsOn project(":$coreModule").dokkaHtml
++ tasks.withType(dokkaHtml.getClass()) {
++ dokkaSourceSets {
++ configureEach {
++ externalDocumentationLink {
++ url.set(new URL(core_docs_url))
++ packageListUrl.set(new File(core_docs_file).toURI().toURL())
++ }
++ }
+ }
+ }
+ }
+diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts
+index 96b17a3d..caedbe8d 100644
+--- a/buildSrc/build.gradle.kts
++++ b/buildSrc/build.gradle.kts
+@@ -35,5 +35,4 @@ fun version(target: String): String =
+
+ dependencies {
+ implementation(kotlin("gradle-plugin", version("kotlin")))
+- implementation("org.jetbrains.dokka:dokka-gradle-plugin:${version("dokka")}")
+ }
+diff --git a/buildSrc/src/main/kotlin/Dokka.kt b/buildSrc/src/main/kotlin/Dokka.kt
+deleted file mode 100644
+index dd5f1ea4..00000000
+--- a/buildSrc/src/main/kotlin/Dokka.kt
++++ /dev/null
+@@ -1,26 +0,0 @@
+-/*
+- * Copyright 2016-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
+- */
+-
+-import org.gradle.api.Project
+-import org.gradle.kotlin.dsl.delegateClosureOf
+-import org.gradle.kotlin.dsl.withType
+-import org.jetbrains.dokka.DokkaConfiguration.ExternalDocumentationLink.Builder
+-import org.jetbrains.dokka.gradle.DokkaTask
+-import java.io.File
+-import java.net.URL
+-
+-/**
+- * Package-list by external URL for documentation generation.
+- */
+-fun Project.externalDocumentationLink(
+- url: String,
+- packageList: File = projectDir.resolve("package.list")
+-) {
+- tasks.withType<DokkaTask>().configureEach {
+- externalDocumentationLink(delegateClosureOf<Builder> {
+- this.url = URL(url)
+- packageListUrl = packageList.toPath().toUri().toURL()
+- })
+- }
+-}
+diff --git a/gradle.properties b/gradle.properties
+index 18b95166..36881b53 100644
+--- a/gradle.properties
++++ b/gradle.properties
+@@ -5,6 +5,7 @@
+ # Kotlin
+ version=1.4.0-M1-SNAPSHOT
+ group=org.jetbrains.kotlinx
++dokka_it_kotlin_version=
+ kotlin_version=1.4.0
+
+ # Dependencies
+diff --git a/gradle/dokka.gradle b/gradle/dokka.gradle
+index 559ec8b6..891e07b3 100644
+--- a/gradle/dokka.gradle
++++ b/gradle/dokka.gradle
+@@ -5,11 +5,10 @@
+ // Configures generation of JavaDoc & Dokka artifacts
+
+ def makeLinkMapping(dokka, projectDir) {
+- dokka.linkMapping {
++ dokka.sourceLink {
+ def relPath = rootProject.projectDir.toPath().relativize(projectDir.toPath())
+- dir = "$projectDir/src"
+- url = "https://github.com/kotlin/kotlinx.coroutines/tree/master/$relPath/src"
+- suffix = "#L"
++ localDirectory.set(project.file("src"))
++ remoteUrl.set(new URL("https://github.com/kotlin/kotlinx.coroutines/tree/master/$relPath/src"))
+ }
+ }
+
+@@ -20,9 +19,13 @@ configurations {
+
+ apply plugin: 'org.jetbrains.dokka'
+
+-tasks.withType(dokka.getClass()) {
+- jdkVersion = 8
+- includes = ['README.md']
++tasks.withType(dokkaHtml.getClass()) {
++ dokkaSourceSets {
++ configureEach {
++ jdkVersion.set(8)
++ includes.from('README.md')
++ }
++ }
+ }
+
+ dependencies {
+@@ -30,24 +33,64 @@ dependencies {
+ }
+
+
+-dokka {
+- kotlinTasks { [] }
+- outputFormat = 'kotlin-website'
++dokkaHtml {
+ dependsOn(project.configurations.dokkaStubs)
++ dokkaSourceSets {
++ if (project.name != "kotlinx-coroutines-core") {
++ configureEach {
++ externalDocumentationLink {
++ packageListUrl.set(rootProject.projectDir.toPath().resolve("site/stdlib.package.list").toUri().toURL())
++ url.set(new URL("https://kotlinlang.org/api/latest/jvm/stdlib/"))
++ }
++ noStdlibLink.set(true)
++ }
+
+- noStdlibLink = true
+-
+- externalDocumentationLink {
+- packageListUrl = rootProject.projectDir.toPath().resolve("site/stdlib.package.list").toUri().toURL()
+- url = new URL("https://kotlinlang.org/api/latest/jvm/stdlib/")
+- }
++ } else {
++ commonMain {
++ makeLinkMapping(it, project.file("common"))
++
++ includes.from('README.md')
++ externalDocumentationLink {
++ packageListUrl.set(rootProject.projectDir.toPath().resolve("site/stdlib.package.list").toUri().toURL())
++ url.set(new URL("https://kotlinlang.org/api/latest/jvm/stdlib/"))
++ }
++ noStdlibLink.set(true)
++ }
++ jvmMain {
++ makeLinkMapping(it, project.file("jvm"))
++
++ includes.from('README.md')
++ externalDocumentationLink {
++ packageListUrl.set(rootProject.projectDir.toPath().resolve("site/stdlib.package.list").toUri().toURL())
++ url.set(new URL("https://kotlinlang.org/api/latest/jvm/stdlib/"))
++ }
++ noStdlibLink.set(true)
++ }
++ jsMain {
++ makeLinkMapping(it, project.file("js"))
++
++ includes.from('README.md')
++ externalDocumentationLink {
++ packageListUrl.set(rootProject.projectDir.toPath().resolve("site/stdlib.package.list").toUri().toURL())
++ url.set(new URL("https://kotlinlang.org/api/latest/jvm/stdlib/"))
++ }
++ noStdlibLink.set(true)
++ }
++ }
+
++ }
+ if (project.name != "kotlinx-coroutines-core") {
+ dependsOn(project.configurations.compileClasspath)
+ dependsOn(project.sourceSets.main.output)
+ doFirst {
+ // resolve classpath only during execution
+- classpath = project.configurations.dokkaStubs.files + project.configurations.compileClasspath.files + project.sourceSets.main.output.files
++ dokkaSourceSets {
++ configureEach {
++ classpath.setFrom(project.configurations.dokkaStubs.files)
++ classpath.from(project.configurations.compileClasspath.files)
++ classpath.from(project.sourceSets.main.output.files)
++ }
++ }
+ }
+ }
+ }
+@@ -57,37 +100,17 @@ if (project.name == "kotlinx-coroutines-core") {
+ dependencies {
+ dokkaStubs project(":js-stub") // so that JS library reference can resolve properly
+ dokkaStubs project(":kotlinx-coroutines-core")
++ dokkaStubs project(":stdlib-stubs")
+ }
+-
+- dokka {
+- kotlinTasks { [] }
+- suppressedModifiers = ['actual']
+- makeLinkMapping(it, projectDir)
+- makeLinkMapping(it, project.file("js"))
+- makeLinkMapping(it, project.file("jvm"))
+- makeLinkMapping(it, project.file("native"))
+- makeLinkMapping(it, project.file("common"))
+- // source roots
+- impliedPlatforms = ['JVM', 'JS', 'Native']
+- sourceRoot {
+- path = rootProject.file("$project.name/common/src")
+- }
+- sourceRoot {
+- path = rootProject.file("$project.name/jvm/src")
+- platforms = ['JVM']
+- }
+- sourceRoot {
+- path = rootProject.file("$project.name/js/src")
+- platforms = ['JS']
+- }
+- sourceRoot {
+- path = rootProject.file("$project.name/native/src")
+- platforms = ['Native']
+- }
++ dokkaHtml {
+ doFirst {
+- classpath = project.configurations.dokkaStubs.files +
+- project.configurations.jvmCompileClasspath.files +
+- project.kotlin.targets.jvm.compilations.main.output.allOutputs
++ dokkaSourceSets {
++ configureEach {
++ classpath.setFrom(project.configurations.dokkaStubs.files)
++ classpath.from(project.configurations.jvmCompileClasspath.files)
++ classpath.from(project.kotlin.targets.jvm.compilations.main.output.allOutputs)
++ }
++ }
+ }
+ }
+ }
+diff --git a/integration/kotlinx-coroutines-guava/build.gradle.kts b/integration/kotlinx-coroutines-guava/build.gradle.kts
+index 53e91add..810c730c 100644
+--- a/integration/kotlinx-coroutines-guava/build.gradle.kts
++++ b/integration/kotlinx-coroutines-guava/build.gradle.kts
+@@ -1,6 +1,7 @@
+ /*
+ * Copyright 2016-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
+ */
++import java.net.URL
+
+ val guavaVersion = "28.0-jre"
+
+@@ -8,6 +9,15 @@ dependencies {
+ compile("com.google.guava:guava:$guavaVersion")
+ }
+
+-externalDocumentationLink(
+- url = "https://google.github.io/guava/releases/$guavaVersion/api/docs/"
+-)
++tasks {
++ dokkaHtml {
++ dokkaSourceSets {
++ configureEach {
++ externalDocumentationLink {
++ url.set(URL("https://google.github.io/guava/releases/$guavaVersion/api/docs/"))
++ packageListUrl.set(projectDir.toPath().resolve("package.list").toUri().toURL())
++ }
++ }
++ }
++ }
++}
+diff --git a/integration/kotlinx-coroutines-play-services/build.gradle b/integration/kotlinx-coroutines-play-services/build.gradle
+index 29ce3d60..97f03e2e 100644
+--- a/integration/kotlinx-coroutines-play-services/build.gradle
++++ b/integration/kotlinx-coroutines-play-services/build.gradle
+@@ -36,10 +36,14 @@ dependencies {
+ }
+ }
+
+-tasks.withType(dokka.getClass()) {
+- externalDocumentationLink {
+- url = new URL("https://developers.google.com/android/reference/")
+- // This is workaround for missing package list in Google API
+- packageListUrl = projectDir.toPath().resolve("package.list").toUri().toURL()
++tasks.withType(dokkaHtml.getClass()) {
++ dokkaSourceSets{
++ configureEach{
++ externalDocumentationLink {
++ url.set(new URL("https://developers.google.com/android/reference/"))
++ // This is workaround for missing package list in Google API
++ packageListUrl.set(projectDir.toPath().resolve("package.list").toUri().toURL())
++ }
++ }
+ }
+ }
+diff --git a/integration/kotlinx-coroutines-slf4j/build.gradle.kts b/integration/kotlinx-coroutines-slf4j/build.gradle.kts
+index c7d0d82d..a8993dce 100644
+--- a/integration/kotlinx-coroutines-slf4j/build.gradle.kts
++++ b/integration/kotlinx-coroutines-slf4j/build.gradle.kts
+@@ -2,6 +2,8 @@
+ * Copyright 2016-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
+ */
+
++import java.net.URL
++
+ dependencies {
+ compile("org.slf4j:slf4j-api:1.7.25")
+ testCompile("io.github.microutils:kotlin-logging:1.5.4")
+@@ -9,6 +11,15 @@ dependencies {
+ testRuntime("ch.qos.logback:logback-core:1.2.3")
+ }
+
+-externalDocumentationLink(
+- url = "https://www.slf4j.org/apidocs/"
+-)
++tasks {
++ dokkaHtml {
++ dokkaSourceSets {
++ configureEach {
++ externalDocumentationLink {
++ url.set(URL("https://www.slf4j.org/apidocs/"))
++ packageListUrl.set(projectDir.toPath().resolve("package.list").toUri().toURL())
++ }
++ }
++ }
++ }
++}
+diff --git a/kotlinx-coroutines-core/build.gradle b/kotlinx-coroutines-core/build.gradle
+index f98f6a52..5f3cd967 100644
+--- a/kotlinx-coroutines-core/build.gradle
++++ b/kotlinx-coroutines-core/build.gradle
+@@ -158,13 +158,13 @@ kotlin.sourceSets {
+
+ task checkJdk16() {
+ // only fail w/o JDK_16 when actually trying to compile, not during project setup phase
+- doLast {
+- if (!System.env.JDK_16) {
+- throw new GradleException("JDK_16 environment variable is not defined. " +
+- "Can't build against JDK 1.6 runtime and run JDK 1.6 compatibility tests. " +
+- "Please ensure JDK 1.6 is installed and that JDK_16 points to it.")
+- }
+- }
++// doLast {
++// if (!System.env.JDK_16) {
++// throw new GradleException("JDK_16 environment variable is not defined. " +
++// "Can't build against JDK 1.6 runtime and run JDK 1.6 compatibility tests. " +
++// "Please ensure JDK 1.6 is installed and that JDK_16 points to it.")
++// }
++// }
+ }
+
+ tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile) {
+diff --git a/reactive/kotlinx-coroutines-jdk9/build.gradle.kts b/reactive/kotlinx-coroutines-jdk9/build.gradle.kts
+index c721746f..d839c3ec 100644
+--- a/reactive/kotlinx-coroutines-jdk9/build.gradle.kts
++++ b/reactive/kotlinx-coroutines-jdk9/build.gradle.kts
+@@ -1,6 +1,7 @@
+ /*
+ * Copyright 2016-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
+ */
++import java.net.URL
+
+ dependencies {
+ compile(project(":kotlinx-coroutines-reactive"))
+@@ -17,6 +18,15 @@ tasks {
+ }
+ }
+
+-externalDocumentationLink(
+- url = "https://docs.oracle.com/javase/9/docs/api/java/util/concurrent/Flow.html"
+-)
++tasks {
++ dokkaHtml {
++ dokkaSourceSets {
++ configureEach {
++ externalDocumentationLink {
++ url.set(URL("https://docs.oracle.com/javase/9/docs/api/java/util/concurrent/Flow.html"))
++ packageListUrl.set(projectDir.toPath().resolve("package.list").toUri().toURL())
++ }
++ }
++ }
++ }
++}
+diff --git a/reactive/kotlinx-coroutines-reactive/build.gradle.kts b/reactive/kotlinx-coroutines-reactive/build.gradle.kts
+index 2ace4f9f..0641395e 100644
+--- a/reactive/kotlinx-coroutines-reactive/build.gradle.kts
++++ b/reactive/kotlinx-coroutines-reactive/build.gradle.kts
+@@ -1,6 +1,7 @@
+ /*
+ * Copyright 2016-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
+ */
++import java.net.URL
+
+ val reactiveStreamsVersion = property("reactive_streams_version")
+
+@@ -31,6 +32,15 @@ tasks.check {
+ dependsOn(testNG)
+ }
+
+-externalDocumentationLink(
+- url = "https://www.reactive-streams.org/reactive-streams-$reactiveStreamsVersion-javadoc/"
+-)
++tasks {
++ dokkaHtml {
++ dokkaSourceSets {
++ configureEach {
++ externalDocumentationLink {
++ url.set(URL("https://www.reactive-streams.org/reactive-streams-$reactiveStreamsVersion-javadoc/"))
++ packageListUrl.set(projectDir.toPath().resolve("package.list").toUri().toURL())
++ }
++ }
++ }
++ }
++}
+diff --git a/reactive/kotlinx-coroutines-reactor/build.gradle.kts b/reactive/kotlinx-coroutines-reactor/build.gradle.kts
+index d5fd208a..d0133a22 100644
+--- a/reactive/kotlinx-coroutines-reactor/build.gradle.kts
++++ b/reactive/kotlinx-coroutines-reactor/build.gradle.kts
+@@ -1,6 +1,7 @@
+ /*
+ * Copyright 2016-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
+ */
++import java.net.URL
+
+ val reactorVersion = version("reactor")
+
+@@ -20,6 +21,15 @@ tasks {
+ }
+ }
+
+-externalDocumentationLink(
+- url = "https://projectreactor.io/docs/core/$reactorVersion/api/"
+-)
++tasks {
++ dokkaHtml {
++ dokkaSourceSets {
++ configureEach {
++ externalDocumentationLink {
++ url.set(URL("https://projectreactor.io/docs/core/$reactorVersion/api/"))
++ packageListUrl.set(projectDir.toPath().resolve("package.list").toUri().toURL())
++ }
++ }
++ }
++ }
++}
+diff --git a/reactive/kotlinx-coroutines-rx2/build.gradle b/reactive/kotlinx-coroutines-rx2/build.gradle
+index 6d2c4abc..57cdac2a 100644
+--- a/reactive/kotlinx-coroutines-rx2/build.gradle
++++ b/reactive/kotlinx-coroutines-rx2/build.gradle
+@@ -9,10 +9,14 @@ dependencies {
+ compile "io.reactivex.rxjava2:rxjava:$rxjava2_version"
+ }
+
+-tasks.withType(dokka.getClass()) {
+- externalDocumentationLink {
+- url = new URL('http://reactivex.io/RxJava/2.x/javadoc/')
+- packageListUrl = projectDir.toPath().resolve("package.list").toUri().toURL()
++tasks.withType(dokkaHtml.getClass()) {
++ dokkaSourceSets {
++ configureEach {
++ externalDocumentationLink {
++ url.set(new URL('http://reactivex.io/RxJava/2.x/javadoc/'))
++ packageListUrl.set(projectDir.toPath().resolve("package.list").toUri().toURL())
++ }
++ }
+ }
+ }
+
+diff --git a/reactive/kotlinx-coroutines-rx3/build.gradle b/reactive/kotlinx-coroutines-rx3/build.gradle
+index ced694ab..d5cd6319 100644
+--- a/reactive/kotlinx-coroutines-rx3/build.gradle
++++ b/reactive/kotlinx-coroutines-rx3/build.gradle
+@@ -18,10 +18,14 @@ compileKotlin {
+ kotlinOptions.jvmTarget = "1.8"
+ }
+
+-tasks.withType(dokka.getClass()) {
+- externalDocumentationLink {
+- url = new URL('http://reactivex.io/RxJava/3.x/javadoc/')
+- packageListUrl = projectDir.toPath().resolve("package.list").toUri().toURL()
++tasks.withType(dokkaHtml.getClass()) {
++ dokkaSourceSets {
++ configureEach {
++ externalDocumentationLink {
++ url.set(new URL('http://reactivex.io/RxJava/3.x/javadoc/'))
++ packageListUrl.set(projectDir.toPath().resolve("package.list").toUri().toURL())
++ }
++ }
+ }
+ }
+
+diff --git a/settings.gradle b/settings.gradle
+index d22d65fd..497eebf1 100644
+--- a/settings.gradle
++++ b/settings.gradle
+@@ -11,7 +11,7 @@ pluginManagement {
+ id "me.champeau.gradle.jmh" version "0.5.0"
+ }
+ }
+-
++apply from: "../template.settings.gradle.kts"
+ rootProject.name = 'kotlinx.coroutines'
+ enableFeaturePreview('GRADLE_METADATA')
+
+diff --git a/ui/kotlinx-coroutines-android/build.gradle.kts b/ui/kotlinx-coroutines-android/build.gradle.kts
+index 4f247883..11dbabf0 100644
+--- a/ui/kotlinx-coroutines-android/build.gradle.kts
++++ b/ui/kotlinx-coroutines-android/build.gradle.kts
+@@ -57,6 +57,15 @@ tasks.test {
+ }
+ }
+
+-externalDocumentationLink(
+- url = "https://developer.android.com/reference/"
+-)
++tasks {
++ dokkaHtml {
++ dokkaSourceSets {
++ configureEach {
++ externalDocumentationLink {
++ url.set(URL("https://developer.android.com/reference/"))
++ packageListUrl.set(projectDir.toPath().resolve("package.list").toUri().toURL())
++ }
++ }
++ }
++ }
++}
diff --git a/integration-tests/gradle/projects/coroutines/kotlinx-coroutines b/integration-tests/gradle/projects/coroutines/kotlinx-coroutines
new file mode 160000
+Subproject 768e92bec37fa86026237e5d9780a85b4df7790
diff --git a/integration-tests/gradle/projects/coroutines/template.root.gradle.kts b/integration-tests/gradle/projects/coroutines/template.root.gradle.kts
new file mode 120000
index 00000000..895ca83d
--- /dev/null
+++ b/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/integration-tests/gradle/projects/coroutines/template.settings.gradle.kts b/integration-tests/gradle/projects/coroutines/template.settings.gradle.kts
new file mode 120000
index 00000000..7b43b3e7
--- /dev/null
+++ b/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/integration-tests/gradle/projects/serialization/kotlinx-serialization b/integration-tests/gradle/projects/serialization/kotlinx-serialization
new file mode 160000
+Subproject 66f323855cf745f3896023e6c2079621f7940c2
diff --git a/integration-tests/gradle/projects/serialization/serialization.diff b/integration-tests/gradle/projects/serialization/serialization.diff
new file mode 100644
index 00000000..a7fad66b
--- /dev/null
+++ b/integration-tests/gradle/projects/serialization/serialization.diff
@@ -0,0 +1,48 @@
+diff --git a/build.gradle b/build.gradle
+index f1cd0012..d1d3b6c6 100644
+--- a/build.gradle
++++ b/build.gradle
+@@ -73,7 +73,6 @@ buildscript {
+ dependencies {
+ 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.kotlinx:binary-compatibility-validator:$validator_version"
+ classpath "org.jetbrains.kotlinx:kotlinx-knit:$knit_version"
+
+@@ -86,6 +85,11 @@ buildscript {
+ }
+ }
+
++plugins {
++ id("org.jetbrains.dokka")
++}
++
++apply from: "../template.root.gradle.kts"
+ // To make it visible for compiler-version.gradle
+ ext.compilerVersion = org.jetbrains.kotlin.config.KotlinCompilerVersion.VERSION
+ apply plugin: 'binary-compatibility-validator'
+diff --git a/gradle.properties b/gradle.properties
+index c753aa76..ee9e725a 100644
+--- a/gradle.properties
++++ b/gradle.properties
+@@ -5,6 +5,7 @@
+ group=org.jetbrains.kotlinx
+ version=1.0.0
+
++dokka_it_kotlin_version=
+ kotlin.version=1.4.10
+
+ # This version take precedence if 'bootstrap' property passed to project
+diff --git a/settings.gradle b/settings.gradle
+index 88bcb942..848efd27 100644
+--- a/settings.gradle
++++ b/settings.gradle
+@@ -2,6 +2,7 @@
+ * Copyright 2017-2020 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 = 'kotlinx-serialization'
+ enableFeaturePreview('GRADLE_METADATA')
+
diff --git a/integration-tests/gradle/projects/serialization/template.root.gradle.kts b/integration-tests/gradle/projects/serialization/template.root.gradle.kts
new file mode 120000
index 00000000..895ca83d
--- /dev/null
+++ b/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/integration-tests/gradle/projects/serialization/template.settings.gradle.kts b/integration-tests/gradle/projects/serialization/template.settings.gradle.kts
new file mode 120000
index 00000000..7b43b3e7
--- /dev/null
+++ b/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/integration-tests/gradle/projects/stdlib/kotlin-dokka-stdlib b/integration-tests/gradle/projects/stdlib/kotlin-dokka-stdlib
new file mode 160000
+Subproject 10ed102f01ee37f3bacbe86171afec06898dad5
diff --git a/integration-tests/gradle/projects/stdlib/stdlib.diff b/integration-tests/gradle/projects/stdlib/stdlib.diff
new file mode 100644
index 00000000..b7f7e30d
--- /dev/null
+++ b/integration-tests/gradle/projects/stdlib/stdlib.diff
@@ -0,0 +1,567 @@
+diff --git a/ant/build.gradle b/ant/build.gradle
+deleted file mode 100644
+index 4dcb55f..0000000
+--- a/ant/build.gradle
++++ /dev/null
+@@ -1,29 +0,0 @@
+-apply plugin: 'de.undercouch.download'
+-
+-final String ext
+-if (System.getProperty('os.name', '').toLowerCase().contains('windows')) {
+- ext = ".bat"
+-} else {
+- ext = ""
+-}
+-
+-
+-final String antVersion = "1.10.8"
+-final String antURL = "https://cache-redirector.jetbrains.com/downloads.apache.org/ant/binaries/apache-ant-$antVersion-bin.zip"
+-final File antHome = new File(buildDir, "ant-home")
+-final File antZip = new File(buildDir, "apache-ant-$antVersion-bin.zip")
+-final File antExe = new File(antHome, "apache-ant-$antVersion/bin/ant$ext")
+-
+-task downloadAnt(type: Download) {
+- src antURL
+- dest buildDir
+- overwrite false
+-}
+-
+-task extractAnt(type: Sync, dependsOn: downloadAnt) {
+- from zipTree(antZip)
+- into antHome
+-}
+-
+-project.extensions.ant_exe = antExe
+-
+diff --git a/build.gradle b/build.gradle
+index aa8f21b..dd6a2ae 100644
+--- a/build.gradle
++++ b/build.gradle
+@@ -1,80 +1,424 @@
++import org.jetbrains.dokka.Platform
++
+ plugins {
+- id "de.undercouch.download" version "3.4.3"
+- id 'com.github.jk1.tcdeps' version '0.17'
++ id "de.undercouch.download" version "3.4.3"
++ id 'com.github.jk1.tcdeps' version '0.17'
++ id "java"
++ id "org.jetbrains.dokka"
+ }
+-
++apply from: "../template.root.gradle.kts"
+
+ configurations {
+- dokka
+- kotlin_sources
++ kotlin_sources
+ }
+
+-final String dokka_build = "611"
+-final String dokka_version = "0.10.2-SNAPSHOT"
+-
+ repositories {
+- mavenLocal()
+- maven { url = "https://dl.bintray.com/kotlin/kotlin-dev" }
+- maven { url = "https://dl.bintray.com/kotlin/kotlin-eap" }
+- maven { url = "https://teamcity.jetbrains.com/guestAuth/repository/download/Kotlin_Dokka_DokkaAntMavenGradle/$dokka_build/maven" }
+- jcenter()
++ mavenLocal()
++ mavenCentral()
++ maven { url = "https://dl.bintray.com/kotlin/kotlin-eap" }
++ maven { url = "https://dl.bintray.com/kotlin/kotlin-dev" }
++ maven { url = "https://teamcity.jetbrains.com/guestAuth/repository/download/Kotlin_Dokka_DokkaAntMavenGradle/$dokka_build/maven" }
++ jcenter()
+ }
+
+-dependencies {
+- dokka "org.jetbrains.dokka:dokka-fatjar:$dokka_version"
+-}
+-
+-final File dokkaHome = new File(buildDir, "dokka-home")
+-task setupDokka(type: Sync) {
+- from configurations.dokka
+- into dokkaHome
+-}
+-
+-task extractAll(dependsOn: [setupDokka])
++task extractAll()
+
+ extractAll.dependsOn ':kotlin_big:extractLibs'
+ extractAll.dependsOn ':kotlin_big:extractSources'
+ extractAll.dependsOn ':kotlin_big:extractKotlinSources'
+ extractAll.dependsOn ':kotlin_native:extractKotlinNative'
+-extractAll.dependsOn ':ant:extractAnt'
+
+-def pAnt() { return project(':ant').extensions }
+ def pKotlinBig() { return project(':kotlin_big').extensions }
++
+ def pKotlinNative() { return project(':kotlin_native').extensions }
+
+ task cleanupSources(type: Delete) {
+- dependsOn extractAll
+- doFirst {
+- def base = file("${pKotlinNative().kotlin_native_root}/runtime/src/main/kotlin")
+- delete(files("$base/kotlin/Functions.kt", "$base/kotlin/coroutines/SuspendFunctions.kt",
+- "$base/kotlin/reflect/KFunctions.kt"))
+- }
++ dependsOn extractAll
++ doFirst {
++ def base = file("${pKotlinNative().kotlin_native_root}/runtime/src/main/kotlin")
++ delete(files("$base/kotlin/Functions.kt", "$base/kotlin/coroutines/SuspendFunctions.kt",
++ "$base/kotlin/reflect/KFunctions.kt"))
++ }
+ }
+
+-task setupCallDokka() { }
+-task callDokka(type: Exec, dependsOn: [extractAll, setupCallDokka, cleanupSources]) {
+- workingDir = projectDir
+- // -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005
+- environment("ANT_OPTS", "-Xmx3G")
+- environment("JAVA_HOME", System.getProperty("java.home"))
+- doFirst {
+- def logFile = file("$buildDir/dokka.log")
+- standardOutput = new org.apache.tools.ant.util.TeeOutputStream(standardOutput, new FileOutputStream(logFile))
+- }
++def outputDir = "$buildDir/dokka"
++
++
++task callDokka() {
++ delete(outputDir)
++ dependsOn = [extractAll, cleanupSources]
++}
++
++gradle.projectsEvaluated {
++ def kotlin_root = pKotlinBig().kotlin_root
++ def kotlin_sources = pKotlinBig().kotlin_sources
++ def kotlin_libs = pKotlinBig().kotlin_libs
++ def kotlin_native_root = pKotlinNative().kotlin_native_root
++ def kotlin_native_linux = pKotlinNative().kotlin_native_bin_linux
++ def kotlin_native_windows = pKotlinNative().kotlin_native_bin_windows
++ def kotlin_native_mac = pKotlinNative().kotlin_native_bin_mac
++ def stdlibIncludeMd = "$kotlin_root/libraries/stdlib/src/Module.md"
++ def stdlibSamples = "$kotlin_root/libraries/stdlib/samples/test"
++ def kotlinTestIncludeMd = "$kotlin_root/libraries/kotlin.test/Module.md"
++
++ def stdlibCommonClasspath = ["$kotlin_libs/kotlin-stdlib-common/".toString(), "$kotlin_sources/kotlin-stdlib-common/".toString()]
++ def stdlibJvmClasspath = ["$kotlin_libs/kotlin-stdlib/".toString(), "$kotlin_sources/kotlin-stdlib-jdk7/".toString(), "$kotlin_libs/kotlin-stdlib-jdk8/".toString(), "$kotlin_sources/kotlin-stdlib/".toString(), "$kotlin_sources/kotlin-stdlib-common/".toString(), "$kotlin_root/core/reflection.jvm/src".toString()]
++ def stdlibNativeClasspath = ["$kotlin_native_linux/klib/common/stdlib".toString()]
++ def stdlibJsClasspath = ["$kotlin_libs/kotlin-stdlib-js/".toString()]
++ def kotlinTestCommonClasspath = ["$kotlin_libs/kotlin-test-common".toString()]
++ def kotlinTestJunitClasspath = ["$kotlin_libs/kotlin-test-junit".toString()]
++ def kotlinTestJunit5Classpath = ["$kotlin_libs/kotlin-test-junit5".toString()]
++ def kotlinTestTestngClasspath = ["$kotlin_libs/kotlin-test-testng".toString()]
++ def kotlinTestJsClasspath = ["$kotlin_libs/kotlin-test-js".toString()]
++ def kotlinTestJvmClasspath = ["$kotlin_libs/kotlin-test".toString()]
++
++
++ def stdlibPackageList = new URL("file:///$outputDir/kotlin-stdlib/kotlin-stdlib/package-list".toString())
++ def junit5PackageList = new URL("https://junit.org/junit5/docs/current/api/element-list".toString())
++ def kotlinLanguageVersion = "1.4"
++
++ task dokkaStdlib(type: org.jetbrains.dokka.gradle.DokkaTask) {
++ outputDirectory.set(new File(outputDir, "/kotlin-stdlib"))
++ moduleName.set("kotlin-stdlib")
++ dokkaSourceSets {
++ register("kotlin-stdlib-common") {
++ skipDeprecated.set(false)
++ jdkVersion.set(8)
++ platform.set(Platform.common)
++ includes.from(stdlibIncludeMd.toString())
++ noStdlibLink.set(true)
++ noJdkLink.set(true)
++ classpath.setFrom(stdlibCommonClasspath)
++ languageVersion.set(kotlinLanguageVersion)
++
++ samples.from(stdlibSamples.toString())
++ displayName.set("Common")
++ sourceRoots.from("$kotlin_root/core/builtins/native")
++ sourceRoots.from("$kotlin_root/core/builtins/src")
++ sourceRoots.from("$kotlin_sources/kotlin-stdlib-common")
++ }
++
++ register("kotlin-stdlib-java-common") {
++ skipDeprecated.set(false)
++ jdkVersion.set(8)
++ platform.set(Platform.jvm)
++ includes.from(stdlibIncludeMd.toString())
++ noStdlibLink.set(true)
++ classpath.setFrom(stdlibJvmClasspath + stdlibCommonClasspath)
++ languageVersion.set(kotlinLanguageVersion)
++
++ samples.from(stdlibSamples.toString())
++ displayName.set("JRE")
++ dependsOn("kotlin-stdlib-common")
++ sourceRoots.from("$kotlin_sources/kotlin-stdlib")
++ sourceRoots.from("$kotlin_root/core/reflection.jvm/src")
++ sourceRoots.from("$kotlin_root/libraries/stdlib/jvm/runtime/kotlin/jvm/annotations")
++ sourceRoots.from("$kotlin_root/libraries/stdlib/jvm/runtime/kotlin/jvm/JvmClassMapping.kt")
++ sourceRoots.from("$kotlin_root/libraries/stdlib/jvm/runtime/kotlin/jvm/PurelyImplements.kt")
++ sourceRoots.from("$kotlin_root/libraries/stdlib/jvm/runtime/kotlin/TypeAliases.kt")
++ sourceRoots.from("$kotlin_root/libraries/stdlib/jvm/runtime/kotlin/text/TypeAliases.kt")
++ perPackageOption {
++ prefix.set("kotlin.reflect.jvm.internal")
++ suppress.set(true)
++ }
++ perPackageOption {
++ prefix.set("kotlin.jvm.functions")
++ suppress.set(true)
++ }
++ perPackageOption {
++ prefix.set("kotlin.jvm.internal")
++ suppress.set(true)
++ }
++ perPackageOption {
++ prefix.set("kotlin.coroutines.jvm.internal")
++ suppress.set(true)
++ }
++ perPackageOption {
++ prefix.set("kotlin.coroutines.experimental.migration")
++ suppress.set(true)
++ }
++ }
++
++
++ register("kotlin-stdlib-jdk8") {
++ skipDeprecated.set(false)
++ jdkVersion.set(8)
++ platform.set(Platform.jvm)
++ includes.from(stdlibIncludeMd.toString())
++ noStdlibLink.set(true)
++ classpath.setFrom(stdlibJvmClasspath + stdlibCommonClasspath)
++ languageVersion.set(kotlinLanguageVersion)
++
++ samples.from(stdlibSamples.toString())
++ displayName.set("JRE8")
++ dependsOn("kotlin-stdlib-java-common")
++ dependsOn("kotlin-stdlib-common")
++ sourceRoots.setFrom("$kotlin_sources/kotlin-stdlib-jdk8/")
++ perPackageOption {
++ prefix.set("kotlin.reflect.jvm.internal")
++ suppress.set(true)
++ }
++ perPackageOption {
++ prefix.set("kotlin.jvm.functions")
++ suppress.set(true)
++ }
++ perPackageOption {
++ prefix.set("kotlin.jvm.internal")
++ suppress.set(true)
++ }
++ perPackageOption {
++ prefix.set("kotlin.coroutines.jvm.internal")
++ suppress.set(true)
++ }
++ perPackageOption {
++ prefix.set("kotlin.coroutines.experimental.migration")
++ suppress.set(true)
++ }
++ }
++
++ register("kotlin-stdlib-jdk7") {
++ skipDeprecated.set(false)
++ jdkVersion.set(8)
++ platform.set(Platform.jvm)
++ includes.from(stdlibIncludeMd.toString())
++ noStdlibLink.set(true)
++ classpath.setFrom(stdlibJvmClasspath + stdlibCommonClasspath)
++ languageVersion.set(kotlinLanguageVersion)
++
++
++ samples.from(stdlibSamples.toString())
++ displayName.set("JRE7")
++ dependsOn("kotlin-stdlib-java-common")
++ dependsOn("kotlin-stdlib-common")
++ sourceRoots.from("$kotlin_sources/kotlin-stdlib-jdk7")
++ perPackageOption {
++ prefix.set("kotlin.reflect.jvm.internal")
++ suppress.set(true)
++ }
++ perPackageOption {
++ prefix.set("kotlin.jvm.functions")
++ suppress.set(true)
++ }
++ perPackageOption {
++ prefix.set("kotlin.jvm.internal")
++ suppress.set(true)
++ }
++ perPackageOption {
++ prefix.set("kotlin.coroutines.jvm.internal")
++ suppress.set(true)
++ }
++ perPackageOption {
++ prefix.set("kotlin.coroutines.experimental.migration")
++ suppress.set(true)
++ }
++ }
++
++
++ register("kotlin-stdlib-js") {
++ skipDeprecated.set(false)
++ jdkVersion.set(8)
++ platform.set(Platform.js)
++ includes.from(stdlibIncludeMd.toString())
++ noStdlibLink.set(true)
++ noJdkLink.set(true)
++ classpath.setFrom(stdlibJsClasspath + stdlibCommonClasspath)
++ languageVersion.set(kotlinLanguageVersion)
++
++ samples.from(stdlibSamples.toString())
++ displayName.set("JS")
++ dependsOn("kotlin-stdlib-common")
++
++ sourceRoots.from("$kotlin_sources/kotlin-stdlib-js")
++ perPackageOption {
++ prefix.set("org.w3c")
++ reportUndocumented.set(false)
++ }
++ perPackageOption {
++ prefix.set("org.khronos")
++ reportUndocumented.set(false)
++ }
++ perPackageOption {
++ prefix.set("jquery")
++ suppress.set(true)
++ }
++ perPackageOption {
++ prefix.set("kotlin.reflect.jvm.internal")
++ suppress.set(true)
++ }
++ perPackageOption {
++ prefix.set("kotlin.js.internal")
++ suppress.set(true)
++ }
++ }
++
++ register("kotlin-stdlib-native") {
++ skipDeprecated.set(false)
++ jdkVersion.set(8)
++ platform.set(Platform.native)
++ includes.from(stdlibIncludeMd.toString())
++ noStdlibLink.set(true)
++ noJdkLink.set(true)
++ classpath.setFrom(stdlibNativeClasspath + stdlibCommonClasspath)
++ languageVersion.set(kotlinLanguageVersion)
++
++ samples.from(stdlibSamples.toString())
++ displayName.set("Native")
++ dependsOn("kotlin-stdlib-common")
++
++ sourceRoots.from("$kotlin_native_root/Interop/Runtime/src/main/kotlin")
++ sourceRoots.from("$kotlin_native_root/Interop/Runtime/src/native/kotlin")
++ sourceRoots.from("$kotlin_native_root/Interop/JsRuntime/src/main/kotlin")
++ sourceRoots.from("$kotlin_native_root/runtime/src/main/kotlin")
++ perPackageOption {
++ prefix.set("kotlin.native.internal")
++ suppress.set(true)
++ }
++ perPackageOption {
++ prefix.set("kotlin.test")
++ suppress.set(true)
++ }
++ }
++ }
++ }
++
++ task dokkaKotlinTest(type: org.jetbrains.dokka.gradle.DokkaTask) {
++ outputDirectory.set(new File(outputDir, "kotlin.test"))
++ moduleName.set("kotlin.test")
++ dokkaSourceSets {
++ "kotlin-test-common" {
++ skipDeprecated.set(false)
++ jdkVersion.set(8)
++ platform.set(Platform.common)
++ includes.from(kotlinTestIncludeMd.toString())
++ classpath.setFrom(kotlinTestCommonClasspath)
++ languageVersion.set(kotlinLanguageVersion)
++
++ displayName.set("Common")
++ sourceRoots.from("$kotlin_root/libraries/kotlin.test/common/src/main/kotlin")
++ sourceRoots.from("$kotlin_root/libraries/kotlin.test/annotations-common/src/main/kotlin")
++ }
++
++ "kotlin-test-jvm" {
++ skipDeprecated.set(false)
++ jdkVersion.set(8)
++ platform.set(Platform.jvm)
++ includes.from(kotlinTestIncludeMd.toString())
++ classpath.setFrom(kotlinTestJvmClasspath)
++ languageVersion.set(kotlinLanguageVersion)
++
++ displayName.set("JVM")
++ sourceRoots.from("$kotlin_root/libraries/kotlin.test/jvm/src/main/kotlin")
++ perPackageOption {
++ prefix.set("org.junit")
++ skipDeprecated.set(true)
++ }
++ }
++
++ "kotlin-test-JUnit" {
++ skipDeprecated.set(false)
++ jdkVersion.set(8)
++ platform.set(Platform.jvm)
++ includes.from(kotlinTestIncludeMd.toString())
++ classpath.setFrom(kotlinTestJunitClasspath)
++ languageVersion.set(kotlinLanguageVersion)
++
++ displayName.set("JUnit")
++ sourceRoots.from("$kotlin_root/libraries/kotlin.test/junit/src/main/kotlin")
++ externalDocumentationLink {
++ url.set(new URL("https://kotlinlang.org/api/latest/jvm/stdlib/"))
++ packageListUrl.set(stdlibPackageList)
++ }
++ externalDocumentationLink {
++ url.set(new URL("http://junit.org/junit4/javadoc/latest/"))
++ packageListUrl.set(new URL("http://junit.org/junit4/javadoc/latest/package-list"))
++ }
++ }
++
++ "kotlin-test-JUnit5" {
++ skipDeprecated.set(false)
++ jdkVersion.set(8)
++ platform.set(Platform.jvm)
++ includes.from(kotlinTestIncludeMd.toString())
++ classpath.setFrom(kotlinTestJunit5Classpath)
++ languageVersion.set(kotlinLanguageVersion)
++
++ displayName.set("JUnit5")
++ sourceRoots.from("$kotlin_root/libraries/kotlin.test/junit5/src/main/kotlin")
++ externalDocumentationLink {
++ url.set(new URL("https://kotlinlang.org/api/latest/jvm/stdlib/"))
++ packageListUrl.set(stdlibPackageList)
++ }
++ externalDocumentationLink {
++ url.set(new URL("https://junit.org/junit5/docs/current/api/"))
++ packageListUrl.set(junit5PackageList)
++ }
++ }
++
++ "kotlin-test-TestNG" {
++ skipDeprecated.set(false)
++ jdkVersion.set(8)
++ platform.set(Platform.jvm)
++ includes.from(kotlinTestIncludeMd.toString())
++ classpath.setFrom(kotlinTestTestngClasspath)
++ languageVersion.set(kotlinLanguageVersion)
++
++ displayName.set("TestNG")
++ sourceRoots.from("$kotlin_root/libraries/kotlin.test/testng/src/main/kotlin")
++ externalDocumentationLink {
++ url.set(new URL("https://kotlinlang.org/api/latest/jvm/stdlib/"))
++ packageListUrl.set(stdlibPackageList)
++ }
++ externalDocumentationLink {
++ url.set(new URL("https://jitpack.io/com/github/cbeust/testng/master/javadoc/"))
++ packageListUrl.set(new URL("https://jitpack.io/com/github/cbeust/testng/master/javadoc/package-list"))
++ }
++ }
++
++ "kotlin-test-js" {
++ skipDeprecated.set(false)
++ jdkVersion.set(8)
++ platform.set(Platform.js)
++ includes.from(kotlinTestIncludeMd.toString())
++ classpath.setFrom(kotlinTestJsClasspath)
++ languageVersion.set(kotlinLanguageVersion)
++
++ displayName.set("JS")
++ sourceRoots.from("$kotlin_root/libraries/kotlin.test/js/src/main/kotlin")
++ perPackageOption {
++ prefix.set("org.junit")
++ skipDeprecated.set(true)
++ }
++ externalDocumentationLink {
++ url.set(new URL("https://kotlinlang.org/api/latest/jvm/stdlib/"))
++ packageListUrl.set(stdlibPackageList)
++ }
++ }
++
++ "kotlin-test-native" {
++ skipDeprecated.set(false)
++ jdkVersion.set(8)
++ platform.set(Platform.native)
++ includes.from(kotlinTestIncludeMd.toString())
++ classpath.setFrom(kotlinTestJsClasspath)
++ languageVersion.set(kotlinLanguageVersion)
++
++ displayName.set("Native")
++ sourceRoots.from("$kotlin_native_root/runtime/src/main/kotlin/kotlin/test")
++ externalDocumentationLink {
++ url.set(new URL("https://kotlinlang.org/api/latest/jvm/stdlib/"))
++ packageListUrl.set(stdlibPackageList)
++ }
++ }
++ }
++ }
++
++
++ callDokka.finalizedBy dokkaStdlib
++ dokkaStdlib.finalizedBy dokkaKotlinTest
+ }
+
+-setupCallDokka.doLast {
+-
+- callDokka.commandLine = [
+- pAnt().ant_exe.path,
+- "-f", file("build-docs.xml").path,
+- "v2",
+- "-Dkotlin_root=${pKotlinBig().kotlin_root}",
+- "-Dkotlin_sources=${pKotlinBig().kotlin_sources}",
+- "-Dkotlin_libs=${pKotlinBig().kotlin_libs}",
+- "-Dkotlin_native_root=${pKotlinNative().kotlin_native_root}",
+- "-Dkotlin_native_linux=${pKotlinNative().kotlin_native_bin_linux}",
+- "-Dkotlin_native_windows=${pKotlinNative().kotlin_native_bin_windows}",
+- "-Dkotlin_native_mac=${pKotlinNative().kotlin_native_bin_mac}",
+- ]
++tasks {
++ doLast {
++ println(" ##teamcity[publishArtifacts '${outputDir}/kotlin.test => kotlin.test.zip'] ")
++ }
+ }
+diff --git a/gradle.properties b/gradle.properties
+new file mode 100644
+index 0000000..76356e8
+--- /dev/null
++++ b/gradle.properties
+@@ -0,0 +1,3 @@
++dokka_build = 611
++dokka_version = 1.4.20-SNAPSHOT
++org.gradle.jvmargs=-Xmx4096m
+diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
+index d76b502..5028f28 100644
+--- a/gradle/wrapper/gradle-wrapper.properties
++++ b/gradle/wrapper/gradle-wrapper.properties
+@@ -1,5 +1,5 @@
+ distributionBase=GRADLE_USER_HOME
+ distributionPath=wrapper/dists
+-distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.2-all.zip
++distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-bin.zip
+ zipStoreBase=GRADLE_USER_HOME
+ zipStorePath=wrapper/dists
+diff --git a/settings.gradle b/settings.gradle
+index 5209245..bd38b18 100644
+--- a/settings.gradle
++++ b/settings.gradle
+@@ -1,5 +1,21 @@
++pluginManagement {
++ resolutionStrategy {
++ eachPlugin {
++ if (requested.id.id == "org.jetbrains.dokka") {
++ useModule("org.jetbrains.dokka:dokka-gradle-plugin:${requested.version}")
++ }
++ }
++ }
++ repositories {
++ mavenLocal()
++ maven {
++ url "https://dl.bintray.com/kotlin/kotlin-dev"
++ }
++ gradlePluginPortal()
++ }
++}
++apply from: "../template.settings.gradle.kts"
+ rootProject.name = 'kotlin-dokka-stdlib'
+
+ include 'kotlin_native'
+ include 'kotlin_big'
+-include 'ant'
diff --git a/integration-tests/gradle/projects/stdlib/template.root.gradle.kts b/integration-tests/gradle/projects/stdlib/template.root.gradle.kts
new file mode 120000
index 00000000..895ca83d
--- /dev/null
+++ b/integration-tests/gradle/projects/stdlib/template.root.gradle.kts
@@ -0,0 +1 @@
+../template.root.gradle.kts \ No newline at end of file
diff --git a/integration-tests/gradle/projects/stdlib/template.settings.gradle.kts b/integration-tests/gradle/projects/stdlib/template.settings.gradle.kts
new file mode 120000
index 00000000..7b43b3e7
--- /dev/null
+++ b/integration-tests/gradle/projects/stdlib/template.settings.gradle.kts
@@ -0,0 +1 @@
+../template.settings.gradle.kts \ No newline at end of file
diff --git a/integration-tests/gradle/src/integrationTest/kotlin/org/jetbrains/dokka/it/gradle/kotlin/CoroutinesGradleIntegrationTest.kt b/integration-tests/gradle/src/integrationTest/kotlin/org/jetbrains/dokka/it/gradle/kotlin/CoroutinesGradleIntegrationTest.kt
new file mode 100644
index 00000000..b4978ea9
--- /dev/null
+++ b/integration-tests/gradle/src/integrationTest/kotlin/org/jetbrains/dokka/it/gradle/kotlin/CoroutinesGradleIntegrationTest.kt
@@ -0,0 +1,50 @@
+package org.jetbrains.dokka.it.gradle.kotlin
+
+import org.gradle.testkit.runner.TaskOutcome
+import org.jetbrains.dokka.it.S3Project
+import org.jetbrains.dokka.it.copyAndApplyGitDiff
+import org.jetbrains.dokka.it.gradle.*
+import org.junit.runners.Parameterized
+import java.io.File
+import kotlin.test.*
+
+class CoroutinesGradleIntegrationTest(override val versions: BuildVersions) : AbstractGradleIntegrationTest(),
+ S3Project {
+
+ companion object {
+ @get:JvmStatic
+ @get:Parameterized.Parameters(name = "{0}")
+ val versions = BuildVersions.permutations(
+ gradleVersions = listOf("6.3"),
+ kotlinVersions = listOf("1.4.10")
+ )
+ }
+
+ override val projectOutputLocation: File by lazy { File(projectDir, "build/dokka/htmlMultiModule") }
+
+ @BeforeTest
+ fun prepareProjectFiles() {
+ val templateProjectDir = File("projects", "coroutines/kotlinx-coroutines")
+ templateProjectDir.listFiles().orEmpty()
+ .forEach { topLevelFile -> topLevelFile.copyRecursively(File(projectDir, topLevelFile.name)) }
+
+ copyAndApplyGitDiff(File("projects", "coroutines/coroutines.diff"))
+ }
+
+ @Test
+ fun execute() {
+ val result = createGradleRunner(":dokkaHtmlMultiModule", "-i", "-s").buildRelaxed()
+
+ assertEquals(TaskOutcome.SUCCESS, assertNotNull(result.task(":dokkaHtmlMultiModule")).outcome)
+
+ assertTrue(projectOutputLocation.isDirectory, "Missing dokka output directory")
+
+ projectOutputLocation.allHtmlFiles().forEach { file ->
+// assertContainsNoErrorClass(file)
+// assertNoUnresolvedLinks(file)
+// assertNoHrefToMissingLocalFileOrDirectory(file)
+ assertNoEmptyLinks(file)
+ assertNoEmptySpans(file)
+ }
+ }
+}
diff --git a/integration-tests/gradle/src/integrationTest/kotlin/org/jetbrains/dokka/it/gradle/kotlin/SerializationGradleIntegrationTest.kt b/integration-tests/gradle/src/integrationTest/kotlin/org/jetbrains/dokka/it/gradle/kotlin/SerializationGradleIntegrationTest.kt
new file mode 100644
index 00000000..e097369f
--- /dev/null
+++ b/integration-tests/gradle/src/integrationTest/kotlin/org/jetbrains/dokka/it/gradle/kotlin/SerializationGradleIntegrationTest.kt
@@ -0,0 +1,49 @@
+package org.jetbrains.dokka.it.gradle.kotlin
+
+import org.gradle.testkit.runner.TaskOutcome
+import org.jetbrains.dokka.it.S3Project
+import org.jetbrains.dokka.it.copyAndApplyGitDiff
+import org.jetbrains.dokka.it.gradle.*
+import org.junit.runners.Parameterized
+import java.io.File
+import kotlin.test.*
+
+class SerializationGradleIntegrationTest(override val versions: BuildVersions) : AbstractGradleIntegrationTest(),
+ S3Project {
+
+ companion object {
+ @get:JvmStatic
+ @get:Parameterized.Parameters(name = "{0}")
+ val versions = BuildVersions.permutations(
+ gradleVersions = listOf("6.3"),
+ kotlinVersions = listOf("1.4.10")
+ )
+ }
+
+ override val projectOutputLocation: File by lazy { File(projectDir, "build/dokka/htmlMultiModule") }
+
+ @BeforeTest
+ fun prepareProjectFiles() {
+ val templateProjectDir = File("projects", "serialization/kotlinx-serialization")
+ templateProjectDir.listFiles().orEmpty()
+ .forEach { topLevelFile -> topLevelFile.copyRecursively(File(projectDir, topLevelFile.name)) }
+ copyAndApplyGitDiff(File("projects", "serialization/serialization.diff"))
+ }
+
+ @Test
+ fun execute() {
+ val result = createGradleRunner(":dokkaHtmlMultiModule", "-i", "-s").buildRelaxed()
+
+ assertEquals(TaskOutcome.SUCCESS, assertNotNull(result.task(":dokkaHtmlMultiModule")).outcome)
+
+ assertTrue(projectOutputLocation.isDirectory, "Missing dokka output directory")
+
+ projectOutputLocation.allHtmlFiles().forEach { file ->
+ assertContainsNoErrorClass(file)
+ assertNoUnresolvedLinks(file)
+// assertNoHrefToMissingLocalFileOrDirectory(file)
+ assertNoEmptyLinks(file)
+ assertNoEmptySpans(file)
+ }
+ }
+}
diff --git a/integration-tests/gradle/src/integrationTest/kotlin/org/jetbrains/dokka/it/gradle/kotlin/StdlibGradleIntegrationTest.kt b/integration-tests/gradle/src/integrationTest/kotlin/org/jetbrains/dokka/it/gradle/kotlin/StdlibGradleIntegrationTest.kt
new file mode 100644
index 00000000..ca768962
--- /dev/null
+++ b/integration-tests/gradle/src/integrationTest/kotlin/org/jetbrains/dokka/it/gradle/kotlin/StdlibGradleIntegrationTest.kt
@@ -0,0 +1,50 @@
+package org.jetbrains.dokka.it.gradle.kotlin
+
+import org.gradle.testkit.runner.TaskOutcome
+import org.jetbrains.dokka.it.S3Project
+import org.jetbrains.dokka.it.copyAndApplyGitDiff
+import org.jetbrains.dokka.it.gradle.*
+import org.junit.runners.Parameterized
+import java.io.File
+import kotlin.test.*
+
+class StdlibGradleIntegrationTest(override val versions: BuildVersions) : AbstractGradleIntegrationTest(),
+ S3Project {
+
+ companion object {
+ @get:JvmStatic
+ @get:Parameterized.Parameters(name = "{0}")
+ val versions = BuildVersions.permutations(
+ gradleVersions = listOf("5.6"),
+ kotlinVersions = listOf("1.4.10")
+ )
+ }
+
+ override val projectOutputLocation: File by lazy { File(projectDir, "build/dokka/kotlin-stdlib") }
+
+ @BeforeTest
+ fun prepareProjectFiles() {
+ val templateProjectDir = File("projects", "stdlib/kotlin-dokka-stdlib")
+ templateProjectDir.listFiles().orEmpty()
+ .forEach { topLevelFile -> topLevelFile.copyRecursively(File(projectDir, topLevelFile.name)) }
+
+ copyAndApplyGitDiff(File("projects", "stdlib/stdlib.diff"))
+ }
+
+ @Test
+ fun execute() {
+ val result = createGradleRunner("callDokka", "-i", "-s").buildRelaxed()
+
+ assertEquals(TaskOutcome.SUCCESS, assertNotNull(result.task(":callDokka")).outcome)
+
+ assertTrue(projectOutputLocation.isDirectory, "Missing dokka output directory")
+
+ projectOutputLocation.allHtmlFiles().forEach { file ->
+ assertContainsNoErrorClass(file)
+// assertNoUnresolvedLinks(file)
+// assertNoHrefToMissingLocalFileOrDirectory(file)
+ assertNoEmptyLinks(file)
+ assertNoEmptySpans(file)
+ }
+ }
+}
diff --git a/integration-tests/maven/projects/biojava/biojava b/integration-tests/maven/projects/biojava/biojava
new file mode 160000
+Subproject 633021b1cf6c1aafd45df2d94dc2ad6eadad398
diff --git a/integration-tests/maven/projects/biojava/biojava.diff b/integration-tests/maven/projects/biojava/biojava.diff
new file mode 100644
index 00000000..84fbe50f
--- /dev/null
+++ b/integration-tests/maven/projects/biojava/biojava.diff
@@ -0,0 +1,42 @@
+diff --git a/biojava-core/pom.xml b/biojava-core/pom.xml
+index 6cc9c6c9a..ef4f28225 100644
+--- a/biojava-core/pom.xml
++++ b/biojava-core/pom.xml
+@@ -22,9 +22,36 @@
+ </license>
+ </licenses>
+
++ <pluginRepositories>
++ <pluginRepository>
++ <id>kotlin-dev</id>
++ <url>https://dl.bintray.com/kotlin/kotlin-dev</url>
++ </pluginRepository>
++ <pluginRepository>
++ <id>kotlin-eap</id>
++ <url>https://dl.bintray.com/kotlin/kotlin-eap</url>
++ </pluginRepository>
++ <pluginRepository>
++ <id>jcenter</id>
++ <url>https://jcenter.bintray.com/</url>
++ </pluginRepository>
++ </pluginRepositories>
++
+ <build>
+ <plugins>
+-
++ <plugin>
++ <groupId>org.jetbrains.dokka</groupId>
++ <artifactId>dokka-maven-plugin</artifactId>
++ <version>${dokka_version}</version>
++ <executions>
++ <execution>
++ <phase>pre-site</phase>
++ <goals>
++ <goal>javadoc</goal>
++ </goals>
++ </execution>
++ </executions>
++ </plugin>
+ <!-- Excluding demo package is required for avoiding namespace clashes (demo package is in all modules) for signing the jar. See issue #387 -->
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
diff --git a/integration-tests/maven/src/integrationTest/kotlin/org/jetbrains/dokka/it/maven/BiojavaIntegrationTest.kt b/integration-tests/maven/src/integrationTest/kotlin/org/jetbrains/dokka/it/maven/BiojavaIntegrationTest.kt
new file mode 100644
index 00000000..4037cc08
--- /dev/null
+++ b/integration-tests/maven/src/integrationTest/kotlin/org/jetbrains/dokka/it/maven/BiojavaIntegrationTest.kt
@@ -0,0 +1,59 @@
+package org.jetbrains.dokka.it.maven
+
+import org.jetbrains.dokka.it.*
+import java.io.File
+import kotlin.test.BeforeTest
+import kotlin.test.Test
+import kotlin.test.assertEquals
+import kotlin.test.assertTrue
+
+class BiojavaIntegrationTest : AbstractIntegrationTest(), S3Project {
+
+ private val currentDokkaVersion: String = checkNotNull(System.getenv("DOKKA_VERSION"))
+ private val mavenBinaryFile: File = File(checkNotNull(System.getenv("MVN_BINARY_PATH")))
+ override val projectOutputLocation: File by lazy { File(projectDir, "biojava-core/target/dokkaJavadoc") }
+
+ @BeforeTest
+ fun prepareProjectFiles() {
+ val templateProjectDir = File("projects", "biojava/biojava")
+ templateProjectDir.copyRecursively(projectDir)
+ val customResourcesDir = File(templateProjectDir, "custom Resources")
+ if (customResourcesDir.exists() && customResourcesDir.isDirectory) {
+ customResourcesDir.copyRecursively(File(projectDir, "customResources"), overwrite = true)
+ }
+ copyAndApplyGitDiff(File("projects", "biojava/biojava.diff"))
+ }
+
+ @Test
+ fun `dokka javadoc`() {
+ val result = ProcessBuilder().directory(projectDir)
+ .command(mavenBinaryFile.absolutePath, "dokka:javadoc", "-pl", "biojava-core", "\"-Ddokka_version=$currentDokkaVersion\"", "-U", "-e").start().awaitProcessResult()
+
+ diagnosticAsserts(result)
+
+ assertTrue(projectOutputLocation.isDirectory, "Missing dokka output directory")
+
+ val scriptsDir = File(projectOutputLocation, "jquery")
+ assertTrue(scriptsDir.isDirectory, "Missing jquery directory")
+
+ val stylesDir = File(projectOutputLocation, "resources")
+ assertTrue(stylesDir.isDirectory, "Missing resources directory")
+
+ projectDir.allHtmlFiles().forEach { file ->
+ assertContainsNoErrorClass(file)
+ assertNoUnresolvedLinks(file)
+ }
+ }
+
+ private fun diagnosticAsserts(result: ProcessResult) {
+ assertEquals(0, result.exitCode, "Expected exitCode 0 (Success)")
+
+ val extensionLoadedRegex = Regex("""Extension: org\.jetbrains\.dokka\.base\.DokkaBase""")
+ val amountOfExtensionsLoaded = extensionLoadedRegex.findAll(result.output).count()
+
+ assertTrue(
+ amountOfExtensionsLoaded > 10,
+ "Expected more than 10 extensions being present (found $amountOfExtensionsLoaded)"
+ )
+ }
+}
diff --git a/integration-tests/src/main/kotlin/org/jetbrains/dokka/it/S3Project.kt b/integration-tests/src/main/kotlin/org/jetbrains/dokka/it/S3Project.kt
new file mode 100644
index 00000000..ee69ef62
--- /dev/null
+++ b/integration-tests/src/main/kotlin/org/jetbrains/dokka/it/S3Project.kt
@@ -0,0 +1,16 @@
+package org.jetbrains.dokka.it
+
+import org.junit.After
+import java.io.File
+
+interface S3Project {
+ val projectOutputLocation: File
+
+ @After
+ fun copyToLocation() {
+ System.getenv("DOKKA_IT_AWS_PATH")?.also { location ->
+ println("Copying to ${File(location).absolutePath}")
+ projectOutputLocation.copyRecursively(File(location))
+ } ?: println("No copy path provided, skipping")
+ }
+}
diff --git a/integration-tests/src/main/kotlin/org/jetbrains/dokka/it/gitSubmoduleUtils.kt b/integration-tests/src/main/kotlin/org/jetbrains/dokka/it/gitSubmoduleUtils.kt
new file mode 100644
index 00000000..312ff21f
--- /dev/null
+++ b/integration-tests/src/main/kotlin/org/jetbrains/dokka/it/gitSubmoduleUtils.kt
@@ -0,0 +1,40 @@
+package org.jetbrains.dokka.it
+
+import org.eclipse.jgit.api.Git
+import org.eclipse.jgit.storage.file.FileRepositoryBuilder
+import java.io.File
+import java.nio.file.Path
+
+fun AbstractIntegrationTest.copyAndApplyGitDiff(diffFile: File) =
+ copyGitDiffFileToParent(diffFile).let(::applyGitDiffFromFile)
+
+fun AbstractIntegrationTest.copyGitDiffFileToParent(originalDiffFile: File) =
+ originalDiffFile.copyTo(File(projectDir.parent, originalDiffFile.name))
+
+fun AbstractIntegrationTest.applyGitDiffFromFile(diffFile: File) {
+ val projectGitFile = projectDir.resolve(".git")
+ val git = if (projectGitFile.exists()) {
+ if (projectGitFile.isFile) {
+ println(".git file inside project directory exists, removing")
+ removeGitFile(projectDir.toPath())
+ Git.init().setDirectory(projectDir).call()
+ } else {
+ println(".git directory inside project directory exists, reusing")
+ FileRepositoryBuilder().apply {
+ isMustExist = true
+ gitDir = projectDir
+ }.let { Git(it.build()) }
+ }
+ } else {
+ Git.init().setDirectory(projectDir).call()
+ }
+ git.apply().setPatch(diffFile.inputStream()).call()
+}
+
+private fun removeGitFile(repository: Path) =
+ repository.toFile()
+ .listFiles().orEmpty()
+ .filter { it.name.toLowerCase() == ".git" }
+ .forEach { it.delete() }
+
+