From d93508f4d35a5c08830150b964a45f08e4d7dc46 Mon Sep 17 00:00:00 2001 From: Yan Zhulanow Date: Fri, 15 May 2015 21:52:51 +0300 Subject: [PATCH] APT: Support non-Android Java projects in Gradle --- .../kotlin/gradle/plugin/KotlinPlugin.kt | 52 +++++++++++++++---- 1 file changed, 41 insertions(+), 11 deletions(-) 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 70d5dce5281..d472d8161ae 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 @@ -130,6 +130,10 @@ class Kotlin2JvmSourceSetProcessor( compilerClass = tasksProvider.kotlinJVMCompileTaskClass ) { + private companion object { + private var cachedKotlinAnnotationProcessingDep: String? = null + } + override fun doTargetSpecificProcessing() { // store kotlin classes in separate directory. They will serve as class-path to java compiler val kotlinDestinationDir = File(project.getBuildDir(), "kotlin-classes/${sourceSetName}") @@ -138,16 +142,33 @@ class Kotlin2JvmSourceSetProcessor( val javaTask = project.getTasks().findByName(sourceSet.getCompileJavaTaskName()) as AbstractCompile? if (javaTask != null) { + kotlinTask.getExtensions().getExtraProperties().set("javaTask", WeakReference(javaTask)) javaTask.dependsOn(kotlinTaskName) val javacClassPath = javaTask.getClasspath() + project.files(kotlinDestinationDir); javaTask.setClasspath(javacClassPath) } + val kotlinAnnotationProcessingDep = cachedKotlinAnnotationProcessingDep ?: run { + val projectVersion = loadKotlinVersionFromResource(project.getLogger()) + val dep = "org.jetbrains.kotlin:kotlin-annotation-processing:$projectVersion" + cachedKotlinAnnotationProcessingDep = dep + dep + } + + val aptConfiguration = project.createAptConfiguration(sourceSet.getName(), kotlinAnnotationProcessingDep) + project afterEvaluate { project -> if (project != null) { for (dir in sourceSet.getJava().getSrcDirs()) { kotlinDirSet?.srcDir(dir) } + + if (aptConfiguration.getDependencies().size() > 1) { + kotlinTask.setProperty("aptFiles", aptConfiguration.resolve()) + } + + val aptOutputDir = project.setAptOutputDirForSourceSet(kotlinTask, sourceSet.getName()) + sourceSet.getJava().add(project.files(aptOutputDir)) } } @@ -291,13 +312,8 @@ open class KotlinAndroidPlugin [Inject] (val scriptHandler: ScriptHandler, val t val kotlinDirSet = kotlinSourceSet.getKotlin() kotlinDirSet.srcDir(project.file("src/${sourceSetName}/kotlin")) - val aptConfigurationName = if (sourceSet.getName() != "main") { - "kotlinApt${sourceSet.getName().capitalize()}" - } else "kotlinApt" - - val aptConfiguration = project.getConfigurations().create(aptConfigurationName) - aptConfiguration.getDependencies().add(project.getDependencies().create(kotlinAnnotationProcessingDep)) - aptConfigurations.put(sourceSet.getName(), aptConfiguration) + aptConfigurations.put(sourceSet.getName(), + project.createAptConfiguration(sourceSet.getName(), kotlinAnnotationProcessingDep)) /*TODO: before 0.11 gradle android plugin there was: sourceSet.getAllJava().source(kotlinDirSet) @@ -401,10 +417,8 @@ open class KotlinAndroidPlugin [Inject] (val scriptHandler: ScriptHandler, val t kotlinTask.setProperty("aptFiles", aptFiles) - val aptOutputDir = project.file(File(project.getBuildDir(), "generated/source/kotlinApt")) - val aptOutputDirForVariant = File(aptOutputDir, variantDataName) - kotlinTask.setProperty("kotlinAptOutputDir", aptOutputDirForVariant) - variantData.addJavaSourceFoldersToModel(aptOutputDirForVariant) + val aptOutputDir = project.setAptOutputDirForSourceSet(kotlinTask, variantDataName) + variantData.addJavaSourceFoldersToModel(aptOutputDir) kotlinTask doFirst { val androidRT = project.files(AndroidGradleWrapper.getRuntimeJars(androidPlugin, androidExt)) @@ -514,6 +528,22 @@ open class GradleUtils(val scriptHandler: ScriptHandler, val project: ProjectInt public fun resolveJsLibrary(): File = resolveDependencies(kotlinJsLibraryCoordinates()).first() } +private fun Project.setAptOutputDirForSourceSet(kotlinTask: AbstractCompile, sourceSetName: String): File { + val aptOutputDir = file(File(getBuildDir(), "generated/source/kotlinApt")) + val aptOutputDirForVariant = File(aptOutputDir, sourceSetName) + kotlinTask.setProperty("kotlinAptOutputDir", aptOutputDirForVariant) + return aptOutputDirForVariant +} + +private fun Project.createAptConfiguration(sourceSetName: String, kotlinAnnotationProcessingDep: String): Configuration { + val aptConfigurationName = if (sourceSetName != "main") "kapt${sourceSetName.capitalize()}" else "kapt" + + val aptConfiguration = getConfigurations().create(aptConfigurationName) + aptConfiguration.getDependencies().add(getDependencies().create(kotlinAnnotationProcessingDep)) + + return aptConfiguration +} + //copied from BasePlugin.getLocalVersion private fun loadAndroidPluginVersion(): String? { try {