From 410381235b7e8295b5577e72d607b78358408db2 Mon Sep 17 00:00:00 2001 From: Danilo Pianini Date: Thu, 19 Dec 2024 17:14:13 +0100 Subject: [PATCH] fix: improve dokka support --- build.gradle.kts | 1 + gradle/libs.versions.toml | 2 +- .../gradle/mavencentral/DokkaHelper.kt | 36 ++++++------------- .../gradle/mavencentral/PublishOnCentral.kt | 4 +-- .../test/ktmultiplatform/build.gradle.kts | 2 +- 5 files changed, 15 insertions(+), 30 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 513c1bc5..5b9f46a5 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -43,6 +43,7 @@ dependencies { api(gradleApi()) api(gradleKotlinDsl()) api(libs.kotlin.gradlePlugin) + api(libs.dokka.gradlePlugin) api(libs.nexus.publish) api(libs.maven.central.api) implementation(libs.kotlinx.coroutines) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 9cc2d6ce..7f8843cb 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -7,6 +7,7 @@ testkit = "0.9.0" [libraries] fuel = "com.github.kittinunf.fuel:fuel:2.3.1" +dokka-gradlePlugin = { module = "org.jetbrains.dokka:dokka-gradle-plugin", version.ref = "dokka" } kotest-junit5-jvm = { module = "io.kotest:kotest-runner-junit5-jvm", version.ref = "kotest" } kotest-assertions-core-jvm = { module = "io.kotest:kotest-assertions-core-jvm", version.ref = "kotest" } kotlin-gradlePlugin = { module = "org.jetbrains.kotlin:kotlin-gradle-plugin", version.ref = "kotlin" } @@ -25,6 +26,5 @@ gradlePluginPublish = "com.gradle.plugin-publish:1.3.0" kotlin-jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" } kotlin-qa = "org.danilopianini.gradle-kotlin-qa:0.78.0" multiJvmTesting = "org.danilopianini.multi-jvm-test-plugin:3.0.1" -nexus-publish = { id = "io.github.gradle-nexus.publish-plugin", version.ref = "nexus-publish" } publishOnCentral = "org.danilopianini.publish-on-central:7.0.1" taskTree = "com.dorongold.task-tree:4.0.0" diff --git a/src/main/kotlin/org/danilopianini/gradle/mavencentral/DokkaHelper.kt b/src/main/kotlin/org/danilopianini/gradle/mavencentral/DokkaHelper.kt index 31fc2d8f..2deae6e9 100644 --- a/src/main/kotlin/org/danilopianini/gradle/mavencentral/DokkaHelper.kt +++ b/src/main/kotlin/org/danilopianini/gradle/mavencentral/DokkaHelper.kt @@ -3,11 +3,8 @@ package org.danilopianini.gradle.mavencentral import org.gradle.api.Project import org.gradle.api.Task import org.gradle.api.tasks.TaskCollection - -/** - * The full name of the `DokkaTask` class. - */ -private const val DOKKA_TASK_CLASS_NAME = "org.jetbrains.dokka.gradle.DokkaTask" +import org.gradle.kotlin.dsl.withType +import org.jetbrains.dokka.gradle.DokkaTask /** * The id of the Dokka plugin. @@ -15,30 +12,17 @@ private const val DOKKA_TASK_CLASS_NAME = "org.jetbrains.dokka.gradle.DokkaTask" internal const val DOKKA_PLUGIN_ID = "org.jetbrains.dokka" /** - * Checks whether a [Task] is actually an instance of the type `DokkaTask`, i.e., an instance of the type - * named after [DOKKA_TASK_CLASS_NAME]. + * Checks whether a [Task] is actually an instance of the type [DokkaTask]. */ -internal val Task.isDokkaTask: Boolean get() = - runCatching { Class.forName(DOKKA_TASK_CLASS_NAME).isAssignableFrom(this::class.java) } - .getOrElse { this::class.java.name.startsWith(DOKKA_TASK_CLASS_NAME) } +internal val Task.isDokkaTask: Boolean get() = this is DokkaTask /** * Selects the available Dokka tasks supporting the generation of [docStyle]-style documentation. * There may be no such tasks, if the plugin user did not apply the Dokka plugin. */ -internal fun Project.dokkaTasksFor(docStyle: DocStyle): TaskCollection = - tasks.matching { - it.isDokkaTask && it.name.startsWith("dokka") && it.name.endsWith(docStyle.name, ignoreCase = true) - } - -/** - * If a task is of type `DokkaTask` (cf. [isDokkaTask]), then retrieves the value of its `outputDirectory` - * property, if any. - */ -internal val Task.dokkaOutputDirectory: Any get() = - when { - isDokkaTask -> - property("outputDirectory") - ?: error("$name has no property 'outputDirectory': Dokka version incompatible with publish-on-central?") - else -> error("$name is not of type $DOKKA_TASK_CLASS_NAME") - } +internal fun Project.dokkaTasksFor(docStyle: DocStyle): TaskCollection = + tasks + .withType() + .matching { + it.name.startsWith("dokka") && it.name.endsWith(docStyle.name, ignoreCase = true) + } diff --git a/src/main/kotlin/org/danilopianini/gradle/mavencentral/PublishOnCentral.kt b/src/main/kotlin/org/danilopianini/gradle/mavencentral/PublishOnCentral.kt index 360a60df..8e8395a6 100644 --- a/src/main/kotlin/org/danilopianini/gradle/mavencentral/PublishOnCentral.kt +++ b/src/main/kotlin/org/danilopianini/gradle/mavencentral/PublishOnCentral.kt @@ -115,11 +115,11 @@ class PublishOnCentral : Plugin { project .dokkaTasksFor(docStyle) .firstOrNull() - ?.also { project.logger.info("Actually $message ${it.name}") } + ?.also { project.logger.info("Actually {} {}", message, it.name) } ?: error("Dokka plugin applied but no task exists for style $docStyle!") } javadocJar.dependsOn(dokkaTask) - javadocJar.from(dokkaTask.map { it.dokkaOutputDirectory }) + javadocJar.from(dokkaTask) } } } diff --git a/src/test/resources/org/danilopianini/gradle/test/ktmultiplatform/build.gradle.kts b/src/test/resources/org/danilopianini/gradle/test/ktmultiplatform/build.gradle.kts index e67fdd7f..fab6709f 100644 --- a/src/test/resources/org/danilopianini/gradle/test/ktmultiplatform/build.gradle.kts +++ b/src/test/resources/org/danilopianini/gradle/test/ktmultiplatform/build.gradle.kts @@ -7,7 +7,7 @@ import java.util.* plugins { kotlin("multiplatform") id("org.danilopianini.publish-on-central") - id("org.jetbrains.dokka") version "1.8.10" + id("org.jetbrains.dokka") } group = "org.danilopianini"