Refactoring: do not use extraProperties to pass kapt options to task

This commit is contained in:
Alexey Tsvetkov
2016-07-22 15:21:13 +03:00
parent c838eed6a3
commit 92af1e9454
5 changed files with 65 additions and 57 deletions
@@ -0,0 +1,24 @@
package org.jetbrains.kotlin.gradle.tasks
import java.io.File
class CompilerPluginOptions {
private val mutableClasspath = arrayListOf<String>()
private val mutableArguments = arrayListOf<String>()
val classpath: List<String>
get() = mutableClasspath
val arguments: List<String>
get() = mutableArguments
// used in kotlin-gradle-plugin
@Suppress("unused")
fun addClasspathEntry(file: File) {
mutableClasspath.add(file.canonicalPath)
}
fun addPluginArgument(pluginId: String, key: String, value: String) {
mutableArguments.add("plugin:$pluginId:$key=$value")
}
}
@@ -0,0 +1,9 @@
package org.jetbrains.kotlin.gradle.tasks
import java.io.File
class KaptOptions {
var supportInheritedAnnotations: Boolean = false
var classFileStubsDir: File? = null
var annotationsFile: File? = null
}
@@ -157,6 +157,8 @@ open class KotlinCompile() : AbstractKotlinCompile<K2JVMCompilerArguments>() {
private var kaptAnnotationsFileUpdater: AnnotationFileUpdater? = null private var kaptAnnotationsFileUpdater: AnnotationFileUpdater? = null
private var kaptStubGeneratingMode = false private var kaptStubGeneratingMode = false
val kaptOptions = KaptOptions()
val pluginOptions = CompilerPluginOptions()
override fun populateTargetSpecificArgs(args: K2JVMCompilerArguments) { override fun populateTargetSpecificArgs(args: K2JVMCompilerArguments) {
// show kotlin compiler where to look for java source files // show kotlin compiler where to look for java source files
@@ -176,14 +178,10 @@ open class KotlinCompile() : AbstractKotlinCompile<K2JVMCompilerArguments>() {
logger.kotlinDebug("destinationDir = $destinationDir") logger.kotlinDebug("destinationDir = $destinationDir")
val extraProperties = extensions.extraProperties val extraProperties = extensions.extraProperties
args.pluginClasspaths = extraProperties.getOrNull<Array<String>>("compilerPluginClasspaths") ?: arrayOf() args.pluginClasspaths = pluginOptions.classpath.toTypedArray()
logger.kotlinDebug("args.pluginClasspaths = ${args.pluginClasspaths.joinToString(File.pathSeparator)}") logger.kotlinDebug("args.pluginClasspaths = ${args.pluginClasspaths.joinToString(File.pathSeparator)}")
val basePluginOptions = extraProperties.getOrNull<Array<String>>("compilerPluginArguments") ?: arrayOf() handleKaptProperties()
args.pluginOptions = pluginOptions.arguments.toTypedArray()
val pluginOptions = arrayListOf(*basePluginOptions)
handleKaptProperties(extraProperties, pluginOptions)
args.pluginOptions = pluginOptions.toTypedArray()
logger.kotlinDebug("args.pluginOptions = ${args.pluginOptions.joinToString(File.pathSeparator)}") logger.kotlinDebug("args.pluginOptions = ${args.pluginOptions.joinToString(File.pathSeparator)}")
args.noStdlib = true args.noStdlib = true
@@ -476,26 +474,23 @@ open class KotlinCompile() : AbstractKotlinCompile<K2JVMCompilerArguments>() {
} }
} }
private fun handleKaptProperties(extraProperties: ExtraPropertiesExtension, pluginOptions: MutableList<String>) { private fun handleKaptProperties() {
val kaptAnnotationsFile = extraProperties.getOrNull<File>("kaptAnnotationsFile") kaptOptions.annotationsFile?.let { kaptAnnotationsFile ->
if (kaptAnnotationsFile != null) {
if (incremental) { if (incremental) {
kaptAnnotationsFileUpdater = AnnotationFileUpdater(kaptAnnotationsFile) kaptAnnotationsFileUpdater = AnnotationFileUpdater(kaptAnnotationsFile)
} }
if (kaptAnnotationsFile.exists()) kaptAnnotationsFile.delete() if (kaptAnnotationsFile.exists()) kaptAnnotationsFile.delete()
pluginOptions.add("plugin:$ANNOTATIONS_PLUGIN_NAME:output=" + kaptAnnotationsFile) pluginOptions.addPluginArgument(ANNOTATIONS_PLUGIN_NAME, "output", kaptAnnotationsFile.canonicalPath)
} }
val kaptClassFileStubsDir = extraProperties.getOrNull<File>("kaptStubsDir") kaptOptions.classFileStubsDir?.let { kaptClassFileStubsDir ->
if (kaptClassFileStubsDir != null) {
kaptStubGeneratingMode = true kaptStubGeneratingMode = true
pluginOptions.add("plugin:$ANNOTATIONS_PLUGIN_NAME:stubs=" + kaptClassFileStubsDir) pluginOptions.addPluginArgument(ANNOTATIONS_PLUGIN_NAME, "stubs", kaptClassFileStubsDir.canonicalPath)
} }
val supportInheritedAnnotations = extraProperties.getOrNull<Boolean>("kaptInheritedAnnotations") if (kaptOptions.supportInheritedAnnotations) {
if (supportInheritedAnnotations != null && supportInheritedAnnotations) { pluginOptions.addPluginArgument(ANNOTATIONS_PLUGIN_NAME, "inherited", true.toString())
pluginOptions.add("plugin:$ANNOTATIONS_PLUGIN_NAME:inherited=true")
} }
} }
@@ -23,6 +23,7 @@ import org.gradle.api.tasks.compile.AbstractCompile
import org.gradle.api.tasks.compile.JavaCompile import org.gradle.api.tasks.compile.JavaCompile
import org.jetbrains.kotlin.gradle.plugin.* import org.jetbrains.kotlin.gradle.plugin.*
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
import org.jetbrains.kotlin.gradle.tasks.KotlinTasksProvider
import org.jetbrains.kotlin.gradle.tasks.kapt.generateAnnotationProcessorWrapper import org.jetbrains.kotlin.gradle.tasks.kapt.generateAnnotationProcessorWrapper
import org.jetbrains.kotlin.gradle.tasks.kapt.generateKotlinAptAnnotation import org.jetbrains.kotlin.gradle.tasks.kapt.generateKotlinAptAnnotation
import java.io.File import java.io.File
@@ -37,20 +38,20 @@ fun Project.initKapt(
variantName: String, variantName: String,
kotlinOptions: Any?, kotlinOptions: Any?,
subpluginEnvironment: SubpluginEnvironment, subpluginEnvironment: SubpluginEnvironment,
taskFactory: (suffix: String) -> AbstractCompile tasksProvider: KotlinTasksProvider
): AbstractCompile? { ): AbstractCompile? {
val kaptExtension = extensions.getByType(KaptExtension::class.java) val kaptExtension = extensions.getByType(KaptExtension::class.java)
val kotlinAfterJavaTask: AbstractCompile? val kotlinAfterJavaTask: KotlinCompile?
if (kaptExtension.generateStubs) { if (kaptExtension.generateStubs) {
kotlinAfterJavaTask = createKotlinAfterJavaTask(javaTask, kotlinTask, kotlinOptions, taskFactory) kotlinAfterJavaTask = createKotlinAfterJavaTask(javaTask, kotlinTask, kotlinOptions, tasksProvider)
mapKotlinTaskProperties(this, kotlinAfterJavaTask) mapKotlinTaskProperties(this, kotlinAfterJavaTask)
kotlinTask.logger.kotlinDebug("kapt: Using class file stubs") kotlinTask.logger.kotlinDebug("kapt: Using class file stubs")
val stubsDir = File(buildDir, "tmp/kapt/$variantName/classFileStubs") val stubsDir = File(buildDir, "tmp/kapt/$variantName/classFileStubs")
stubsDir.mkdirs() stubsDir.mkdirs()
kotlinTask.extensions.extraProperties.set("kaptStubsDir", stubsDir) kotlinTask.kaptOptions.classFileStubs = stubsDir
javaTask.appendClasspathDynamically(stubsDir) javaTask.appendClasspathDynamically(stubsDir)
kotlinTask.appendClasspathDynamically(stubsDir) kotlinTask.appendClasspathDynamically(stubsDir)
@@ -76,9 +77,7 @@ fun Project.initKapt(
javaTask.appendClasspathDynamically(kaptManager.wrappersDirectory) javaTask.appendClasspathDynamically(kaptManager.wrappersDirectory)
javaTask.source(kaptManager.hackAnnotationDir) javaTask.source(kaptManager.hackAnnotationDir)
if (kaptExtension.inheritedAnnotations) { kotlinTask.kaptOptions.supportInheritedAnnotations = kaptExtension.inheritedAnnotations
kotlinTask.extensions.extraProperties.set("kaptInheritedAnnotations", true)
}
kotlinTask.doFirst { kotlinTask.doFirst {
kaptManager.generateJavaHackFile() kaptManager.generateJavaHackFile()
@@ -98,18 +97,18 @@ fun Project.initKapt(
kaptManager.afterJavaCompile() kaptManager.afterJavaCompile()
} }
kotlinTask.storeKaptAnnotationsFile(kaptManager) kotlinTask.kaptOptions.annotationsFile = kaptManager.getAnnotationFile()
return kotlinAfterJavaTask return kotlinAfterJavaTask
} }
private fun Project.createKotlinAfterJavaTask( private fun Project.createKotlinAfterJavaTask(
javaTask: AbstractCompile, javaTask: AbstractCompile,
kotlinTask: AbstractCompile, kotlinTask: KotlinCompile,
kotlinOptions: Any?, kotlinOptions: Any?,
taskFactory: (suffix: String) -> AbstractCompile
): AbstractCompile {
val kotlinAfterJavaTask = with (taskFactory(KOTLIN_AFTER_JAVA_TASK_SUFFIX)) {
destinationDir = kotlinTask.destinationDir destinationDir = kotlinTask.destinationDir
tasksProvider: KotlinTasksProvider
): KotlinCompile {
val kotlinAfterJavaTask = with (tasksProvider.createKotlinJVMTask(this, KOTLIN_AFTER_JAVA_TASK_SUFFIX)) {
classpath = kotlinTask.classpath - project.files(javaTask.destinationDir) classpath = kotlinTask.classpath - project.files(javaTask.destinationDir)
this this
} }
@@ -172,9 +172,7 @@ class Kotlin2JvmSourceSetProcessor(
aptConfiguration.resolve(), aptOutputDir, aptWorkingDir) aptConfiguration.resolve(), aptOutputDir, aptWorkingDir)
kotlinAfterJavaTask = project.initKapt(kotlinTask, javaTask, kaptManager, kotlinAfterJavaTask = project.initKapt(kotlinTask, javaTask, kaptManager,
sourceSetName, null, subpluginEnvironment) { sourceSetName, null, subpluginEnvironment, tasksProvider)
createKotlinCompileTask(it)
}
if (kotlinAfterJavaTask != null) { if (kotlinAfterJavaTask != null) {
javaTask.doFirst { javaTask.doFirst {
@@ -442,11 +440,7 @@ open class KotlinAndroidPlugin @Inject constructor(val scriptHandler: ScriptHand
val kaptManager = AnnotationProcessingManager(kotlinTask, javaTask, variantDataName, val kaptManager = AnnotationProcessingManager(kotlinTask, javaTask, variantDataName,
aptFiles.toSet(), aptOutputDir, aptWorkingDir, variantData) aptFiles.toSet(), aptOutputDir, aptWorkingDir, variantData)
kotlinTask.storeKaptAnnotationsFile(kaptManager) kotlinAfterJavaTask = project.initKapt(kotlinTask, javaTask, kaptManager, variantDataName, kotlinOptions, subpluginEnvironment, tasksProvider)
kotlinAfterJavaTask = project.initKapt(kotlinTask, javaTask, kaptManager, variantDataName, kotlinOptions, subpluginEnvironment) {
tasksProvider.createKotlinJVMTask(project, kotlinTaskName + KOTLIN_AFTER_JAVA_TASK_SUFFIX)
}
} }
configureJavaTask(kotlinTask, javaTask, kotlinAfterJavaTask, logger) configureJavaTask(kotlinTask, javaTask, kotlinAfterJavaTask, logger)
@@ -560,32 +554,23 @@ class SubpluginEnvironment(
val subplugins: List<KotlinGradleSubplugin> val subplugins: List<KotlinGradleSubplugin>
) { ) {
fun addSubpluginArguments(project: Project, compileTask: AbstractCompile) { fun addSubpluginArguments(project: Project, kotlinTask: KotlinCompile) {
val realPluginClasspaths = arrayListOf<String>() val pluginOptions = kotlinTask.pluginOptions
val pluginArguments = arrayListOf<String>()
fun getPluginOptionString(pluginId: String, key: String, value: String) = "plugin:$pluginId:$key=$value"
for (subplugin in subplugins) { for (subplugin in subplugins) {
if (!subplugin.isApplicable(project, compileTask)) continue if (!subplugin.isApplicable(project, kotlinTask)) continue
with (subplugin) { with (subplugin) {
project.logger.kotlinDebug("Subplugin ${getPluginName()} (${getGroupName()}:${getArtifactName()}) loaded.") project.logger.kotlinDebug("Subplugin ${getPluginName()} (${getGroupName()}:${getArtifactName()}) loaded.")
} }
val subpluginClasspath = subpluginClasspaths[subplugin] val subpluginClasspath = subpluginClasspaths[subplugin] ?: continue
if (subpluginClasspath != null) { subpluginClasspath.forEach { pluginOptions.addClasspathEntry(it) }
subpluginClasspath.forEach { realPluginClasspaths.add(it.absolutePath) }
for (arg in subplugin.getExtraArguments(project, compileTask)) { for (arg in subplugin.getExtraArguments(project, kotlinTask)) {
val option = getPluginOptionString(subplugin.getPluginName(), arg.key, arg.value) pluginOptions.addPluginArgument(subplugin.getPluginName(), arg.key, arg.value)
pluginArguments.add(option)
}
} }
} }
val extraProperties = compileTask.extensions.extraProperties
extraProperties.set("compilerPluginClasspaths", realPluginClasspaths.toTypedArray())
extraProperties.set("compilerPluginArguments", pluginArguments.toTypedArray())
} }
} }
@@ -610,10 +595,6 @@ open class GradleUtils(val scriptHandler: ScriptHandler, val project: ProjectInt
internal operator fun FileCollection.plus(other: FileCollection) = this.plus(other) internal operator fun FileCollection.plus(other: FileCollection) = this.plus(other)
internal operator fun FileCollection.minus(other: FileCollection) = this.minus(other) internal operator fun FileCollection.minus(other: FileCollection) = this.minus(other)
fun AbstractCompile.storeKaptAnnotationsFile(kapt: AnnotationProcessingManager) {
extensions.extraProperties.set("kaptAnnotationsFile", kapt.getAnnotationFile())
}
private fun Project.getAptDirsForSourceSet(sourceSetName: String): Pair<File, File> { private fun Project.getAptDirsForSourceSet(sourceSetName: String): Pair<File, File> {
val aptOutputDir = File(buildDir, "generated/source/kapt") val aptOutputDir = File(buildDir, "generated/source/kapt")
val aptOutputDirForVariant = File(aptOutputDir, sourceSetName) val aptOutputDirForVariant = File(aptOutputDir, sourceSetName)