KT-40140: Task configuration avoidance for Android projects

When adding Java sources to Kotlin task, avoid
force-configuring source-generating tasks in AGP.

Fixes https://youtrack.jetbrains.com/issue/KT-40140.

Test: ConfigurationAvoidanceIT.testAndroidUnrelatedTaskNotConfigured
This commit is contained in:
Ivan Gavrilovic
2020-11-10 20:22:35 +00:00
committed by nataliya.valtman
parent d376585821
commit 519aeeb644
3 changed files with 48 additions and 4 deletions
@@ -5,6 +5,7 @@
package org.jetbrains.kotlin.gradle package org.jetbrains.kotlin.gradle
import org.jetbrains.kotlin.gradle.util.AGPVersion
import org.junit.Test import org.junit.Test
class ConfigurationAvoidanceIT : BaseGradleIT() { class ConfigurationAvoidanceIT : BaseGradleIT() {
@@ -28,4 +29,46 @@ class ConfigurationAvoidanceIT : BaseGradleIT() {
} }
} }
@Test
fun testAndroidUnrelatedTaskNotConfigured() = with(
Project(
"AndroidProject",
gradleVersionRequirement = GradleVersionRequired.AtLeast("6.6.1")
)
) {
setupWorkingDir()
listOf("Android", "Test").forEach { subproject ->
gradleBuildScript(subproject).appendText("\n" + """
android {
applicationVariants.all {
it.getAidlCompileProvider().configure {
throw new RuntimeException("Task should not be configured.")
}
}
}
""".trimIndent()
)
}
gradleBuildScript("Lib").appendText(
"\n" + """
android {
libraryVariants.all {
it.getAidlCompileProvider().configure {
throw new RuntimeException("Task should not be configured.")
}
}
}
""".trimIndent()
)
build(
"help", options = defaultBuildOptions().copy(
androidGradlePluginVersion = AGPVersion.v4_2_0
)
) {
assertSuccessful()
}
}
} }
@@ -13,6 +13,7 @@ import org.gradle.api.*
import org.gradle.api.artifacts.maven.Conf2ScopeMappingContainer import org.gradle.api.artifacts.maven.Conf2ScopeMappingContainer
import org.gradle.api.artifacts.maven.MavenResolver import org.gradle.api.artifacts.maven.MavenResolver
import org.gradle.api.attributes.Usage import org.gradle.api.attributes.Usage
import org.gradle.api.file.ConfigurableFileTree
import org.gradle.api.file.FileCollection import org.gradle.api.file.FileCollection
import org.gradle.api.file.SourceDirectorySet import org.gradle.api.file.SourceDirectorySet
import org.gradle.api.logging.Logging import org.gradle.api.logging.Logging
@@ -1003,7 +1004,7 @@ abstract class AbstractAndroidProjectHandler(private val kotlinConfigurationTool
val javaTask = variantData.getJavaTaskProvider() val javaTask = variantData.getJavaTaskProvider()
val kotlinTask = compilation.compileKotlinTaskProvider val kotlinTask = compilation.compileKotlinTaskProvider
compilation.androidVariant.forEachJavaSourceDir { sources -> kotlinTask.configure { it.source(sources) } } compilation.androidVariant.forEachJavaSourceDir { sources -> kotlinTask.configure { it.source(sources.dir) } }
wireKotlinTasks(project, compilation, androidPlugin, androidExt, variantData, javaTask, kotlinTask) wireKotlinTasks(project, compilation, androidPlugin, androidExt, variantData, javaTask, kotlinTask)
} }
} }
@@ -1014,8 +1015,8 @@ internal inline fun BaseVariant.forEachKotlinSourceSet(action: (KotlinSourceSet)
.forEach(action) .forEach(action)
} }
internal inline fun BaseVariant.forEachJavaSourceDir(action: (File) -> Unit) { internal inline fun BaseVariant.forEachJavaSourceDir(action: (ConfigurableFileTree) -> Unit) {
getSourceFolders(SourceKind.JAVA).map { it.dir }.forEach(action) getSourceFolders(SourceKind.JAVA).forEach(action)
} }
@@ -115,7 +115,7 @@ class SubpluginEnvironment(
internal fun addCompilationSourcesToExternalCompileTask(compilation: KotlinCompilation<*>, task: TaskProvider<out AbstractCompile>) { internal fun addCompilationSourcesToExternalCompileTask(compilation: KotlinCompilation<*>, task: TaskProvider<out AbstractCompile>) {
if (compilation is KotlinJvmAndroidCompilation) { if (compilation is KotlinJvmAndroidCompilation) {
compilation.androidVariant.forEachKotlinSourceSet { sourceSet -> task.configure { it.source(sourceSet.kotlin) } } compilation.androidVariant.forEachKotlinSourceSet { sourceSet -> task.configure { it.source(sourceSet.kotlin) } }
compilation.androidVariant.forEachJavaSourceDir { sources -> task.configure { it.source(sources) } } compilation.androidVariant.forEachJavaSourceDir { sources -> task.configure { it.source(sources.dir) } }
} else { } else {
task.configure { taskInstance -> task.configure { taskInstance ->
compilation.allKotlinSourceSets.forEach { sourceSet -> taskInstance.source(sourceSet.kotlin) } compilation.allKotlinSourceSets.forEach { sourceSet -> taskInstance.source(sourceSet.kotlin) }