Skip to content

Commit d5515e9

Browse files
authored
Add DokkaJavadocPlugin (#3796)
* Add DokkaJavadocPlugin KT-71357
1 parent e8bc8fa commit d5515e9

File tree

8 files changed

+101
-28
lines changed

8 files changed

+101
-28
lines changed

dokka-runners/dokka-gradle-plugin/api/dokka-gradle-plugin.api

+4
Original file line numberDiff line numberDiff line change
@@ -506,6 +506,10 @@ public final class org/jetbrains/dokka/gradle/formats/DokkaHtmlPlugin$inlined$sa
506506
public final synthetic fun execute (Ljava/lang/Object;)V
507507
}
508508

509+
public abstract class org/jetbrains/dokka/gradle/formats/DokkaJavadocPlugin : org/jetbrains/dokka/gradle/formats/DokkaFormatPlugin {
510+
public fun configure (Lorg/jetbrains/dokka/gradle/formats/DokkaFormatPlugin$DokkaFormatPluginContext;)V
511+
}
512+
509513
public abstract class org/jetbrains/dokka/gradle/formats/DokkaPublication : java/io/Serializable, org/gradle/api/Named, org/gradle/api/plugins/ExtensionAware {
510514
public abstract fun getCacheRoot ()Lorg/gradle/api/file/DirectoryProperty;
511515
public abstract fun getEnabled ()Lorg/gradle/api/provider/Property;

dokka-runners/dokka-gradle-plugin/build.gradle.kts

+31-7
Original file line numberDiff line numberDiff line change
@@ -98,22 +98,46 @@ dependencies {
9898
}
9999

100100
gradlePlugin {
101-
plugins.register("dokka") {
102-
id = "org.jetbrains.dokka"
103-
displayName = "Dokka Gradle Plugin"
104-
description = "Dokka is an API documentation engine for Kotlin"
105-
implementationClass = "org.jetbrains.dokka.gradle.DokkaPlugin"
101+
plugins.configureEach {
106102
tags.addAll(
107103
"dokka",
108104
"kotlin",
109105
"kdoc",
110106
"android",
111107
"api reference",
112108
"documentation",
113-
"html",
114-
"website",
115109
)
116110
}
111+
plugins.register("dokkaHtml") {
112+
id = "org.jetbrains.dokka"
113+
displayName = "Dokka Gradle Plugin"
114+
description = """
115+
Dokka is the API documentation engine for Kotlin.
116+
117+
This plugin generates output that looks like Javadoc websites.
118+
See https://kotlinlang.org/docs/dokka-html.html for more information.
119+
120+
HTML is Dokka's default and recommended output format. It is currently in Beta and approaching the Stable release.
121+
""".trimIndent()
122+
implementationClass = "org.jetbrains.dokka.gradle.DokkaPlugin"
123+
tags.addAll("html")
124+
}
125+
plugins.register("dokkaJavadoc") {
126+
id = "org.jetbrains.dokka-javadoc"
127+
displayName = "Dokka Gradle Plugin Javadoc"
128+
description = """
129+
Dokka is the API documentation engine for Kotlin.
130+
131+
This plugin generates output that looks like Javadoc websites.
132+
See https://kotlinlang.org/docs/dokka-javadoc.html for more information.
133+
134+
The Javadoc output format is still in Alpha, so you may find bugs and experience migration issues when using it.
135+
Successful integration with tools that accept Java's Javadoc HTML as input is not guaranteed.
136+
You use it at your own risk.
137+
""".trimIndent()
138+
implementationClass = "org.jetbrains.dokka.gradle.formats.DokkaJavadocPlugin"
139+
tags.addAll("javadoc")
140+
}
117141
}
118142

119143
testing.suites {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
/*
2+
* Copyright 2014-2024 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
3+
*/
4+
package org.jetbrains.dokka.gradle.formats
5+
6+
import org.gradle.kotlin.dsl.dependencies
7+
import org.jetbrains.dokka.gradle.internal.DokkaInternalApi
8+
9+
/**
10+
* Gradle plugin that configures Dokka Javadoc output format
11+
*/
12+
abstract class DokkaJavadocPlugin
13+
@DokkaInternalApi
14+
constructor() : DokkaFormatPlugin(formatName = "javadoc") {
15+
override fun DokkaFormatPluginContext.configure() {
16+
project.dependencies {
17+
dokkaPlugin(dokka("javadoc-plugin"))
18+
}
19+
}
20+
}

dokka-runners/dokka-gradle-plugin/src/main/kotlin/internal/v2MigrationUtils.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ internal fun addV2MigrationHelpers(
2828
project.configurations.createDokkaDefaultRuntimeConfiguration()
2929

3030
setupDokkaTasks(project, "GFM")
31-
setupDokkaTasks(project, "Javadoc", multiModuleTaskSupported = false)
31+
setupDokkaTasks(project, "Javadoc", createDokkaPluginFormatConfiguration = false, multiModuleTaskSupported = false)
3232
setupDokkaTasks(project, "Jekyll")
3333
setupDokkaTasks(project, "HTML", createDokkaPluginFormatConfiguration = false)
3434

dokka-runners/dokka-gradle-plugin/src/testFixtures/kotlin/GradleTestKitUtils.kt

+1
Original file line numberDiff line numberDiff line change
@@ -338,6 +338,7 @@ interface ProjectDirectoryScope {
338338
| )
339339
| filter {
340340
| includeGroup("org.jetbrains.dokka")
341+
| includeGroup("org.jetbrains.dokka-javadoc")
341342
| }
342343
|}
343344
""".trimMargin()

dokka-runners/dokka-gradle-plugin/src/testFixtures/kotlin/projects/MultiModuleProject.kt

+3
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ fun TestScope.initMultiModuleProject(
3838
| // with ClassNotFound KotlinPluginExtension... very weird
3939
| kotlin("jvm") version embeddedKotlinVersion apply false
4040
| id("org.jetbrains.dokka") version "${DokkaConstants.DOKKA_VERSION}"
41+
| id("org.jetbrains.dokka-javadoc") version "${DokkaConstants.DOKKA_VERSION}"
4142
|}
4243
|
4344
|dependencies {
@@ -52,6 +53,7 @@ fun TestScope.initMultiModuleProject(
5253
|plugins {
5354
| kotlin("jvm") version embeddedKotlinVersion
5455
| id("org.jetbrains.dokka") version "${DokkaConstants.DOKKA_VERSION}"
56+
| id("org.jetbrains.dokka-javadoc") version "${DokkaConstants.DOKKA_VERSION}"
5557
|}
5658
|
5759
""".trimMargin()
@@ -79,6 +81,7 @@ fun TestScope.initMultiModuleProject(
7981
|plugins {
8082
| kotlin("jvm") version embeddedKotlinVersion
8183
| id("org.jetbrains.dokka") version "${DokkaConstants.DOKKA_VERSION}"
84+
| id("org.jetbrains.dokka-javadoc") version "${DokkaConstants.DOKKA_VERSION}"
8285
|}
8386
|
8487
""".trimMargin()

dokka-runners/dokka-gradle-plugin/src/testFunctional/kotlin/DokkaPluginFunctionalTest.kt

+18-15
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ package org.jetbrains.dokka.gradle
66
import io.kotest.assertions.asClue
77
import io.kotest.assertions.withClue
88
import io.kotest.core.spec.style.FunSpec
9-
import io.kotest.matchers.collections.shouldContainExactly
109
import io.kotest.matchers.collections.shouldContainExactlyInAnyOrder
1110
import io.kotest.matchers.shouldBe
1211
import io.kotest.matchers.string.shouldContain
@@ -19,6 +18,7 @@ class DokkaPluginFunctionalTest : FunSpec({
1918
buildGradleKts = """
2019
|plugins {
2120
| id("org.jetbrains.dokka") version "$DOKKA_VERSION"
21+
| id("org.jetbrains.dokka-javadoc") version "$DOKKA_VERSION"
2222
|}
2323
|
2424
|val printDeclarableConfigurations by tasks.registering {
@@ -45,9 +45,11 @@ class DokkaPluginFunctionalTest : FunSpec({
4545

4646
dokkaTasks.shouldContainExactly(
4747
//@formatter:off
48-
"dokkaGenerate" to "Generates Dokka publications for all formats",
49-
"dokkaGenerateModuleHtml" to "Executes the Dokka Generator, generating a html module",
50-
"dokkaGeneratePublicationHtml" to "Executes the Dokka Generator, generating the html publication",
48+
"dokkaGenerate" to "Generates Dokka publications for all formats",
49+
"dokkaGenerateModuleHtml" to "Executes the Dokka Generator, generating a html module",
50+
"dokkaGeneratePublicationHtml" to "Executes the Dokka Generator, generating the html publication",
51+
"dokkaGenerateModuleJavadoc" to "Executes the Dokka Generator, generating a javadoc module",
52+
"dokkaGeneratePublicationJavadoc" to "Executes the Dokka Generator, generating the javadoc publication",
5153
//@formatter:on
5254
)
5355
}
@@ -70,13 +72,17 @@ class DokkaPluginFunctionalTest : FunSpec({
7072
.map { it.trim() }
7173
.sorted()
7274

73-
declarableConfigurations.shouldContainExactly(
74-
"dokka",
75-
"dokkaHtmlGeneratorRuntime",
76-
"dokkaHtmlPlugin",
77-
"dokkaHtmlPublicationPlugin",
78-
"dokkaHtmlPublicationPluginApiOnly~internal",
79-
"dokkaPlugin",
75+
declarableConfigurations.shouldContainExactlyInAnyOrder(
76+
buildList {
77+
add("dokka")
78+
add("dokkaPlugin")
79+
expectedFormats.forEach {
80+
add("dokka${it}GeneratorRuntime")
81+
add("dokka${it}Plugin")
82+
add("dokka${it}PublicationPlugin")
83+
add("dokka${it}PublicationPluginApiOnly~internal")
84+
}
85+
}
8086
)
8187
}
8288
}
@@ -223,10 +229,8 @@ class DokkaPluginFunctionalTest : FunSpec({
223229
* The output formats that Dokka supports.
224230
*/
225231
private val expectedFormats = listOf(
226-
//"Gfm",
227232
"Html",
228-
//"Javadoc",
229-
//"Jekyll",
233+
"Javadoc",
230234
)
231235

232236
/**
@@ -284,6 +288,5 @@ class DokkaPluginFunctionalTest : FunSpec({
284288
.filterNot { it.startsWith("Consumable configurations with identical capabilities within a project") }
285289
.joinToString("\n")
286290
}
287-
288291
}
289292
}

dokka-runners/dokka-gradle-plugin/src/testFunctional/kotlin/MultiModuleFunctionalTest.kt

+23-5
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ class MultiModuleFunctionalTest : FunSpec({
3232
project.runner
3333
.addArguments(
3434
":dokkaGenerate",
35+
"--stacktrace",
3536
"--rerun-tasks",
3637
)
3738
.forwardOutput()
@@ -145,7 +146,7 @@ class MultiModuleFunctionalTest : FunSpec({
145146
test("expect build is successful") {
146147
output shouldContainAll listOf(
147148
"BUILD SUCCESSFUL",
148-
"4 actionable tasks: 4 up-to-date",
149+
"8 actionable tasks: 8 up-to-date",
149150
)
150151
}
151152

@@ -189,6 +190,9 @@ class MultiModuleFunctionalTest : FunSpec({
189190
":dokkaGeneratePublicationHtml",
190191
":subproject-hello:dokkaGenerateModuleHtml",
191192
":subproject-goodbye:dokkaGenerateModuleHtml",
193+
":dokkaGeneratePublicationJavadoc",
194+
":subproject-hello:dokkaGenerateModuleJavadoc",
195+
":subproject-goodbye:dokkaGenerateModuleJavadoc",
192196
)
193197

194198
test("setup build cache") {
@@ -215,6 +219,7 @@ class MultiModuleFunctionalTest : FunSpec({
215219
.addArguments(
216220
"clean",
217221
"--build-cache",
222+
"--stacktrace",
218223
)
219224
.forwardOutput()
220225
.build {
@@ -248,6 +253,7 @@ class MultiModuleFunctionalTest : FunSpec({
248253
.addArguments(
249254
"clean",
250255
"--build-cache",
256+
"--stacktrace",
251257
)
252258
.forwardOutput()
253259
.build {
@@ -445,6 +451,7 @@ class MultiModuleFunctionalTest : FunSpec({
445451
"--no-configuration-cache",
446452
"--no-build-cache",
447453
"--quiet",
454+
"--stacktrace",
448455
)
449456
.forwardOutput()
450457
.build {
@@ -460,6 +467,7 @@ class MultiModuleFunctionalTest : FunSpec({
460467
"--no-configuration-cache",
461468
"--no-build-cache",
462469
"--no-parallel",
470+
"--stacktrace",
463471
// no logging option => lifecycle log level
464472
)
465473
.forwardOutput()
@@ -480,13 +488,22 @@ class MultiModuleFunctionalTest : FunSpec({
480488
.filter { it.startsWith("> Task :") }
481489
.shouldContainAll(
482490
"> Task :clean",
483-
"> Task :dokkaGenerate",
484-
"> Task :dokkaGenerateModuleHtml",
485-
"> Task :dokkaGeneratePublicationHtml",
486491
"> Task :subproject-goodbye:clean",
487-
"> Task :subproject-goodbye:dokkaGenerateModuleHtml",
488492
"> Task :subproject-hello:clean",
493+
494+
"> Task :dokkaGenerate",
495+
496+
"> Task :dokkaGeneratePublicationHtml",
497+
"> Task :dokkaGeneratePublicationJavadoc",
498+
499+
"> Task :dokkaGenerateModuleHtml",
500+
"> Task :dokkaGenerateModuleJavadoc",
501+
489502
"> Task :subproject-hello:dokkaGenerateModuleHtml",
503+
"> Task :subproject-hello:dokkaGenerateModuleJavadoc",
504+
505+
"> Task :subproject-goodbye:dokkaGenerateModuleHtml",
506+
"> Task :subproject-goodbye:dokkaGenerateModuleJavadoc",
490507
)
491508
}
492509
}
@@ -580,6 +597,7 @@ class MultiModuleFunctionalTest : FunSpec({
580597
.addArguments(
581598
":dokkaGeneratePublicationHtml",
582599
"--rerun-tasks",
600+
"--stacktrace",
583601
)
584602
.forwardOutput()
585603
.build {

0 commit comments

Comments
 (0)