aboutsummaryrefslogtreecommitdiff
path: root/gradle-plugin/src/main/kotlin/main.kt
blob: 418af00f016d4fa27cffd4085345c453d560d99d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
package org.jetbrains.dokka.gradle

import groovy.lang.Closure
import org.gradle.api.DefaultTask
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.api.plugins.JavaBasePlugin
import org.gradle.api.plugins.JavaPluginConvention
import org.gradle.api.tasks.SourceSet
import org.gradle.api.tasks.TaskAction
import org.jetbrains.dokka.DokkaGenerator
import org.jetbrains.dokka.SourceLinkDefinition
import java.io.File
import java.util.ArrayList

public open class DokkaPlugin : Plugin<Project> {
    override fun apply(project: Project) {
        val ext = project.getExtensions().create("dokka", javaClass<DokkaExtension>())
        project.getTasks().create("dokka", javaClass<DokkaTask>())

        ext.moduleName = project.getName()
        ext.outputDirectory = File(project.getBuildDir(), "dokka").getAbsolutePath()
    }
}

public open class DokkaTask : DefaultTask() {
    init {
        setGroup(JavaBasePlugin.DOCUMENTATION_GROUP)
        setDescription("Generates dokka documentation for Kotlin")
    }

    TaskAction
    fun generate() {
        val project = getProject()
        val conf = getProject().getExtensions().getByType(javaClass<DokkaExtension>())
        val javaPluginConvention = getProject().getConvention().getPlugin(javaClass<JavaPluginConvention>())

        val sourceSets = javaPluginConvention.getSourceSets()?.findByName(SourceSet.MAIN_SOURCE_SET_NAME)
        val sourceDirectories = sourceSets?.getAllSource()?.getSrcDirs()?.filter { it.exists() } ?: emptyList()
        val allConfigurations = getProject().getConfigurations()

        val classpath =
                conf.processConfigurations
                .map { allConfigurations?.getByName(it) ?: throw IllegalArgumentException("No configuration $it found") }
                .flatMap { it }

        if (sourceDirectories.isEmpty()) {
            getLogger().warn("No source directories found: skipping dokka generation")
            return
        }

        DokkaGenerator(
                DokkaGradleLogger(getLogger()),
                classpath.map { it.getAbsolutePath() },
                sourceDirectories.map { it.getAbsolutePath() },
                conf.samples,
                conf.includes,
                conf.moduleName,
                conf.outputDirectory,
                conf.outputFormat,
                conf.linkMappings.map { SourceLinkDefinition(project.file(it.dir).getAbsolutePath(), it.url, it.suffix) },
                false
        ).generate()
    }

}

public open class DokkaExtension {
    var moduleName: String = ""
    var outputFormat: String = "html"
    var outputDirectory: String = ""
    var processConfigurations: ArrayList<String> = arrayListOf("compile")
    var includes: ArrayList<String> = arrayListOf()
    var linkMappings: ArrayList<LinkMapping> = arrayListOf()
    var samples: ArrayList<String> = arrayListOf()

    fun linkMapping(closure: Closure<Any?>) {
        val mapping = LinkMapping()
        closure.setDelegate(mapping)
        closure.call()

        if (mapping.dir.isEmpty()) {
            throw IllegalArgumentException("Link mapping should have dir")
        }
        if (mapping.url.isEmpty()) {
            throw IllegalArgumentException("Link mapping should have url")
        }

        linkMappings.add(mapping)
    }
}

public open class LinkMapping {
    var dir: String = ""
    var url: String = ""
    var suffix: String? = null
}