aboutsummaryrefslogtreecommitdiff
path: root/core/src/main/kotlin/ant/dokka.kt
blob: 7ca402e8ec345c3fa7fcbe5bbef5820495405d03 (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
98
99
100
101
102
103
104
package org.jetbrains.dokka.ant

import org.apache.tools.ant.BuildException
import org.apache.tools.ant.Project
import org.apache.tools.ant.Task
import org.apache.tools.ant.types.Path
import org.apache.tools.ant.types.Reference
import org.jetbrains.dokka.DocumentationOptions
import org.jetbrains.dokka.DokkaGenerator
import org.jetbrains.dokka.DokkaLogger
import org.jetbrains.dokka.SourceLinkDefinition
import java.io.File

class AntLogger(val task: Task): DokkaLogger {
    override fun info(message: String) = task.log(message, Project.MSG_INFO)
    override fun warn(message: String) = task.log(message, Project.MSG_WARN)
    override fun error(message: String) = task.log(message, Project.MSG_ERR)
}

class AntSourceLinkDefinition(var path: String? = null, var url: String? = null, var lineSuffix: String? = null)

class DokkaAntTask(): Task() {
    var moduleName: String? = null
    var outputDir: String? = null
    var outputFormat: String = "html"
    var jdkVersion: Int = 6

    var skipDeprecated: Boolean = false

    val compileClasspath: Path by lazy { Path(getProject()) }
    val sourcePath: Path by lazy { Path(getProject()) }
    val samplesPath: Path by lazy { Path(getProject()) }
    val includesPath: Path by lazy { Path(getProject()) }

    val antSourceLinks: MutableList<AntSourceLinkDefinition> = arrayListOf()

    fun setClasspath(classpath: Path) {
        compileClasspath.append(classpath)
    }

    fun setClasspathRef(ref: Reference) {
        compileClasspath.createPath().refid = ref
    }

    fun setSrc(src: Path) {
        sourcePath.append(src)
    }

    fun setSrcRef(ref: Reference) {
        sourcePath.createPath().refid = ref
    }

    fun setSamples(samples: Path) {
        samplesPath.append(samples)
    }

    fun setSamplesRef(ref: Reference) {
        samplesPath.createPath().refid = ref
    }

    fun setInclude(include: Path) {
        includesPath.append(include)
    }

    fun createSourceLink(): AntSourceLinkDefinition {
        val def = AntSourceLinkDefinition()
        antSourceLinks.add(def)
        return def
    }

    override fun execute() {
        if (sourcePath.list().size == 0) {
            throw BuildException("At least one source path needs to be specified")
        }
        if (moduleName == null) {
            throw BuildException("Module name needs to be specified")
        }
        if (outputDir == null) {
            throw BuildException("Output directory needs to be specified")
        }
        val sourceLinks = antSourceLinks.map {
            val path = it.path ?: throw BuildException("'path' attribute of a <sourceLink> element is required")
            val url = it.url ?: throw BuildException("'url' attribute of a <sourceLink> element is required")
            SourceLinkDefinition(File(path).canonicalFile.absolutePath, url, it.lineSuffix)
        }

        val url = DokkaAntTask::class.java.getResource("/org/jetbrains/dokka/ant/DokkaAntTask.class")
        val jarRoot = url.path.substringBefore("!/").removePrefix("file:")

        val generator = DokkaGenerator(
                AntLogger(this),
                listOf(jarRoot) + compileClasspath.list().toList(),
                sourcePath.list().toList(),
                samplesPath.list().toList(),
                includesPath.list().toList(),
                moduleName!!,
                DocumentationOptions(outputDir!!, outputFormat,
                        skipDeprecated = skipDeprecated,
                        sourceLinks = sourceLinks,
                        jdkVersion = jdkVersion)
        )
        generator.generate()
    }
}