From f0ff0d0a187f355cc4bce28cf94c6921b239dac5 Mon Sep 17 00:00:00 2001 From: Alexey Tsvetkov Date: Wed, 27 Jul 2016 18:43:06 +0300 Subject: [PATCH] Refactoring: inject FileResolver This is part of refactoring to minimize using of internal API in gradle plugin --- ...eSet.kt => KotlinSourceSetProviderImpl.kt} | 25 ++++------ .../kotlin/gradle/plugin/KotlinPlugin.kt | 49 ++++++++++++------- .../gradle/plugin/KotlinPluginWrapper.kt | 20 +++++--- .../kotlin/gradle/plugin/KotlinSourceSet.kt | 10 ++++ .../gradle/plugin/KotlinSourceSetProvider.kt | 5 ++ 5 files changed, 68 insertions(+), 41 deletions(-) rename libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/{KotlinSourceSet.kt => KotlinSourceSetProviderImpl.kt} (71%) create mode 100644 libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinSourceSet.kt create mode 100644 libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinSourceSetProvider.kt diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/KotlinSourceSet.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/KotlinSourceSetProviderImpl.kt similarity index 71% rename from libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/KotlinSourceSet.kt rename to libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/KotlinSourceSetProviderImpl.kt index 5bed84f377b..3dba01c61cf 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/KotlinSourceSet.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/KotlinSourceSetProviderImpl.kt @@ -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?): 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?): 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) diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPlugin.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPlugin.kt index 61fad82b9fd..3b9e601445c 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPlugin.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPlugin.kt @@ -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( 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( 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( 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( - 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( - 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 { +abstract class AbstractKotlinPlugin @Inject constructor(val scriptHandler: ScriptHandler, val tasksProvider: KotlinTasksProvider, val kotlinSourceSetProvider: KotlinSourceSetProvider) : Plugin { 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 { +open class KotlinAndroidPlugin( + val scriptHandler: ScriptHandler, + val tasksProvider: KotlinTasksProvider, + private val kotlinSourceSetProvider: KotlinSourceSetProvider +) : Plugin { 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(provider, "kotlin") - val kotlinSourceDirectorySet = kotlinSourceSet.getKotlin() - kotlinTask.source(kotlinSourceDirectorySet) + kotlinTask.source(kotlinSourceSet.kotlin) } for (javaSrcDir in AndroidGradleWrapper.getJavaSources(variantData)) { diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPluginWrapper.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPluginWrapper.kt index e33c1ed8499..24304af0338 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPluginWrapper.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPluginWrapper.kt @@ -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 { +abstract class KotlinBasePluginWrapper(protected val fileResolver: FileResolver): Plugin { val log = Logging.getLogger(this.javaClass) @@ -55,16 +58,19 @@ abstract class KotlinBasePluginWrapper: Plugin { } } -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) { diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinSourceSet.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinSourceSet.kt new file mode 100644 index 00000000000..78a863d5280 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinSourceSet.kt @@ -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?): KotlinSourceSet +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinSourceSetProvider.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinSourceSetProvider.kt new file mode 100644 index 00000000000..f557fd59c3e --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinSourceSetProvider.kt @@ -0,0 +1,5 @@ +package org.jetbrains.kotlin.gradle.plugin + +interface KotlinSourceSetProvider { + fun create(displayName: String): KotlinSourceSet +} \ No newline at end of file