From b13e1b451d0706deb44f6ed15a51440016d1ace1 Mon Sep 17 00:00:00 2001 From: Alexey Tsvetkov Date: Mon, 25 Jul 2016 16:05:32 +0300 Subject: [PATCH] Refactoring: use convention mapping for configuring classpath of kotlin tasks #KT-12658 fixed #KT-12750 fixed --- .../internal/AnnotationProcessingManager.kt | 15 +--------- .../kotlin/gradle/plugin/KotlinPlugin.kt | 29 +++---------------- .../kotlin/gradle/plugin/taskUtils.kt | 29 ------------------- 3 files changed, 5 insertions(+), 68 deletions(-) diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/AnnotationProcessingManager.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/AnnotationProcessingManager.kt index e6cc8162e20..110f9e6e05f 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/AnnotationProcessingManager.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/AnnotationProcessingManager.kt @@ -56,19 +56,6 @@ fun Project.initKapt( kotlinAfterJavaTask.source(kaptManager.generatedKotlinSourceDir) kotlinAfterJavaTask.source(kaptManager.aptOutputDir) - val javaDestinationDir = project.files(javaTask.destinationDir) - javaTask.doLast { - kotlinAfterJavaTask.source(kotlinTask.source) - // we don't want kotlinAfterJavaTask to track modifications in generated class - kotlinAfterJavaTask.classpath -= javaDestinationDir - } - kotlinAfterJavaTask.doFirst { - kotlinAfterJavaTask.classpath += javaDestinationDir - } - kotlinAfterJavaTask.doLast { - kotlinAfterJavaTask.classpath -= javaDestinationDir - } - subpluginEnvironment.addSubpluginArguments(this, kotlinAfterJavaTask) } else { kotlinAfterJavaTask = null @@ -108,7 +95,7 @@ private fun Project.createKotlinAfterJavaTask( tasksProvider: KotlinTasksProvider ): KotlinCompile { val kotlinAfterJavaTask = with (tasksProvider.createKotlinJVMTask(this, kotlinTask.name + KOTLIN_AFTER_JAVA_TASK_SUFFIX)) { - classpath = kotlinTask.classpath - project.files(javaTask.destinationDir) + conventionMapping.map("classpath") { kotlinTask.classpath } this } 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 37443d8aa67..5eb542f3f48 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 @@ -5,6 +5,7 @@ import com.android.build.gradle.BasePlugin import com.android.build.gradle.api.AndroidSourceSet import com.android.build.gradle.internal.variant.BaseVariantData import com.android.build.gradle.internal.variant.BaseVariantOutputData +import com.android.builder.model.SourceProvider import groovy.lang.Closure import org.gradle.api.Action import org.gradle.api.Plugin @@ -171,14 +172,7 @@ class Kotlin2JvmSourceSetProcessor( val kaptManager = AnnotationProcessingManager(kotlinTask, javaTask, sourceSetName, aptConfiguration.resolve(), aptOutputDir, aptWorkingDir) - kotlinAfterJavaTask = project.initKapt(kotlinTask, javaTask, kaptManager, - sourceSetName, null, subpluginEnvironment, tasksProvider) - - if (kotlinAfterJavaTask != null) { - javaTask.doFirst { - kotlinAfterJavaTask!!.classpath = project.files(kotlinTask.classpath, javaTask.destinationDir) - } - } + kotlinAfterJavaTask = project.initKapt(kotlinTask, javaTask, kaptManager, sourceSetName, null, subpluginEnvironment, tasksProvider) } configureJavaTask(kotlinTask, javaTask, kotlinAfterJavaTask, logger) @@ -369,11 +363,10 @@ open class KotlinAndroidPlugin @Inject constructor(val scriptHandler: ScriptHand // store kotlin classes in separate directory. They will serve as class-path to java compiler kotlinTask.destinationDir = File(project.buildDir, "tmp/kotlin-classes/$variantDataName") - kotlinTask.description = "Compiles the ${variantDataName} kotlin." + kotlinTask.description = "Compiles the $variantDataName kotlin." kotlinTask.setDependsOn(javaTask.dependsOn) val aptFiles = arrayListOf() - for (provider in variantData.sourceProviders) { val aptConfiguration = aptConfigurations[(provider as AndroidSourceSet).name] // Ignore if there's only an annotation processor wrapper in dependencies (added by default) @@ -384,21 +377,7 @@ open class KotlinAndroidPlugin @Inject constructor(val scriptHandler: ScriptHand } subpluginEnvironment.addSubpluginArguments(project, kotlinTask) - - // should not be evaluated until right before compileKotlin evaluation since android can change - // java classpath during project evaluation (see prepareComAndroidSupportSupportV42311Library) - val fullClasspath = lazy { - val androidRT = project.files(AndroidGradleWrapper.getRuntimeJars(androidPlugin, androidExt)) - (javaTask.classpath + androidRT) - project.files(kotlinTask.destinationDir) - } - kotlinTask.classpath = javaTask.classpath - kotlinTask.updateClasspathBeforeTask { fullClasspath.value } - kotlinTask.doFirst { - for (task in project.getTasksByName(kotlinTaskName + KOTLIN_AFTER_JAVA_TASK_SUFFIX, false)) { - (task as AbstractCompile).classpath = project.files(fullClasspath.value, javaTask.destinationDir) - } - } - + kotlinTask.conventionMapping.map("classpath") { javaTask.classpath + project.files(AndroidGradleWrapper.getRuntimeJars(androidPlugin, androidExt)) } val (aptOutputDir, aptWorkingDir) = project.getAptDirsForSourceSet(variantDataName) variantData.addJavaSourceFoldersToModel(aptOutputDir) var kotlinAfterJavaTask: KotlinCompile? = null diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/taskUtils.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/taskUtils.kt index 715da7ff4e0..7747d0010f8 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/taskUtils.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/taskUtils.kt @@ -7,35 +7,6 @@ import org.gradle.api.tasks.compile.AbstractCompile import java.io.File import kotlin.reflect.KProperty -/* - * Adding fake up-to-date check to do something before execution, and before input snapshots are taken. - * Note, this hack is sensitive to up-to-date checks order, so it should be added before any custom up-to-date checks - * that could return false. - * - * Should be used only for compileKotlinTask. - * - * // todo: could add configureKotlinTask that always executes before compileKotlin instead - */ -internal fun AbstractCompile.updateClasspathBeforeTask(newClassPath: (oldClassPath: FileCollection) -> FileCollection) { - // Gradle can take inputs snapshots before task run (normally) or after task run (--rerun-tasks or some up-to-date when returned false). - // Fake up-to-date check to update classpath dynamically before inputs snapshot is taken. - // Won't be called in case of some other up-to-date check returned false before this one evaluation - // Won't be called in case of --rerun-tasks - var classpathIsUpdated = false - outputs.upToDateWhen { - classpath = newClassPath(classpath) - classpathIsUpdated = true - true - } - - // in case fake up-to-date check was not called (see comment above) - doFirst { - if (!classpathIsUpdated) { - classpath = newClassPath(classpath) - } - } -} - internal fun AbstractCompile.appendClasspathDynamically(file: File) { var added = false