Kapt: Support specifying javac options (KT-17245)

This commit is contained in:
Yan Zhulanow
2017-04-05 19:12:23 +03:00
committed by Yan Zhulanow
parent 8cdb08cbfe
commit 3ee65ac499
8 changed files with 82 additions and 27 deletions
@@ -124,7 +124,8 @@ class Kapt3IT : BaseGradleIT() {
assertKaptSuccessful()
assertContains("Options: {suffix=Customized, justColon=:, justEquals==, containsColon=a:b, " +
"containsEquals=a=b, startsWithColon=:a, startsWithEquals==a, endsWithColon=a:, " +
"endsWithEquals=a:, withSpace=a b c}")
"endsWithEquals=a:, withSpace=a b c,")
assertContains("-Xmaxerrs=500, -Xlint:all=-Xlint:all") // Javac options test
assertFileExists("build/generated/source/kapt/main/example/TestClassCustomized.java")
assertFileExists("build/classes/main/example/TestClass.class")
assertFileExists("build/classes/main/example/TestClassCustomized.class")
@@ -33,4 +33,9 @@ kapt {
arg("endsWithEquals", "a:")
arg("withSpace", "a b c") // key doesn't support spaces
}
javacOptions {
option("-Xmaxerrs", 500)
option("-Xlint:all")
}
}
@@ -29,7 +29,6 @@ import org.gradle.api.tasks.compile.JavaCompile
import org.jetbrains.kotlin.gradle.plugin.*
import org.jetbrains.kotlin.gradle.plugin.android.AndroidGradleWrapper
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
import org.jetbrains.kotlin.preprocessor.mkdirsOrFail
import java.io.ByteArrayOutputStream
import java.io.File
import java.io.ObjectOutputStream
@@ -193,14 +192,16 @@ class Kapt3KotlinGradleSubplugin : KotlinGradleSubplugin<KotlinCompile> {
androidOptions +
mapOf("kapt.kotlin.generated" to kotlinSourcesOutputDir.absolutePath)
pluginOptions += SubpluginOption("apoptions", encodeAnnotationProcessingOptions(apOptions))
pluginOptions += SubpluginOption("apoptions", encodeOptions(apOptions))
pluginOptions += SubpluginOption("javacArguments", encodeOptions(kaptExtension.getJavacOptions()))
addMiscOptions(pluginOptions)
return pluginOptions
}
fun encodeAnnotationProcessingOptions(options: Map<String, String>): String {
fun encodeOptions(options: Map<String, String>): String {
val os = ByteArrayOutputStream()
val oos = ObjectOutputStream(os)
@@ -32,18 +32,29 @@ open class KaptExtension {
open var processors: String = ""
private var closure: Closure<*>? = null
private var apOptionsClosure: Closure<*>? = null
private var javacOptionsClosure: Closure<*>? = null
open fun arguments(closure: Closure<*>) {
this.closure = closure
this.apOptionsClosure = closure
}
open fun javacOptions(closure: Closure<*>) {
this.javacOptionsClosure = closure
}
fun getJavacOptions(): Map<String, String> {
val closureToExecute = javacOptionsClosure ?: return emptyMap()
val executor = KaptJavacOptionsDelegate().apply { execute(closureToExecute) }
return executor.options
}
fun getAdditionalArguments(project: Project, variantData: Any?, androidExtension: Any?): Map<String, String> {
val closureToExecute = closure ?: return emptyMap()
val closureToExecute = apOptionsClosure ?: return emptyMap()
val executor = KaptAdditionalArgumentsDelegate(project, variantData, androidExtension)
val executor = KaptAnnotationProcessorOptions(project, variantData, androidExtension)
executor.execute(closureToExecute)
return executor.args
return executor.options
}
fun getAdditionalArgumentsForJavac(project: Project, variantData: Any?, androidExtension: Any?): List<String> {
@@ -58,16 +69,16 @@ open class KaptExtension {
/**
* [project], [variant] and [android] properties are intended to be used inside the closure.
*/
open class KaptAdditionalArgumentsDelegate(
open class KaptAnnotationProcessorOptions(
@Suppress("unused") open val project: Project,
@Suppress("unused") open val variant: Any?,
@Suppress("unused") open val android: Any?
) {
internal val args = LinkedHashMap<String, String>()
internal val options = LinkedHashMap<String, String>()
@Suppress("unused")
open fun arg(name: Any, vararg values: Any) {
args.put(name.toString(), values.joinToString(" "))
options.put(name.toString(), values.joinToString(" "))
}
fun execute(closure: Closure<*>) {
@@ -76,4 +87,22 @@ open class KaptAdditionalArgumentsDelegate(
closure.call()
}
}
open class KaptJavacOptionsDelegate {
internal val options = LinkedHashMap<String, String>()
open fun option(name: Any, value: Any) {
options.put(name.toString(), value.toString())
}
open fun option(name: Any) {
options.put(name.toString(), "")
}
fun execute(closure: Closure<*>) {
closure.resolveStrategy = Closure.DELEGATE_FIRST
closure.delegate = this
closure.call()
}
}