From b3fba1faad4c637d15d4d6a32d036b553a8ed4a4 Mon Sep 17 00:00:00 2001 From: Yahor Berdnikau Date: Mon, 17 Jan 2022 17:11:45 +0100 Subject: [PATCH] Fix empty Android layout directories are not ignored Kotlin Android extensions plugin adds layout directories as input to KotlinCompile task when experimental flag is enabled. This breaks cache relocation. ^KT-48849 Fixed --- .../kotlin/gradle/BuildCacheRelocationIT.kt | 33 +++++++++++++++++++ .../android/internal/AndroidSubplugin.kt | 12 ++++++- 2 files changed, 44 insertions(+), 1 deletion(-) diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/BuildCacheRelocationIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/BuildCacheRelocationIT.kt index 369e5bad3d3..49e007ea1d7 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/BuildCacheRelocationIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/BuildCacheRelocationIT.kt @@ -194,6 +194,39 @@ class BuildCacheRelocationIT : KGPBaseTest() { ) } + @DisplayName("KT-48849: Kotlin compile should ignore empty layout resource directories added by kotlin android extensions") + @GradleTestVersions(minVersion = TestVersions.Gradle.G_6_8) + @GradleTest + fun compileIgnoreEmptyAndroidResLayoutDirs(gradleVersion: GradleVersion) { + val (firstProject, secondProject) = prepareTestProjects( + "AndroidExtensionsProject", + gradleVersion, + defaultBuildOptions.copy(androidVersion = TestVersions.AGP.AGP_42) + ) { + it.subProject("app").buildGradle.append( + """ + | + |androidExtensions { + | experimental = true + |} + """.trimMargin() + ) + } + + firstProject + .subProject("app") + .projectPath + .resolve("src/main/res/layout-ar") + .createDirectory() + + checkBuildCacheRelocation( + firstProject, + secondProject, + listOf("assembleDebug"), + listOf(":app:compileDebugKotlin") + ) + } + @DisplayName("with native project") @GradleTest @DisabledOnOs(OS.WINDOWS, disabledReason = "remove after fix of KT-48283") diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/android/internal/AndroidSubplugin.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/android/internal/AndroidSubplugin.kt index 2377a32af9f..bd257ff9030 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/android/internal/AndroidSubplugin.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/android/internal/AndroidSubplugin.kt @@ -19,6 +19,7 @@ import org.gradle.api.tasks.PathSensitivity import org.gradle.api.tasks.TaskProvider import org.gradle.api.tasks.compile.AbstractCompile import org.gradle.tooling.provider.model.ToolingModelBuilderRegistry +import org.gradle.util.GradleVersion import org.jetbrains.kotlin.gradle.dsl.KotlinCommonOptions import org.jetbrains.kotlin.gradle.model.builder.KotlinAndroidExtensionModelBuilder import org.jetbrains.kotlin.gradle.plugin.* @@ -200,7 +201,16 @@ class AndroidSubplugin : ) kotlinCompile.configure { - it.inputs.files(getLayoutDirectories(project, resDirectories)).withPathSensitivity(PathSensitivity.RELATIVE) + it.inputs.files(getLayoutDirectories(project, resDirectories)) + .withPathSensitivity(PathSensitivity.RELATIVE) + .withPropertyName("androidExtensionLayoutsFrom$name") + .run { + if (GradleVersion.current() >= GradleVersion.version("6.8")) { + ignoreEmptyDirectories() + } else { + this!! + } + } } }