diff options
25 files changed, 710 insertions, 259 deletions
diff --git a/core/src/main/kotlin/defaultConfiguration.kt b/core/src/main/kotlin/defaultConfiguration.kt index 384fa27e..ec461ffd 100644 --- a/core/src/main/kotlin/defaultConfiguration.kt +++ b/core/src/main/kotlin/defaultConfiguration.kt @@ -32,7 +32,7 @@ data class DokkaSourceSetImpl( override val jdkVersion: Int = DokkaDefaults.jdkVersion, override val sourceLinks: Set<SourceLinkDefinitionImpl> = emptySet(), override val perPackageOptions: List<PackageOptionsImpl> = emptyList(), - override var externalDocumentationLinks: Set<ExternalDocumentationLinkImpl> = emptySet(), + override val externalDocumentationLinks: Set<ExternalDocumentationLinkImpl> = emptySet(), override val languageVersion: String? = null, override val apiVersion: String? = null, override val noStdlibLink: Boolean = DokkaDefaults.noStdlibLink, diff --git a/integration-tests/gradle/projects/it-basic/build.gradle.kts b/integration-tests/gradle/projects/it-basic/build.gradle.kts index 1840ba94..43d3a0f3 100644 --- a/integration-tests/gradle/projects/it-basic/build.gradle.kts +++ b/integration-tests/gradle/projects/it-basic/build.gradle.kts @@ -28,5 +28,3 @@ tasks.withType<DokkaTask> { } } } - -buildDir.resolve("") diff --git a/integration-tests/gradle/src/integrationTest/kotlin/org/jetbrains/dokka/it/gradle/Multimodule0IntegrationTest.kt b/integration-tests/gradle/src/integrationTest/kotlin/org/jetbrains/dokka/it/gradle/MultiModule0IntegrationTest.kt index 70b5832d..0184d150 100644 --- a/integration-tests/gradle/src/integrationTest/kotlin/org/jetbrains/dokka/it/gradle/Multimodule0IntegrationTest.kt +++ b/integration-tests/gradle/src/integrationTest/kotlin/org/jetbrains/dokka/it/gradle/MultiModule0IntegrationTest.kt @@ -5,7 +5,7 @@ import org.junit.runners.Parameterized import java.io.File import kotlin.test.* -class Multimodule0IntegrationTest(override val versions: BuildVersions) : AbstractGradleIntegrationTest() { +class MultiModule0IntegrationTest(override val versions: BuildVersions) : AbstractGradleIntegrationTest() { companion object { @get:JvmStatic @get:Parameterized.Parameters(name = "{0}") @@ -27,15 +27,15 @@ class Multimodule0IntegrationTest(override val versions: BuildVersions) : Abstra @Test fun execute() { val result = createGradleRunner( - ":moduleA:dokkaHtmlMultimodule", - ":moduleA:dokkaGfmMultimodule", - ":moduleA:dokkaJekyllMultimodule", + ":moduleA:dokkaHtmlMultiModule", + ":moduleA:dokkaGfmMultiModule", + ":moduleA:dokkaJekyllMultiModule", "-i", "-s" ).buildRelaxed() - assertEquals(TaskOutcome.SUCCESS, assertNotNull(result.task(":moduleA:dokkaHtmlMultimodule")).outcome) - assertEquals(TaskOutcome.SUCCESS, assertNotNull(result.task(":moduleA:dokkaGfmMultimodule")).outcome) - assertEquals(TaskOutcome.SUCCESS, assertNotNull(result.task(":moduleA:dokkaJekyllMultimodule")).outcome) + assertEquals(TaskOutcome.SUCCESS, assertNotNull(result.task(":moduleA:dokkaHtmlMultiModule")).outcome) + assertEquals(TaskOutcome.SUCCESS, assertNotNull(result.task(":moduleA:dokkaGfmMultiModule")).outcome) + assertEquals(TaskOutcome.SUCCESS, assertNotNull(result.task(":moduleA:dokkaJekyllMultiModule")).outcome) assertEquals(TaskOutcome.SUCCESS, assertNotNull(result.task(":moduleA:moduleB:dokkaHtml")).outcome) assertEquals(TaskOutcome.SUCCESS, assertNotNull(result.task(":moduleA:moduleC:dokkaHtml")).outcome) assertEquals(TaskOutcome.SUCCESS, assertNotNull(result.task(":moduleA:moduleB:dokkaGfm")).outcome) @@ -44,7 +44,7 @@ class Multimodule0IntegrationTest(override val versions: BuildVersions) : Abstra assertEquals(TaskOutcome.SUCCESS, assertNotNull(result.task(":moduleA:moduleC:dokkaJekyll")).outcome) - val outputDir = File(projectDir, "moduleA/build/dokka/htmlMultimodule") + val outputDir = File(projectDir, "moduleA/build/dokka/htmlMultiModule") assertTrue(outputDir.isDirectory, "Missing dokka output directory") assertTrue( @@ -70,6 +70,5 @@ class Multimodule0IntegrationTest(override val versions: BuildVersions) : Abstra "moduleC" in modulesFileText, "Expected moduleC being mentioned in -modules.html" ) - } } diff --git a/kotlin-analysis/intellij-dependency/build.gradle.kts b/kotlin-analysis/intellij-dependency/build.gradle.kts index 4ff68e4e..8e080374 100644 --- a/kotlin-analysis/intellij-dependency/build.gradle.kts +++ b/kotlin-analysis/intellij-dependency/build.gradle.kts @@ -30,10 +30,6 @@ dependencies { val idea_version: String by project intellijCore("com.jetbrains.intellij.idea:intellij-core:$idea_version") implementation(intellijCoreAnalysis()) - - val kotlin_version: String by project - api("org.jetbrains.kotlin:kotlin-compiler:$kotlin_version") - } tasks { diff --git a/runners/gradle-plugin/src/main/kotlin/org/jetbrains/dokka/gradle/AbstractDokkaParentTask.kt b/runners/gradle-plugin/src/main/kotlin/org/jetbrains/dokka/gradle/AbstractDokkaParentTask.kt index bf8308bf..c782197e 100644 --- a/runners/gradle-plugin/src/main/kotlin/org/jetbrains/dokka/gradle/AbstractDokkaParentTask.kt +++ b/runners/gradle-plugin/src/main/kotlin/org/jetbrains/dokka/gradle/AbstractDokkaParentTask.kt @@ -1,73 +1,86 @@ package org.jetbrains.dokka.gradle import org.gradle.api.Project -import org.gradle.api.tasks.Input +import org.gradle.api.Task import org.gradle.api.tasks.Internal import org.gradle.api.tasks.Nested import org.jetbrains.dokka.DokkaBootstrap import org.jetbrains.dokka.DokkaBootstrapImpl import kotlin.reflect.KClass -// TODO NOW: Test UP-TO-DATE behaviour abstract class AbstractDokkaParentTask( bootstrapClass: KClass<out DokkaBootstrap> = DokkaBootstrapImpl::class ) : AbstractDokkaTask(bootstrapClass) { - @Input - open var dokkaTaskNames: Set<String> = setOf() - - @Input - var subprojectPaths: Set<String> = project.subprojects.map { project -> project.path }.toSet() - @get:Internal - val subprojects: List<Project> - get() = subprojectPaths.map { path -> project.project(path) }.distinct() + internal var childDokkaTaskPaths: Set<String> = emptySet() + private set @get:Nested - internal val dokkaTasks: List<AbstractDokkaTask> - get() = dokkaTaskNames.flatMap { dokkaTaskName -> findSubprojectDokkaTasks(dokkaTaskName) } - - - /** - * Will remove a single project from participating in this parent task. - * Note: This will not remove the [project]s subprojects. - * - * @see removeAllProjects - */ - fun removeSubproject(project: Project) { - subprojectPaths = subprojectPaths - project.path + internal val childDokkaTasks: Set<AbstractDokkaTask> + get() = childDokkaTaskPaths + .mapNotNull { path -> project.tasks.findByPath(path) } + .map(::checkIsAbstractDokkaTask) + .toSet() + + /* By task reference */ + fun addChildTask(task: AbstractDokkaTask) { + childDokkaTaskPaths = childDokkaTaskPaths + task.path + } + + fun removeChildTask(task: AbstractDokkaTask) { + childDokkaTaskPaths = childDokkaTaskPaths - task.path + } + + /* By path */ + fun addChildTask(path: String) { + childDokkaTaskPaths = childDokkaTaskPaths + project.absoluteProjectPath(path) } - /** - * Will remove the [project] and all its subprojects from participating in this parent task. - * @see removeSubproject - */ - fun removeAllProjects(project: Project) { - project.allprojects.forEach(::removeSubproject) + fun removeChildTask(path: String) { + childDokkaTaskPaths = childDokkaTaskPaths - project.absoluteProjectPath(path) } - /** - * Includes the [project] to participate in this parent task. - * Note: This will not include any of the [project]s subprojects. - * @see addAllProjects - */ - fun addSubproject(project: Project) { - subprojectPaths = (subprojectPaths + project.path) + /* By project reference and name */ + fun addChildTasks(projects: Iterable<Project>, childTasksName: String) { + projects.forEach { project -> + addChildTask(project.absoluteProjectPath(childTasksName)) + } } - /** - * Includes the [project] and all its subprojects to participate in this parent task. - * @see addSubproject - */ - fun addAllProjects(project: Project) { - project.allprojects.forEach(::addSubproject) + fun removeChildTasks(projects: Iterable<Project>, childTasksName: String) { + projects.forEach { project -> + removeChildTask(project.absoluteProjectPath(childTasksName)) + } } - protected fun findSubprojectDokkaTasks(dokkaTaskNames: Set<String>): List<AbstractDokkaTask> { - return dokkaTaskNames.flatMap { dokkaTaskName -> findSubprojectDokkaTasks(dokkaTaskName) } + fun addSubprojectChildTasks(childTasksName: String) { + addChildTasks(project.subprojects, childTasksName) } - private fun findSubprojectDokkaTasks(dokkaTaskName: String): List<AbstractDokkaTask> { - return subprojects.mapNotNull { subproject -> subproject.tasks.findByName(dokkaTaskName) as? DokkaTask } + fun removeSubprojectChildTasks(childTasksName: String) { + removeChildTasks(project.subprojects, childTasksName) + } + + fun removeChildTasks(project: Project) { + childDokkaTaskPaths = childDokkaTaskPaths.filter { path -> + parsePath(path).parent != parsePath(project.path) + }.toSet() + } + + fun removeChildTasks(projects: Iterable<Project>) { + projects.forEach { project -> removeChildTasks(project) } + } + + private fun checkIsAbstractDokkaTask(task: Task): AbstractDokkaTask { + if (task is AbstractDokkaTask) { + return task + } + throw IllegalArgumentException( + "Only tasks of type ${AbstractDokkaTask::class.java.name} can be added as child for " + + "${AbstractDokkaParentTask::class.java.name} tasks.\n" + + "Found task ${task.path} of type ${task::class.java.name} added to $path" + ) } } + diff --git a/runners/gradle-plugin/src/main/kotlin/org/jetbrains/dokka/gradle/AbstractDokkaTask.kt b/runners/gradle-plugin/src/main/kotlin/org/jetbrains/dokka/gradle/AbstractDokkaTask.kt index 6413d788..5deaac49 100644 --- a/runners/gradle-plugin/src/main/kotlin/org/jetbrains/dokka/gradle/AbstractDokkaTask.kt +++ b/runners/gradle-plugin/src/main/kotlin/org/jetbrains/dokka/gradle/AbstractDokkaTask.kt @@ -1,12 +1,20 @@ +@file:Suppress("UnstableApiUsage") + package org.jetbrains.dokka.gradle +import groovy.lang.Closure +import org.gradle.api.Action import org.gradle.api.DefaultTask +import org.gradle.api.Task import org.gradle.api.artifacts.Configuration import org.gradle.api.plugins.JavaBasePlugin +import org.gradle.api.provider.MapProperty +import org.gradle.api.provider.Property import org.gradle.api.tasks.* +import org.gradle.kotlin.dsl.mapProperty import org.jetbrains.dokka.DokkaBootstrap import org.jetbrains.dokka.DokkaConfigurationImpl -import org.jetbrains.dokka.plugability.Configurable +import org.jetbrains.dokka.DokkaDefaults import org.jetbrains.dokka.toJsonString import java.io.File import java.util.function.BiConsumer @@ -14,23 +22,26 @@ import kotlin.reflect.KClass abstract class AbstractDokkaTask( private val bootstrapClass: KClass<out DokkaBootstrap> = DokkaBootstrap::class -) : DefaultTask(), Configurable { +) : DefaultTask() { @OutputDirectory - var outputDirectory: File = defaultDokkaOutputDirectory() + val outputDirectory: Property<File> = project.objects.safeProperty<File>() + .safeConvention(defaultDokkaOutputDirectory()) @Optional @InputDirectory - var cacheRoot: File? = null + val cacheRoot: Property<File?> = project.objects.safeProperty() @Input - var failOnWarning: Boolean = false + val failOnWarning: Property<Boolean> = project.objects.safeProperty<Boolean>() + .safeConvention(DokkaDefaults.failOnWarning) @Input - var offlineMode: Boolean = false + val offlineMode: Property<Boolean> = project.objects.safeProperty<Boolean>() + .safeConvention(DokkaDefaults.offlineMode) @Input - override val pluginsConfiguration: MutableMap<String, String> = mutableMapOf() + val pluginsConfiguration: MapProperty<String, String> = project.objects.mapProperty() @Classpath val plugins: Configuration = project.maybeCreateDokkaPluginConfiguration(name) @@ -38,8 +49,16 @@ abstract class AbstractDokkaTask( @Classpath val runtime: Configuration = project.maybeCreateDokkaRuntimeConfiguration(name) + final override fun doFirst(action: Action<in Task>): Task { + return super.doFirst(action) + } + + final override fun doFirst(action: Closure<*>): Task { + return super.doFirst(action) + } + @TaskAction - protected open fun generateDocumentation() { + internal open fun generateDocumentation() { DokkaBootstrap(runtime, bootstrapClass).apply { configure(buildDokkaConfiguration().toJsonString(), createProxyLogger()) generate() diff --git a/runners/gradle-plugin/src/main/kotlin/org/jetbrains/dokka/gradle/DokkaCollectorTask.kt b/runners/gradle-plugin/src/main/kotlin/org/jetbrains/dokka/gradle/DokkaCollectorTask.kt index 4762c333..37571fc5 100644 --- a/runners/gradle-plugin/src/main/kotlin/org/jetbrains/dokka/gradle/DokkaCollectorTask.kt +++ b/runners/gradle-plugin/src/main/kotlin/org/jetbrains/dokka/gradle/DokkaCollectorTask.kt @@ -4,16 +4,21 @@ import org.jetbrains.dokka.DokkaConfigurationImpl open class DokkaCollectorTask : AbstractDokkaParentTask() { + override fun generateDocumentation() { + checkChildDokkaTasksIsNotEmpty() + super.generateDocumentation() + } + override fun buildDokkaConfiguration(): DokkaConfigurationImpl { val initialDokkaConfiguration = DokkaConfigurationImpl( - outputDir = outputDirectory, - cacheRoot = cacheRoot, - failOnWarning = failOnWarning, - offlineMode = offlineMode, + outputDir = outputDirectory.getSafe(), + cacheRoot = cacheRoot.getSafe(), + failOnWarning = failOnWarning.getSafe(), + offlineMode = offlineMode.getSafe(), pluginsClasspath = plugins.resolve().toSet(), ) - val subprojectDokkaConfigurations = dokkaTasks.map { dokkaTask -> dokkaTask.buildDokkaConfiguration() } + val subprojectDokkaConfigurations = childDokkaTasks.map { dokkaTask -> dokkaTask.buildDokkaConfiguration() } return subprojectDokkaConfigurations.fold(initialDokkaConfiguration) { acc, it: DokkaConfigurationImpl -> acc.copy( sourceSets = acc.sourceSets + it.sourceSets, diff --git a/runners/gradle-plugin/src/main/kotlin/org/jetbrains/dokka/gradle/DokkaMultiModuleFileLayout.kt b/runners/gradle-plugin/src/main/kotlin/org/jetbrains/dokka/gradle/DokkaMultiModuleFileLayout.kt new file mode 100644 index 00000000..8cca98d5 --- /dev/null +++ b/runners/gradle-plugin/src/main/kotlin/org/jetbrains/dokka/gradle/DokkaMultiModuleFileLayout.kt @@ -0,0 +1,52 @@ +package org.jetbrains.dokka.gradle + +import java.io.File + +interface DokkaMultiModuleFileLayout { + fun targetChildOutputDirectory(parent: AbstractDokkaParentTask, child: AbstractDokkaTask): File + + object NoCopy : DokkaMultiModuleFileLayout { + override fun targetChildOutputDirectory(parent: AbstractDokkaParentTask, child: AbstractDokkaTask): File { + return child.outputDirectory.getSafe() + } + } + + object CompactInParent : DokkaMultiModuleFileLayout { + override fun targetChildOutputDirectory(parent: AbstractDokkaParentTask, child: AbstractDokkaTask): File { + val relativeProjectPath = parent.project.relativeProjectPath(child.project.path) + val relativeFilePath = relativeProjectPath.replace(":", File.separator) + check(!File(relativeFilePath).isAbsolute) { "Unexpected absolute path $relativeFilePath" } + return parent.outputDirectory.getSafe().resolve(relativeFilePath) + } + } +} + +internal fun DokkaMultiModuleTask.targetChildOutputDirectory( + child: AbstractDokkaTask +): File { + return fileLayout.targetChildOutputDirectory(this, child) +} + +internal fun DokkaMultiModuleTask.copyChildOutputDirectories() { + childDokkaTasks.forEach { child -> + fileLayout.copyChildOutputDirectory(this, child) + } +} + +internal fun DokkaMultiModuleFileLayout.copyChildOutputDirectory( + parent: AbstractDokkaParentTask, child: AbstractDokkaTask +) { + val targetChildOutputDirectory = parent.project.file(targetChildOutputDirectory(parent, child)) + val sourceChildOutputDirectory = child.outputDirectory.getSafe() + + if (!sourceChildOutputDirectory.exists()) { + return + } + + if (sourceChildOutputDirectory.absoluteFile == targetChildOutputDirectory.absoluteFile) { + return + } + + sourceChildOutputDirectory.copyRecursively(targetChildOutputDirectory, overwrite = false) +} + diff --git a/runners/gradle-plugin/src/main/kotlin/org/jetbrains/dokka/gradle/DokkaMultiModuleTask.kt b/runners/gradle-plugin/src/main/kotlin/org/jetbrains/dokka/gradle/DokkaMultiModuleTask.kt new file mode 100644 index 00000000..29e0d76e --- /dev/null +++ b/runners/gradle-plugin/src/main/kotlin/org/jetbrains/dokka/gradle/DokkaMultiModuleTask.kt @@ -0,0 +1,69 @@ +package org.jetbrains.dokka.gradle + +import org.gradle.api.internal.tasks.TaskDependencyInternal +import org.gradle.api.tasks.* +import org.jetbrains.dokka.DokkaConfigurationImpl +import org.jetbrains.dokka.DokkaModuleDescriptionImpl +import org.jetbrains.dokka.DokkaMultimoduleBootstrapImpl +import java.io.File + +@Suppress("unused") // Shall provide source compatibility if possible +@Deprecated("Use 'DokkaMultimoduleTask' instead", ReplaceWith("DokkaMultimoduleTask")) +typealias DokkaMultimoduleTask = DokkaMultiModuleTask + + +open class DokkaMultiModuleTask : AbstractDokkaParentTask(DokkaMultimoduleBootstrapImpl::class) { + + /** + * Name of the file containing all necessary module information. + * This file has to be placed inside the subproject root directory. + */ + @Internal + var documentationFileName: String = "README.md" + + @Internal + var fileLayout: DokkaMultiModuleFileLayout = DokkaMultiModuleFileLayout.CompactInParent + + @get:InputFiles + internal val childDocumentationFiles: Iterable<File> + get() = childDokkaTasks.map { task -> task.project.projectDir.resolve(documentationFileName) } + + @get:InputFiles + internal val sourceChildOutputDirectories: Iterable<File> + get() = childDokkaTasks.map { task -> task.outputDirectory.getSafe() } + + @get:OutputDirectories + internal val targetChildOutputDirectories: Iterable<File> + get() = childDokkaTasks.map { task -> targetChildOutputDirectory(task) } + + @Internal + override fun getTaskDependencies(): TaskDependencyInternal { + return super.getTaskDependencies() + childDokkaTasks + } + + override fun generateDocumentation() { + checkChildDokkaTasksIsNotEmpty() + copyChildOutputDirectories() + super.generateDocumentation() + } + + override fun buildDokkaConfiguration(): DokkaConfigurationImpl { + return DokkaConfigurationImpl( + outputDir = outputDirectory.getSafe(), + cacheRoot = cacheRoot.getSafe(), + pluginsConfiguration = pluginsConfiguration.getSafe(), + failOnWarning = failOnWarning.getSafe(), + offlineMode = offlineMode.getSafe(), + pluginsClasspath = plugins.resolve().toSet(), + modules = childDokkaTasks.map { dokkaTask -> + DokkaModuleDescriptionImpl( + name = dokkaTask.project.name, + path = targetChildOutputDirectory(dokkaTask).relativeTo(outputDirectory.getSafe()), + docFile = dokkaTask.project.projectDir.resolve(documentationFileName).absoluteFile + ) + } + ) + } +} + + diff --git a/runners/gradle-plugin/src/main/kotlin/org/jetbrains/dokka/gradle/DokkaMultimoduleTask.kt b/runners/gradle-plugin/src/main/kotlin/org/jetbrains/dokka/gradle/DokkaMultimoduleTask.kt deleted file mode 100644 index 48a9721f..00000000 --- a/runners/gradle-plugin/src/main/kotlin/org/jetbrains/dokka/gradle/DokkaMultimoduleTask.kt +++ /dev/null @@ -1,42 +0,0 @@ -package org.jetbrains.dokka.gradle - -import org.gradle.api.internal.tasks.TaskDependencyInternal -import org.gradle.api.tasks.Input -import org.gradle.api.tasks.Internal -import org.jetbrains.dokka.DokkaConfigurationImpl -import org.jetbrains.dokka.DokkaModuleDescriptionImpl -import org.jetbrains.dokka.DokkaMultimoduleBootstrapImpl -import org.jetbrains.dokka.plugability.Configurable - -open class DokkaMultimoduleTask : AbstractDokkaParentTask(DokkaMultimoduleBootstrapImpl::class), Configurable { - - /** - * Name of the file containing all necessary module information. - * This file has to be placed inside the subrpojects root directory. - */ - @Input - var documentationFileName: String = "README.md" - - @Internal - override fun getTaskDependencies(): TaskDependencyInternal { - return super.getTaskDependencies() + dokkaTasks - } - - override fun buildDokkaConfiguration(): DokkaConfigurationImpl { - return DokkaConfigurationImpl( - outputDir = outputDirectory, - cacheRoot = cacheRoot, - pluginsConfiguration = pluginsConfiguration, - failOnWarning = failOnWarning, - offlineMode = offlineMode, - pluginsClasspath = plugins.resolve().toSet(), - modules = dokkaTasks.map { dokkaTask -> - DokkaModuleDescriptionImpl( - name = dokkaTask.project.name, - path = dokkaTask.outputDirectory.relativeTo(outputDirectory), - docFile = dokkaTask.project.projectDir.resolve(documentationFileName).absoluteFile - ) - } - ) - } -} diff --git a/runners/gradle-plugin/src/main/kotlin/org/jetbrains/dokka/gradle/DokkaTask.kt b/runners/gradle-plugin/src/main/kotlin/org/jetbrains/dokka/gradle/DokkaTask.kt index c5713d16..6f92abdf 100644 --- a/runners/gradle-plugin/src/main/kotlin/org/jetbrains/dokka/gradle/DokkaTask.kt +++ b/runners/gradle-plugin/src/main/kotlin/org/jetbrains/dokka/gradle/DokkaTask.kt @@ -26,12 +26,12 @@ open class DokkaTask : AbstractDokkaTask(DokkaBootstrapImpl::class) { override fun buildDokkaConfiguration(): DokkaConfigurationImpl { return DokkaConfigurationImpl( - outputDir = outputDirectory, - cacheRoot = cacheRoot, - offlineMode = offlineMode, - failOnWarning = failOnWarning, + outputDir = outputDirectory.getSafe(), + cacheRoot = cacheRoot.getSafe(), + offlineMode = offlineMode.getSafe(), + failOnWarning = failOnWarning.getSafe(), sourceSets = dokkaSourceSets.build(), - pluginsConfiguration = pluginsConfiguration, + pluginsConfiguration = pluginsConfiguration.getSafe(), pluginsClasspath = plugins.resolve() ) } diff --git a/runners/gradle-plugin/src/main/kotlin/org/jetbrains/dokka/gradle/TaskDependencyInternalWithAdditions.kt b/runners/gradle-plugin/src/main/kotlin/org/jetbrains/dokka/gradle/TaskDependencyInternalWithAdditions.kt index fb648c02..969b1aa1 100644 --- a/runners/gradle-plugin/src/main/kotlin/org/jetbrains/dokka/gradle/TaskDependencyInternalWithAdditions.kt +++ b/runners/gradle-plugin/src/main/kotlin/org/jetbrains/dokka/gradle/TaskDependencyInternalWithAdditions.kt @@ -5,7 +5,7 @@ import org.gradle.api.internal.tasks.AbstractTaskDependency import org.gradle.api.internal.tasks.TaskDependencyInternal import org.gradle.api.internal.tasks.TaskDependencyResolveContext -operator fun TaskDependencyInternal.plus(tasks: Iterable<Task>): TaskDependencyInternal { +internal operator fun TaskDependencyInternal.plus(tasks: Iterable<Task>): TaskDependencyInternal { return TaskDependencyInternalWithAdditions(this, tasks.toSet()) } diff --git a/runners/gradle-plugin/src/main/kotlin/org/jetbrains/dokka/gradle/checkChildDokkaTasksIsNotEmpty.kt b/runners/gradle-plugin/src/main/kotlin/org/jetbrains/dokka/gradle/checkChildDokkaTasksIsNotEmpty.kt new file mode 100644 index 00000000..a47ea4cd --- /dev/null +++ b/runners/gradle-plugin/src/main/kotlin/org/jetbrains/dokka/gradle/checkChildDokkaTasksIsNotEmpty.kt @@ -0,0 +1,43 @@ +package org.jetbrains.dokka.gradle + +import org.jetbrains.dokka.DokkaException + +fun AbstractDokkaParentTask.checkChildDokkaTasksIsNotEmpty() { + if (childDokkaTaskPaths.isEmpty()) { + throw DokkaException( + """ + The ${this::class.java.simpleName} $path has no configured child tasks. + Add some dokka tasks like e.g.: + + tasks.named<AbstractDokkaParentTask>("$name") { + addChildTask(..) + addChildTasks(subprojects, "...") + //... + } + """.trimIndent() + ) + } + + if (childDokkaTasks.isEmpty()) { + throw DokkaException( + """ + The ${this::class.java.simpleName} $path could not find any registered child task. + child tasks: $childDokkaTaskPaths + + Please make sure to apply the dokka plugin to all included (sub)-projects individually e.g.: + + // subproject build.gradle.kts + plugins { + id("org.jetbrains.dokka") + } + + or + + // parent build.gradle.kts + subprojects { + plugins.apply("org.jetbrains.dokka") + } + """ + ) + } +} diff --git a/runners/gradle-plugin/src/main/kotlin/org/jetbrains/dokka/gradle/dokka.kt b/runners/gradle-plugin/src/main/kotlin/org/jetbrains/dokka/gradle/dokka.kt deleted file mode 100644 index 2625f64c..00000000 --- a/runners/gradle-plugin/src/main/kotlin/org/jetbrains/dokka/gradle/dokka.kt +++ /dev/null @@ -1,7 +0,0 @@ -import org.gradle.api.Project -import org.gradle.kotlin.dsl.withType -import org.jetbrains.dokka.gradle.DokkaTask - -fun Project.dokka(configuration: DokkaTask.() -> Unit) { - tasks.withType<DokkaTask>().configureEach(configuration) -} diff --git a/runners/gradle-plugin/src/main/kotlin/org/jetbrains/dokka/gradle/main.kt b/runners/gradle-plugin/src/main/kotlin/org/jetbrains/dokka/gradle/main.kt index 71fad405..8ba28e83 100644 --- a/runners/gradle-plugin/src/main/kotlin/org/jetbrains/dokka/gradle/main.kt +++ b/runners/gradle-plugin/src/main/kotlin/org/jetbrains/dokka/gradle/main.kt @@ -1,5 +1,6 @@ package org.jetbrains.dokka.gradle +import org.gradle.api.DefaultTask import org.gradle |
