Initial annotation processing support in Gradle

This commit is contained in:
Yan Zhulanow
2015-04-30 21:38:11 +03:00
parent b2220ca98a
commit f12531dd6d
2 changed files with 183 additions and 7 deletions
@@ -38,16 +38,17 @@ import org.gradle.api.file.SourceDirectorySet
import kotlin.properties.Delegates
import org.gradle.api.tasks.Delete
import groovy.lang.Closure
import org.gradle.api.artifacts.Configuration
import org.gradle.api.file.FileCollection
import org.jetbrains.kotlin.gradle.tasks.KotlinTasksProvider
import java.util.ServiceLoader
import org.gradle.api.logging.*
import java.net.URL
import java.util.jar.Manifest
import java.lang.ref.WeakReference
val DEFAULT_ANNOTATIONS = "org.jebrains.kotlin.gradle.defaultAnnotations"
abstract class KotlinSourceSetProcessor<T : AbstractCompile>(
val project: ProjectInternal,
val javaBasePlugin: JavaBasePlugin,
@@ -300,23 +301,39 @@ open class KotlinAndroidPlugin [Inject] (val scriptHandler: ScriptHandler, val t
(ext as ExtensionAware).getExtensions().add("kotlinOptions", tasksProvider.kotlinJVMOptionsClass)
fun addConfiguration(name: String): Configuration =
project.getConfigurations().create(name)
val kotlinAptConfiguration = addConfiguration("kotlinApt")
val kotlinAptAndroidTestConfiguration = addConfiguration("kotlinAptAndroidTest")
val kotlinAptTestConfiguration = addConfiguration("kotlinAptTest")
val aptConfigurations = mapOf(
"base" to kotlinAptConfiguration,
"androidTest" to kotlinAptAndroidTestConfiguration,
"unitTest" to kotlinAptTestConfiguration)
project afterEvaluate { project ->
if (project != null) {
val plugin = (project.getPlugins().findPlugin("android")
?: project.getPlugins().findPlugin("android-library")) as BasePlugin
processVariantData(plugin.getVariantManager().getVariantDataList(), project, ext, plugin)
val aptConfigurationDependencyFiles = aptConfigurations.mapValues { it.getValue().resolve() }
processVariantData(plugin.getVariantManager().getVariantDataList(), project, ext, plugin, aptConfigurationDependencyFiles)
}
}
project.getExtensions().add(DEFAULT_ANNOTATIONS, GradleUtils(scriptHandler, project).resolveKotlinPluginDependency("kotlin-android-sdk-annotations"))
project.getExtensions().add(DEFAULT_ANNOTATIONS, GradleUtils(scriptHandler, project)
.resolveKotlinPluginDependency("kotlin-android-sdk-annotations"))
}
private fun processVariantData(
variantDataList: List<BaseVariantData<out BaseVariantOutputData>>,
project: Project,
androidExt: BaseExtension,
androidPlugin: BasePlugin
androidPlugin: BasePlugin,
aptConfigurations: Map<String, Set<File>>
) {
val logger = project.getLogger()
val kotlinOptions = getExtension<Any?>(androidExt, "kotlinOptions")
@@ -375,12 +392,25 @@ open class KotlinAndroidPlugin [Inject] (val scriptHandler: ScriptHandler, val t
subpluginEnvironment.addSubpluginArguments(project, kotlinTask)
fun filesForConfigurations(configurationIds: Array<String>): Set<File> {
return configurationIds.flatMap { aptConfigurations[it]?.toList() ?: listOf() }.distinct()
}
val aptFiles = filesForConfigurations(when (variantData.getType()) {
VariantType.UNIT_TEST -> arrayOf("base", "unitTest")
VariantType.ANDROID_TEST -> arrayOf("base", "androidTest")
else -> arrayOf("base")
})
kotlinTask.setProperty("aptFiles", aptFiles)
kotlinTask doFirst {
val androidRT = project.files(AndroidGradleWrapper.getRuntimeJars(androidPlugin, androidExt))
val fullClasspath = (javaTask.getClasspath() + androidRT) - project.files(kotlinTask.property("kotlinDestinationDir"))
(it as AbstractCompile).setClasspath(fullClasspath)
}
kotlinTask.getExtensions().getExtraProperties().set("javaTask", WeakReference(javaTask))
javaTask.dependsOn(kotlinTaskName)
javaTask doFirst {