diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/AnnotationProcessingManager.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/AnnotationProcessingManager.kt index 1dc7643edf2..2be44215c79 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/AnnotationProcessingManager.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/AnnotationProcessingManager.kt @@ -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, 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()) - 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() diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KaptExtension.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KaptExtension.kt index 661270b0995..024feeb6ed6 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KaptExtension.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KaptExtension.kt @@ -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() + 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 { + 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() + + 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 { - return additionalCompilerArgs.toList() + fun execute(closure: Closure<*>) { + closure.setResolveStrategy(Closure.DELEGATE_FIRST) + closure.setDelegate(this) + closure.call() } } \ No newline at end of file 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 d944ecbc828..75cbf7432bf 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 @@ -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