kapt: Lazy evaluation of additional arguments
This commit is contained in:
+13
-2
@@ -16,6 +16,8 @@
|
||||
|
||||
package org.jetbrains.kotlin.gradle.internal
|
||||
|
||||
import com.android.build.gradle.BaseExtension
|
||||
import org.gradle.api.UnknownDomainObjectException
|
||||
import org.gradle.api.plugins.ExtraPropertiesExtension
|
||||
import org.gradle.api.tasks.compile.AbstractCompile
|
||||
import org.gradle.api.tasks.compile.JavaCompile
|
||||
@@ -34,7 +36,8 @@ public class AnnotationProcessingManager(
|
||||
private val aptFiles: Set<File>,
|
||||
private val aptOutputDir: File,
|
||||
private val aptWorkingDir: File,
|
||||
private val coreClassLoader: ClassLoader) {
|
||||
private val coreClassLoader: ClassLoader,
|
||||
private val androidVariant: Any? = null) {
|
||||
|
||||
private val project = task.getProject()
|
||||
|
||||
@@ -98,7 +101,7 @@ public class AnnotationProcessingManager(
|
||||
|
||||
private fun appendAdditionalComplerArgs() {
|
||||
val kaptExtension = project.getExtensions().getByType(javaClass<KaptExtension>())
|
||||
val args = kaptExtension.getAdditionalCompilerArgs()
|
||||
val args = kaptExtension.getAdditionalArguments(project, androidVariant, getAndroidExtension())
|
||||
if (args.isEmpty()) return
|
||||
|
||||
javaTask.modifyCompilerArguments { list ->
|
||||
@@ -139,6 +142,14 @@ public class AnnotationProcessingManager(
|
||||
}
|
||||
}
|
||||
|
||||
private fun getAndroidExtension(): BaseExtension? {
|
||||
try {
|
||||
return project.getExtensions().getByName("android") as BaseExtension
|
||||
} catch (e: UnknownDomainObjectException) {
|
||||
return null
|
||||
}
|
||||
}
|
||||
|
||||
private fun addGeneratedSourcesOutputToCompilerArgs(javaTask: JavaCompile, outputDir: File) {
|
||||
outputDir.mkdirs()
|
||||
|
||||
|
||||
+30
-4
@@ -16,19 +16,45 @@
|
||||
|
||||
package org.jetbrains.kotlin.gradle.plugin
|
||||
|
||||
import groovy.lang.Closure
|
||||
import org.gradle.api.Project
|
||||
|
||||
public open class KaptExtension {
|
||||
|
||||
public open var generateStubs: Boolean = false
|
||||
|
||||
private val additionalCompilerArgs = arrayListOf<String>()
|
||||
private var closure: Closure<*>? = null
|
||||
|
||||
public open fun arg(name: String, vararg values: String) {
|
||||
public open fun arguments(closure: Closure<*>) {
|
||||
this.closure = closure
|
||||
}
|
||||
|
||||
fun getAdditionalArguments(project: Project, variant: Any?, android: Any?): List<String> {
|
||||
val closureToExecute = closure ?: return emptyList()
|
||||
|
||||
val executor = KaptAdditionalArgumentsDelegate(project, variant, android)
|
||||
executor.execute(closureToExecute)
|
||||
return executor.additionalCompilerArgs
|
||||
}
|
||||
}
|
||||
|
||||
public open class KaptAdditionalArgumentsDelegate(
|
||||
public open val project: Project,
|
||||
public open val variant: Any?,
|
||||
public open val android: Any?
|
||||
) {
|
||||
|
||||
val additionalCompilerArgs = arrayListOf<String>()
|
||||
|
||||
public open fun arg(name: Any, vararg values: Any) {
|
||||
val valuesString = if (values.isNotEmpty()) values.joinToString(" ", prefix = "=") else ""
|
||||
additionalCompilerArgs.add("-A$name$valuesString")
|
||||
}
|
||||
|
||||
public open fun getAdditionalCompilerArgs(): List<String> {
|
||||
return additionalCompilerArgs.toList()
|
||||
fun execute(closure: Closure<*>) {
|
||||
closure.setResolveStrategy(Closure.DELEGATE_FIRST)
|
||||
closure.setDelegate(this)
|
||||
closure.call()
|
||||
}
|
||||
|
||||
}
|
||||
+14
-12
@@ -442,7 +442,7 @@ open class KotlinAndroidPlugin @Inject constructor(val scriptHandler: ScriptHand
|
||||
|
||||
if (javaTask is JavaCompile && aptFiles.isNotEmpty()) {
|
||||
val kaptManager = AnnotationProcessingManager(kotlinTask, javaTask, variantDataName,
|
||||
aptFiles.toSet(), aptOutputDir, aptWorkingDir, tasksProvider.tasksLoader)
|
||||
aptFiles.toSet(), aptOutputDir, aptWorkingDir, tasksProvider.tasksLoader, variantData)
|
||||
|
||||
kotlinTask.storeKaptAnnotationsFile(kaptManager)
|
||||
|
||||
@@ -626,21 +626,23 @@ private fun Project.initKapt(
|
||||
|
||||
private fun Project.createKotlinAfterJavaTask(
|
||||
javaTask: AbstractCompile,
|
||||
kotlinDestinationDir: File,
|
||||
kotlinOutputDir: File,
|
||||
taskFactory: (suffix: String) -> AbstractCompile
|
||||
): AbstractCompile {
|
||||
val kotlinTaskAfterJava = taskFactory("AfterJava")
|
||||
kotlinTaskAfterJava.setProperty("kotlinDestinationDir", kotlinDestinationDir)
|
||||
kotlinTaskAfterJava.setDestinationDir(javaTask.getDestinationDir())
|
||||
kotlinTaskAfterJava.setClasspath(javaTask.getClasspath())
|
||||
val kotlinAfterJavaTask = with (taskFactory("AfterJava")) {
|
||||
setProperty("kotlinDestinationDir", kotlinOutputDir)
|
||||
setDestinationDir(javaTask.getDestinationDir())
|
||||
setClasspath(javaTask.getClasspath())
|
||||
dependsOn(javaTask.getDependsOn(), javaTask)
|
||||
this
|
||||
}
|
||||
|
||||
getTasks().filter {
|
||||
javaTask in it.getTaskDependencies().getDependencies(it)
|
||||
}.forEach { it.dependsOn(kotlinTaskAfterJava) }
|
||||
val dependsOnJava = getTasks().filter { javaTask in it.getDependsOn() && it != kotlinAfterJavaTask }
|
||||
for (task in dependsOnJava) {
|
||||
task.dependsOn(kotlinAfterJavaTask)
|
||||
}
|
||||
|
||||
kotlinTaskAfterJava.dependsOn(javaTask)
|
||||
|
||||
return kotlinTaskAfterJava
|
||||
return kotlinAfterJavaTask
|
||||
}
|
||||
|
||||
//copied from BasePlugin.getLocalVersion
|
||||
|
||||
Reference in New Issue
Block a user