Refactoring: inject FileResolver

This is part of refactoring to minimize using of internal API in gradle plugin
This commit is contained in:
Alexey Tsvetkov
2016-07-27 18:43:06 +03:00
parent 2c1d90c79d
commit f0ff0d0a18
5 changed files with 68 additions and 41 deletions
@@ -5,35 +5,30 @@ import org.gradle.api.file.SourceDirectorySet
import org.gradle.api.internal.file.DefaultSourceDirectorySet
import org.gradle.api.internal.file.FileResolver
import org.gradle.util.ConfigureUtil
import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet
import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSetProvider
import java.lang.reflect.Constructor
interface KotlinSourceSet {
fun getKotlin(): SourceDirectorySet
fun kotlin(configureClosure: Closure<Any?>?): KotlinSourceSet
internal class KotlinSourceSetProviderImpl constructor(private val fileResolver: FileResolver) : KotlinSourceSetProvider {
override fun create(displayName: String): KotlinSourceSet =
KotlinSourceSetImpl(displayName, fileResolver)
}
open class KotlinSourceSetImpl(displayName: String?, resolver: FileResolver?): KotlinSourceSet {
private val kotlin: DefaultSourceDirectorySet = createDefaultSourceDirectorySet(displayName + " Kotlin source", resolver)
private class KotlinSourceSetImpl(displayName: String, resolver: FileResolver) : KotlinSourceSet {
override val kotlin: SourceDirectorySet =
createDefaultSourceDirectorySet(displayName + " Kotlin source", resolver)
init {
kotlin.filter?.include("**/*.java", "**/*.kt")
}
override fun getKotlin(): SourceDirectorySet {
return kotlin
}
override fun kotlin(configureClosure: Closure<Any?>?): KotlinSourceSet {
ConfigureUtil.configure(configureClosure, getKotlin())
ConfigureUtil.configure(configureClosure, kotlin)
return this
}
}
private val createDefaultSourceDirectorySet: (name: String?, resolver: FileResolver?) -> DefaultSourceDirectorySet = run {
private val createDefaultSourceDirectorySet: (name: String?, resolver: FileResolver?) -> SourceDirectorySet = run {
val klass = DefaultSourceDirectorySet::class.java
val defaultConstructor = klass.constructorOrNull(String::class.java, FileResolver::class.java)
@@ -30,8 +30,6 @@ import org.gradle.api.tasks.compile.AbstractCompile
import org.gradle.api.tasks.compile.JavaCompile
import org.jetbrains.kotlin.cli.common.arguments.K2JVMCompilerArguments
import org.jetbrains.kotlin.gradle.internal.AnnotationProcessingManager
import org.jetbrains.kotlin.gradle.internal.KotlinSourceSet
import org.jetbrains.kotlin.gradle.internal.KotlinSourceSetImpl
import org.jetbrains.kotlin.gradle.internal.initKapt
import org.jetbrains.kotlin.gradle.plugin.android.AndroidGradleWrapper
import org.jetbrains.kotlin.gradle.tasks.Kotlin2JsCompile
@@ -51,6 +49,7 @@ abstract class KotlinSourceSetProcessor<T : AbstractCompile>(
val javaBasePlugin: JavaBasePlugin,
val sourceSet: SourceSet,
val tasksProvider: KotlinTasksProvider,
val kotlinSourceSetProvider: KotlinSourceSetProvider,
val pluginName: String,
val compileTaskNameSuffix: String,
val taskDescription: String
@@ -78,7 +77,7 @@ abstract class KotlinSourceSetProcessor<T : AbstractCompile>(
private fun createKotlinSourceSet(): KotlinSourceSet? =
if (sourceSet is HasConvention) {
logger.kotlinDebug("Creating KotlinSourceSet for source set ${sourceSet}")
val kotlinSourceSet = KotlinSourceSetImpl(sourceSet.name, project.fileResolver)
val kotlinSourceSet = kotlinSourceSetProvider.create(sourceSet.name)
sourceSet.convention.plugins.put(pluginName, kotlinSourceSet)
kotlinSourceSet
} else {
@@ -88,7 +87,7 @@ abstract class KotlinSourceSetProcessor<T : AbstractCompile>(
private fun createKotlinDirSet(): SourceDirectorySet? {
val srcDir = project.file(sourceRootDir)
logger.kotlinDebug("Creating Kotlin SourceDirectorySet for source set $kotlinSourceSet with src dir $srcDir")
val kotlinDirSet = kotlinSourceSet?.getKotlin()
val kotlinDirSet = kotlinSourceSet?.kotlin
kotlinDirSet?.srcDir(srcDir)
return kotlinDirSet
}
@@ -119,9 +118,10 @@ class Kotlin2JvmSourceSetProcessor(
javaBasePlugin: JavaBasePlugin,
sourceSet: SourceSet,
val scriptHandler: ScriptHandler,
tasksProvider: KotlinTasksProvider
tasksProvider: KotlinTasksProvider,
kotlinSourceSetProvider: KotlinSourceSetProvider
) : KotlinSourceSetProcessor<KotlinCompile>(
project, javaBasePlugin, sourceSet, tasksProvider,
project, javaBasePlugin, sourceSet, tasksProvider, kotlinSourceSetProvider,
pluginName = "kotlin",
compileTaskNameSuffix = "kotlin",
taskDescription = "Compiles the $sourceSet.kotlin."
@@ -185,9 +185,10 @@ class Kotlin2JsSourceSetProcessor(
javaBasePlugin: JavaBasePlugin,
sourceSet: SourceSet,
val scriptHandler: ScriptHandler,
tasksProvider: KotlinTasksProvider
tasksProvider: KotlinTasksProvider,
kotlinSourceSetProvider: KotlinSourceSetProvider
) : KotlinSourceSetProcessor<Kotlin2JsCompile>(
project, javaBasePlugin, sourceSet, tasksProvider,
project, javaBasePlugin, sourceSet, tasksProvider, kotlinSourceSetProvider,
pluginName = "kotlin2js",
taskDescription = "Compiles the kotlin sources in $sourceSet to JavaScript.",
compileTaskNameSuffix = "kotlin2Js"
@@ -232,7 +233,7 @@ class Kotlin2JsSourceSetProcessor(
}
abstract class AbstractKotlinPlugin @Inject constructor(val scriptHandler: ScriptHandler, val tasksProvider: KotlinTasksProvider) : Plugin<Project> {
abstract class AbstractKotlinPlugin @Inject constructor(val scriptHandler: ScriptHandler, val tasksProvider: KotlinTasksProvider, val kotlinSourceSetProvider: KotlinSourceSetProvider) : Plugin<Project> {
abstract fun buildSourceSetProcessor(project: ProjectInternal, javaBasePlugin: JavaBasePlugin, sourceSet: SourceSet): KotlinSourceSetProcessor<*>
public override fun apply(project: Project) {
@@ -256,9 +257,13 @@ abstract class AbstractKotlinPlugin @Inject constructor(val scriptHandler: Scrip
}
open class KotlinPlugin @Inject constructor(scriptHandler: ScriptHandler, tasksProvider: KotlinTasksProvider) : AbstractKotlinPlugin(scriptHandler, tasksProvider) {
open class KotlinPlugin(
scriptHandler: ScriptHandler,
tasksProvider: KotlinTasksProvider,
kotlinSourceSetProvider: KotlinSourceSetProvider
) : AbstractKotlinPlugin(scriptHandler, tasksProvider, kotlinSourceSetProvider) {
override fun buildSourceSetProcessor(project: ProjectInternal, javaBasePlugin: JavaBasePlugin, sourceSet: SourceSet) =
Kotlin2JvmSourceSetProcessor(project, javaBasePlugin, sourceSet, scriptHandler, tasksProvider)
Kotlin2JvmSourceSetProcessor(project, javaBasePlugin, sourceSet, scriptHandler, tasksProvider, kotlinSourceSetProvider)
override fun apply(project: Project) {
project.createKaptExtension()
@@ -267,13 +272,20 @@ open class KotlinPlugin @Inject constructor(scriptHandler: ScriptHandler, tasksP
}
open class Kotlin2JsPlugin @Inject constructor(scriptHandler: ScriptHandler, tasksProvider: KotlinTasksProvider) : AbstractKotlinPlugin(scriptHandler, tasksProvider) {
open class Kotlin2JsPlugin(
scriptHandler: ScriptHandler,
tasksProvider: KotlinTasksProvider,
kotlinSourceSetProvider: KotlinSourceSetProvider
) : AbstractKotlinPlugin(scriptHandler, tasksProvider, kotlinSourceSetProvider) {
override fun buildSourceSetProcessor(project: ProjectInternal, javaBasePlugin: JavaBasePlugin, sourceSet: SourceSet) =
Kotlin2JsSourceSetProcessor(project, javaBasePlugin, sourceSet, scriptHandler, tasksProvider)
Kotlin2JsSourceSetProcessor(project, javaBasePlugin, sourceSet, scriptHandler, tasksProvider, kotlinSourceSetProvider)
}
open class KotlinAndroidPlugin @Inject constructor(val scriptHandler: ScriptHandler, val tasksProvider: KotlinTasksProvider) : Plugin<Project> {
open class KotlinAndroidPlugin(
val scriptHandler: ScriptHandler,
val tasksProvider: KotlinTasksProvider,
private val kotlinSourceSetProvider: KotlinSourceSetProvider
) : Plugin<Project> {
val log = Logging.getLogger(this.javaClass)
@@ -298,9 +310,9 @@ open class KotlinAndroidPlugin @Inject constructor(val scriptHandler: ScriptHand
ext.sourceSets.all { sourceSet ->
if (sourceSet is HasConvention) {
val sourceSetName = sourceSet.name
val kotlinSourceSet = KotlinSourceSetImpl(sourceSetName, project.fileResolver)
val kotlinSourceSet = kotlinSourceSetProvider.create(sourceSetName)
sourceSet.convention.plugins.put("kotlin", kotlinSourceSet)
val kotlinDirSet = kotlinSourceSet.getKotlin()
val kotlinDirSet = kotlinSourceSet.kotlin
kotlinDirSet.srcDir(project.file("src/$sourceSetName/kotlin"))
aptConfigurations.put(sourceSet.name,
@@ -403,8 +415,7 @@ open class KotlinAndroidPlugin @Inject constructor(val scriptHandler: ScriptHand
for (provider in variantData.sourceProviders) {
val kotlinSourceSet = getExtension<KotlinSourceSet>(provider, "kotlin")
val kotlinSourceDirectorySet = kotlinSourceSet.getKotlin()
kotlinTask.source(kotlinSourceDirectorySet)
kotlinTask.source(kotlinSourceSet.kotlin)
}
for (javaSrcDir in AndroidGradleWrapper.getJavaSources(variantData)) {
@@ -3,14 +3,17 @@ package org.jetbrains.kotlin.gradle.plugin
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.api.initialization.dsl.ScriptHandler
import org.gradle.api.internal.file.FileResolver
import org.gradle.api.logging.Logger
import org.gradle.api.logging.Logging
import org.jetbrains.kotlin.gradle.internal.KotlinSourceSetProviderImpl
import org.jetbrains.kotlin.gradle.tasks.AndroidTasksProvider
import org.jetbrains.kotlin.gradle.tasks.KotlinTasksProvider
import javax.inject.Inject
// TODO: simplify: the complicated structure is a leftover from dynamic loading of plugin core, could be significantly simplified now
abstract class KotlinBasePluginWrapper: Plugin<Project> {
abstract class KotlinBasePluginWrapper(protected val fileResolver: FileResolver): Plugin<Project> {
val log = Logging.getLogger(this.javaClass)
@@ -55,16 +58,19 @@ abstract class KotlinBasePluginWrapper: Plugin<Project> {
}
}
open class KotlinPluginWrapper: KotlinBasePluginWrapper() {
override fun getPlugin(scriptHandler: ScriptHandler) = KotlinPlugin(scriptHandler, KotlinTasksProvider())
open class KotlinPluginWrapper @Inject constructor(fileResolver: FileResolver): KotlinBasePluginWrapper(fileResolver) {
override fun getPlugin(scriptHandler: ScriptHandler) =
KotlinPlugin(scriptHandler, KotlinTasksProvider(), KotlinSourceSetProviderImpl(fileResolver))
}
open class KotlinAndroidPluginWrapper : KotlinBasePluginWrapper() {
override fun getPlugin(scriptHandler: ScriptHandler) = KotlinAndroidPlugin(scriptHandler, AndroidTasksProvider())
open class KotlinAndroidPluginWrapper @Inject constructor(fileResolver: FileResolver): KotlinBasePluginWrapper(fileResolver) {
override fun getPlugin(scriptHandler: ScriptHandler) =
KotlinAndroidPlugin(scriptHandler, AndroidTasksProvider(), KotlinSourceSetProviderImpl(fileResolver))
}
open class Kotlin2JsPluginWrapper : KotlinBasePluginWrapper() {
override fun getPlugin(scriptHandler: ScriptHandler) = Kotlin2JsPlugin(scriptHandler, KotlinTasksProvider())
open class Kotlin2JsPluginWrapper @Inject constructor(fileResolver: FileResolver): KotlinBasePluginWrapper(fileResolver) {
override fun getPlugin(scriptHandler: ScriptHandler) =
Kotlin2JsPlugin(scriptHandler, KotlinTasksProvider(), KotlinSourceSetProviderImpl(fileResolver))
}
fun Logger.kotlinDebug(message: String) {
@@ -0,0 +1,10 @@
package org.jetbrains.kotlin.gradle.plugin
import groovy.lang.Closure
import org.gradle.api.file.SourceDirectorySet
interface KotlinSourceSet {
val kotlin: SourceDirectorySet
fun kotlin(configureClosure: Closure<Any?>?): KotlinSourceSet
}
@@ -0,0 +1,5 @@
package org.jetbrains.kotlin.gradle.plugin
interface KotlinSourceSetProvider {
fun create(displayName: String): KotlinSourceSet
}