Kapt: Support apt options (KT-13984)

(cherry picked from commit b566a37)
This commit is contained in:
Yan Zhulanow
2016-10-04 20:20:01 +03:00
committed by Yan Zhulanow
parent 0ae9a7a9d1
commit f15f90a719
10 changed files with 123 additions and 26 deletions
@@ -25,6 +25,8 @@ class Kapt2IT: BaseGradleIT() {
private const val GRADLE_VERSION = "2.10"
private const val GRADLE_2_14_VERSION = "2.14.1"
private const val ANDROID_GRADLE_PLUGIN_VERSION = "1.5.+"
private val KAPT_SUCCESSFUL_REGEX = "Annotation processing complete in [0-9]+ ms, 0 errors, 0 warnings".toRegex()
}
private fun androidBuildOptions() =
@@ -35,8 +37,9 @@ class Kapt2IT: BaseGradleIT() {
override fun defaultBuildOptions(): BuildOptions =
super.defaultBuildOptions().copy(withDaemon = true)
private fun CompiledProject.assertKaptSuccessful() {
assertContains("Kapt: Annotation processing complete, 0 errors, 0 warnings")
KAPT_SUCCESSFUL_REGEX.findAll(this.output).single()
}
@Test
@@ -98,6 +101,17 @@ class Kapt2IT: BaseGradleIT() {
}
}
@Test
fun testArguments() {
Project("arguments", GRADLE_VERSION, directoryPrefix = "kapt2").build("build") {
assertSuccessful()
assertKaptSuccessful()
assertFileExists("build/generated/source/kapt2/main/example/TestClassCustomized.java")
assertFileExists("build/classes/main/example/TestClass.class")
assertFileExists("build/classes/main/example/TestClassCustomized.class")
}
}
@Test
fun testInheritedAnnotations() {
Project("inheritedAnnotations", GRADLE_VERSION, directoryPrefix = "kapt2").build("build") {
@@ -0,0 +1,27 @@
buildscript {
repositories {
mavenLocal()
}
dependencies {
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
}
apply plugin: "kotlin"
apply plugin: "kotlin-kapt"
repositories {
mavenLocal()
}
dependencies {
compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
compile "org.jetbrains.kotlin:annotation-processor-example:$kotlin_version"
kapt "org.jetbrains.kotlin:annotation-processor-example:$kotlin_version"
}
kapt {
arguments {
arg("suffix", "Customized")
}
}
@@ -0,0 +1,12 @@
package example
@example.ExampleAnnotation
public class TestClass {
@example.ExampleAnnotation
public val testVal: String = "text"
@example.ExampleAnnotation
public fun testFunction(): Class<*> = TestClassCustomized::class.java
}
@@ -201,7 +201,7 @@ class AnnotationProcessingManager(
private fun appendAdditionalComplerArgs() {
val kaptExtension = project.extensions.getByType(KaptExtension::class.java)
val args = kaptExtension.getAdditionalArguments(project, androidVariant, getAndroidExtension())
val args = kaptExtension.getAdditionalArgumentsForJavac(project, androidVariant, getAndroidExtension())
if (args.isEmpty()) return
javaTask.modifyCompilerArguments { list ->
@@ -16,6 +16,7 @@
package org.jetbrains.kotlin.gradle.internal
import com.android.build.gradle.BaseExtension
import com.android.build.gradle.api.AndroidSourceSet
import com.android.build.gradle.internal.variant.BaseVariantData
import com.android.builder.model.SourceProvider
@@ -124,6 +125,14 @@ class Kapt2KotlinGradleSubplugin : KotlinGradleSubplugin<KotlinCompile> {
pluginOptions += SubpluginOption("verbose", "true")
}
val androidPlugin = variantData?.let {
project.extensions.findByName("android") as? BaseExtension
}
for ((key, value) in kaptExtension.getAdditionalArguments(project, variantData, androidPlugin)) {
pluginOptions += SubpluginOption("apoption", "$key:$value")
}
val annotationsFile = File(kotlinCompile.taskBuildDirectory, "source-annotations.txt")
kotlinCompile.sourceAnnotationsRegistry = SourceAnnotationsRegistry(annotationsFile)
@@ -18,6 +18,7 @@ package org.jetbrains.kotlin.gradle.plugin
import groovy.lang.Closure
import org.gradle.api.Project
import java.util.*
open class KaptExtension {
@@ -31,26 +32,36 @@ open class KaptExtension {
this.closure = closure
}
fun getAdditionalArguments(project: Project, variant: Any?, android: Any?): List<String> {
val closureToExecute = closure ?: return emptyList()
fun getAdditionalArguments(project: Project, variantData: Any?, androidExtension: Any?): Map<String, String> {
val closureToExecute = closure ?: return emptyMap()
val executor = KaptAdditionalArgumentsDelegate(project, variant, android)
val executor = KaptAdditionalArgumentsDelegate(project, variantData, androidExtension)
executor.execute(closureToExecute)
return executor.additionalCompilerArgs
return executor.args
}
fun getAdditionalArgumentsForJavac(project: Project, variantData: Any?, androidExtension: Any?): List<String> {
val javacArgs = mutableListOf<String>()
for ((key, value) in getAdditionalArguments(project, variantData, androidExtension)) {
javacArgs += "-A" + key + (if (value.isNotEmpty()) "=$value" else "")
}
return javacArgs
}
}
/**
* [project], [variant] and [android] properties are intended to be used inside the closure.
*/
open class KaptAdditionalArgumentsDelegate(
open val project: Project,
open val variant: Any?,
open val android: Any?
@Suppress("unused") open val project: Project,
@Suppress("unused") open val variant: Any?,
@Suppress("unused") open val android: Any?
) {
internal val args = LinkedHashMap<String, String>()
val additionalCompilerArgs = arrayListOf<String>()
@Suppress("unused")
open fun arg(name: Any, vararg values: Any) {
val valuesString = if (values.isNotEmpty()) values.joinToString(" ", prefix = "=") else ""
additionalCompilerArgs.add("-A$name$valuesString")
args.put(name.toString(), values.joinToString(" "))
}
fun execute(closure: Closure<*>) {