From 88e5d2bc700a38ea66c912d9d804887b02c1e13a Mon Sep 17 00:00:00 2001 From: Sergey Igushkin Date: Mon, 5 Aug 2019 14:23:30 +0300 Subject: [PATCH] Fix unrelated tasks being configured at execution time, KT-31666 Replace iteration over all tasks with `.matching { ... }` with ` .configureEach { if (...) ... }`, so that the check iterates just over those tasks which are triggered to configure from somewhere else. Issue #KT-31666 Fixed --- .../kotlin/gradle/ConfigurationAvoidanceIT.kt | 31 +++++++++++++++++++ .../jetbrains/kotlin/gradle/tasks/Tasks.kt | 29 ++++++++++++----- 2 files changed, 53 insertions(+), 7 deletions(-) create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/ConfigurationAvoidanceIT.kt diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/ConfigurationAvoidanceIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/ConfigurationAvoidanceIT.kt new file mode 100644 index 00000000000..fc58ae3d93f --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/ConfigurationAvoidanceIT.kt @@ -0,0 +1,31 @@ +/* + * Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.gradle + +import org.junit.Test + +class ConfigurationAvoidanceIT : BaseGradleIT() { + + @Test + fun testUnrelatedTaskNotConfigured() = with(Project("simpleProject", GradleVersionRequired.AtLeast("4.10.2"))) { + setupWorkingDir() + + val expensivelyConfiguredTaskName = "expensivelyConfiguredTask" + val triggeredExpensiveConfigurationText = "Triggered expensive configuration!" + + gradleBuildScript().appendText("\n" + """ + tasks.register("$expensivelyConfiguredTaskName") { + println("$triggeredExpensiveConfigurationText") + } + """.trimIndent()) + + build("compileKotlin") { + assertSuccessful() + assertNotContains(triggeredExpensiveConfigurationText) + } + } + +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/Tasks.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/Tasks.kt index e8736009168..6c7426fa09c 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/Tasks.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/Tasks.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.gradle.tasks import org.gradle.api.Project +import org.gradle.api.Task import org.gradle.api.file.FileCollection import org.gradle.api.plugins.BasePluginConvention import org.gradle.api.tasks.* @@ -33,6 +34,7 @@ import org.jetbrains.kotlin.gradle.plugin.KotlinMultiplatformPluginWrapper import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformPluginBase import org.jetbrains.kotlin.gradle.plugin.PLUGIN_CLASSPATH_CONFIGURATION_NAME import org.jetbrains.kotlin.gradle.report.BuildReportMode +import org.jetbrains.kotlin.gradle.utils.isGradleVersionAtLeast import org.jetbrains.kotlin.gradle.utils.isParentOf import org.jetbrains.kotlin.gradle.utils.pathsAsStringRelativeTo import org.jetbrains.kotlin.gradle.utils.toSortedPathsArray @@ -459,14 +461,27 @@ open class KotlinCompile : AbstractKotlinCompile(), Kotl private fun disableMultiModuleIC(): Boolean { if (!incremental || javaOutputDir == null) return false - val illegalTask = project.tasks.matching { - it is AbstractCompile && - it !is JavaCompile && - it !is AbstractKotlinCompile<*> && - javaOutputDir!!.isParentOf(it.destinationDir) - }.firstOrNull() as? AbstractCompile + fun forEachTask(fn: (Task) -> Unit) { + if (isGradleVersionAtLeast(4, 10)) { + project.tasks.configureEach(fn) + } else { + project.tasks.forEach(fn) + } + } - if (illegalTask != null) { + var illegalTaskOrNull: AbstractCompile? = null + + forEachTask { + if (it is AbstractCompile && + it !is JavaCompile && + it !is AbstractKotlinCompile<*> && + javaOutputDir!!.isParentOf(it.destinationDir) + ) { + illegalTaskOrNull = illegalTaskOrNull ?: it + } + } + + illegalTaskOrNull?.let { illegalTask -> logger.info( "Kotlin inter-project IC is disabled: " + "unknown task '$illegalTask' destination dir ${illegalTask.destinationDir} " +