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
This commit is contained in:
Sergey Igushkin
2019-08-05 14:23:30 +03:00
parent 9182fe887e
commit 88e5d2bc70
2 changed files with 53 additions and 7 deletions
@@ -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)
}
}
}
@@ -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<K2JVMCompilerArguments>(), 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} " +