From 710c726c9a072374ff93af8b210d99bdd1b55172 Mon Sep 17 00:00:00 2001 From: Sergey Igushkin Date: Wed, 20 Dec 2017 20:49:30 +0300 Subject: [PATCH] Improve kapt arguments & javac options usability with Kotlin DSL Issue #KT-21596 Fixed --- .../testProject/kapt2/arguments/build.gradle | 4 ++ .../kotlin/gradle/plugin/KaptExtension.kt | 56 +++++++++++-------- 2 files changed, 37 insertions(+), 23 deletions(-) diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/arguments/build.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/arguments/build.gradle index f712a87cfab..7ff7739cf42 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/arguments/build.gradle +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/arguments/build.gradle @@ -30,6 +30,8 @@ kapt { arg("containsColon", "a:b") arg("containsEquals", "a=b") arg("startsWithColon", ":a") + } + arguments { arg("startsWithEquals", "=a") arg("endsWithColon", "a:") arg("endsWithEquals", "a:") @@ -38,6 +40,8 @@ kapt { javacOptions { option("-Xmaxerrs", 500) + } + javacOptions { option("-Xlint:all") } } \ No newline at end of file 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 49964a227aa..9907afcd02d 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 @@ -32,29 +32,42 @@ open class KaptExtension { open var processors: String = "" - private var apOptionsClosure: Closure<*>? = null - private var javacOptionsClosure: Closure<*>? = null + private val apOptionsActions = + mutableListOf<(KaptAnnotationProcessorOptions) -> Unit>() + + private val javacOptionsActions = + mutableListOf<(KaptJavacOptionsDelegate) -> Unit>() open fun arguments(closure: Closure<*>) { - this.apOptionsClosure = closure + apOptionsActions += { apOptions -> + apOptions.execute(closure) + } + } + + open fun arguments(action: KaptAnnotationProcessorOptions.() -> Unit) { + apOptionsActions += action } open fun javacOptions(closure: Closure<*>) { - this.javacOptionsClosure = closure + this.javacOptionsActions += { javacOptions -> + javacOptions.execute(closure) + } + } + + open fun javacOptions(action: KaptJavacOptionsDelegate.() -> Unit) { + javacOptionsActions += action } fun getJavacOptions(): Map { - val closureToExecute = javacOptionsClosure ?: return emptyMap() - val executor = KaptJavacOptionsDelegate().apply { execute(closureToExecute) } - return executor.options + val result = KaptJavacOptionsDelegate() + javacOptionsActions.forEach { it(result) } + return result.options } fun getAdditionalArguments(project: Project, variantData: Any?, androidExtension: Any?): Map { - val closureToExecute = apOptionsClosure ?: return emptyMap() - - val executor = KaptAnnotationProcessorOptions(project, variantData, androidExtension) - executor.execute(closureToExecute) - return executor.options + val result = KaptAnnotationProcessorOptions(project, variantData, androidExtension) + apOptionsActions.forEach { it(result) } + return result.options } fun getAdditionalArgumentsForJavac(project: Project, variantData: Any?, androidExtension: Any?): List { @@ -81,12 +94,7 @@ open class KaptAnnotationProcessorOptions( options.put(name.toString(), values.joinToString(" ")) } - fun execute(closure: Closure<*>) { - closure.resolveStrategy = Closure.DELEGATE_FIRST - closure.delegate = this - closure.call() - } - + fun execute(closure: Closure<*>) = executeClosure(closure) } open class KaptJavacOptionsDelegate { @@ -100,9 +108,11 @@ open class KaptJavacOptionsDelegate { options.put(name.toString(), "") } - fun execute(closure: Closure<*>) { - closure.resolveStrategy = Closure.DELEGATE_FIRST - closure.delegate = this - closure.call() - } + fun execute(closure: Closure<*>) = executeClosure(closure) +} + +private fun Any?.executeClosure(closure: Closure<*>) { + closure.resolveStrategy = Closure.DELEGATE_FIRST + closure.delegate = this + closure.call() } \ No newline at end of file