From 6b551610dfe0503a312b14fd860b2758d7707b1c Mon Sep 17 00:00:00 2001 From: porokoro Date: Sun, 20 Mar 2016 00:17:26 +0100 Subject: Provide basic support for Android library projects and make the source directories configurable for the user --- dokka-gradle-plugin/src/main/kotlin/main.kt | 75 ++++++++++++++++++++++++----- 1 file changed, 64 insertions(+), 11 deletions(-) (limited to 'dokka-gradle-plugin/src/main/kotlin') diff --git a/dokka-gradle-plugin/src/main/kotlin/main.kt b/dokka-gradle-plugin/src/main/kotlin/main.kt index 476f7656..e3275501 100644 --- a/dokka-gradle-plugin/src/main/kotlin/main.kt +++ b/dokka-gradle-plugin/src/main/kotlin/main.kt @@ -44,6 +44,10 @@ open class DokkaTask : DefaultTask() { var samples: List = arrayListOf() @Input var jdkVersion: Int = 6 + @Input + var sourceDirs: Iterable = emptyList() + + protected open val sdkProvider: SdkProvider? = null fun linkMapping(closure: Closure) { val mapping = LinkMapping() @@ -63,13 +67,15 @@ open class DokkaTask : DefaultTask() { @TaskAction fun generate() { val project = project + val sdkProvider = sdkProvider val sourceDirectories = getSourceDirectories() val allConfigurations = project.configurations val classpath = - processConfigurations - .map { allConfigurations?.getByName(it.toString()) ?: throw IllegalArgumentException("No configuration $it found") } - .flatMap { it } + if (sdkProvider != null && sdkProvider.isValid) sdkProvider.classpath else emptyList() + + processConfigurations + .map { allConfigurations?.getByName(it.toString()) ?: throw IllegalArgumentException("No configuration $it found") } + .flatMap { it } if (sourceDirectories.isEmpty()) { logger.warn("No source directories found: skipping dokka generation") @@ -89,20 +95,33 @@ open class DokkaTask : DefaultTask() { ).generate() } - fun getSourceDirectories(): List { - val javaPluginConvention = project.convention.getPlugin(JavaPluginConvention::class.java) - val sourceSets = javaPluginConvention.sourceSets?.findByName(SourceSet.MAIN_SOURCE_SET_NAME) - return sourceSets?.allSource?.srcDirs?.filter { it.exists() } ?: emptyList() + fun getSourceDirectories(): Collection { + val provider = sdkProvider + val sourceDirs = if (sourceDirs.any()) { + logger.info("Dokka: Taking source directories provided by the user") + sourceDirs.toSet() + } else if (provider != null && provider.isValid) { + logger.info("Dokka: Taking source directories from ${provider.name} sdk provider") + provider.sourceDirs + } else { + logger.info("Dokka: Taking source directories from default java plugin") + val javaPluginConvention = project.convention.getPlugin(JavaPluginConvention::class.java) + val sourceSets = javaPluginConvention.sourceSets?.findByName(SourceSet.MAIN_SOURCE_SET_NAME) + sourceSets?.allSource?.srcDirs + } + + return sourceDirs?.filter { it.exists() } ?: emptyList() } + @Input @InputFiles @SkipWhenEmpty - fun getInputFiles() : FileCollection = project.files(getSourceDirectories().map { project.fileTree(it) }) + - project.files(includes) + - project.files(samples) + fun getInputFiles(): FileCollection = project.files(getSourceDirectories().map { project.fileTree(it) }) + + project.files(includes) + + project.files(samples) @OutputDirectory - fun getOutputDirectoryAsFile() : File = project.file(outputDirectory) + fun getOutputDirectoryAsFile(): File = project.file(outputDirectory) } @@ -111,3 +130,37 @@ open class LinkMapping { var url: String = "" var suffix: String? = null } + +/** + * A provider for SDKs that can be used if a project uses classes that live outside the JDK or uses a + * different method to determine the source directories. + * + * For example an Android library project configures its sources through the Android extension instead + * of the basic java convention. Also it has its custom classes located in the SDK installation directory. + */ +interface SdkProvider { + /** + * The name of this provider. Only used for logging purposes. + */ + val name: String + + /** + * Checks whether this provider has everything it needs to provide the source directories. + */ + val isValid: Boolean + + /** + * Provides additional classpath files where Dokka should search for external classes. + * The file list is injected **after** JDK Jars and **before** project dependencies. + * + * This is only called if [isValid] returns `true`. + */ + val classpath: List + + /** + * Provides a list of directories where Dokka should search for source files. + * + * This is only called if [isValid] returns `true`. + */ + val sourceDirs: Set? +} -- cgit