From dbddac3e80c35145a7e49d92644e1e1e9acae380 Mon Sep 17 00:00:00 2001 From: Dmitrii Krasnov Date: Tue, 29 Aug 2023 07:51:14 +0000 Subject: [PATCH] Added existsCompat and its usages for checking tasks' inputs. #KT-54232 Ready for Review Merge-request: KT-MR-11705 Merged-by: Dmitrii Krasnov --- .../kotlin/gradle/Kotlin2JsGradlePluginIT.kt | 27 +++++++++++++++++-- .../app/build.gradle.kts | 18 +++++++++++++ .../app/src/main/kotlin/App.kt | 7 +++++ .../build.gradle.kts | 13 +++++++++ .../lib/build.gradle.kts | 11 ++++++++ .../lib/src/main/kotlin/Lib.kt | 5 ++++ .../settings.gradle | 4 +++ .../plugin/mpp/apple/XCFrameworkTask.kt | 5 +++- .../kotlin/gradle/tasks/Kotlin2JsCompile.kt | 5 ++-- .../kotlin/gradle/utils/fileUtils.kt | 16 +++++++++++ 10 files changed, 105 insertions(+), 6 deletions(-) create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-with-friend-paths/app/build.gradle.kts create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-with-friend-paths/app/src/main/kotlin/App.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-with-friend-paths/build.gradle.kts create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-with-friend-paths/lib/build.gradle.kts create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-with-friend-paths/lib/src/main/kotlin/Lib.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-with-friend-paths/settings.gradle diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/Kotlin2JsGradlePluginIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/Kotlin2JsGradlePluginIT.kt index b5f5a108c3a..41e4b7db696 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/Kotlin2JsGradlePluginIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/Kotlin2JsGradlePluginIT.kt @@ -21,13 +21,16 @@ import org.jetbrains.kotlin.gradle.targets.js.yarn.YarnLockCopyTask.Companion.YA import org.jetbrains.kotlin.gradle.tasks.USING_JS_IR_BACKEND_MESSAGE import org.jetbrains.kotlin.gradle.testbase.* import org.jetbrains.kotlin.gradle.testbase.TestVersions.Gradle.G_7_6 +import org.jetbrains.kotlin.gradle.util.replaceText import org.junit.jupiter.api.DisplayName -import org.junit.jupiter.api.condition.DisabledIf import java.nio.file.Files import java.util.zip.ZipFile import kotlin.io.path.* import kotlin.streams.toList -import kotlin.test.* +import kotlin.test.assertEquals +import kotlin.test.assertFalse +import kotlin.test.assertNotNull +import kotlin.test.assertTrue @JsGradlePluginTests class Kotlin2JsIrGradlePluginIT : KGPBaseTest() { @@ -547,6 +550,26 @@ class Kotlin2JsIrGradlePluginIT : KGPBaseTest() { } } + @DisplayName("Not existed friend dependencies does not affect compileKotlinJs UTD") + @GradleTest + fun testFriendDependenciesDoesNotExist(gradleVersion: GradleVersion) { + project("kotlin-js-with-friend-paths", gradleVersion) { + build("assemble") + + val oldFriendPaths = "friendPaths.from(project(\":lib\").buildDir.resolve(\"libs/lib.klib\"))" + val appModuleGradleBuildKts = subProject("app").buildGradleKts + assertFileInProjectContains(appModuleGradleBuildKts.absolutePathString(), oldFriendPaths) + appModuleGradleBuildKts.replaceText( + oldFriendPaths, + "friendPaths.from(project(\":lib\").buildDir.resolve(\"libs/lib.klib\"), project(\":lib\").buildDir.resolve(\"libs/not_existed_lib.klib\"))" + ) + + build("assemble") { + assertTasksUpToDate(":app:compileKotlinJs") + } + } + } + @DisplayName("klib fingerprints") @GradleTest fun testKlibFingerprints(gradleVersion: GradleVersion) { diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-with-friend-paths/app/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-with-friend-paths/app/build.gradle.kts new file mode 100644 index 00000000000..7e5c46ad485 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-with-friend-paths/app/build.gradle.kts @@ -0,0 +1,18 @@ +plugins { + kotlin("js") +} + +dependencies { + implementation(project(":lib")) +} + +kotlin { + js { + browser {} + binaries.executable() + } +} + +tasks.withType().configureEach { + friendPaths.from(project(":lib").buildDir.resolve("libs/lib.klib")) +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-with-friend-paths/app/src/main/kotlin/App.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-with-friend-paths/app/src/main/kotlin/App.kt new file mode 100644 index 00000000000..c09693e20ab --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-with-friend-paths/app/src/main/kotlin/App.kt @@ -0,0 +1,7 @@ +package com.example + +import com.example.LibClass + +fun main() { + println(LibClass().helloFromFriend()) +} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-with-friend-paths/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-with-friend-paths/build.gradle.kts new file mode 100644 index 00000000000..877c415742c --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-with-friend-paths/build.gradle.kts @@ -0,0 +1,13 @@ +plugins { + kotlin("js").apply(false) +} + +group = "com.example" +version = "1.0" + +allprojects { + repositories { + mavenLocal() + mavenCentral() + } +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-with-friend-paths/lib/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-with-friend-paths/lib/build.gradle.kts new file mode 100644 index 00000000000..9a10dc2d4d6 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-with-friend-paths/lib/build.gradle.kts @@ -0,0 +1,11 @@ +plugins { + kotlin("js") +} + +kotlin { + js { + useCommonJs() + browser { + } + } +} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-with-friend-paths/lib/src/main/kotlin/Lib.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-with-friend-paths/lib/src/main/kotlin/Lib.kt new file mode 100644 index 00000000000..77ba07f8f92 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-with-friend-paths/lib/src/main/kotlin/Lib.kt @@ -0,0 +1,5 @@ +package com.example + +internal class LibClass { + fun helloFromFriend() = "Hello from -Xfriend-modules" +} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-with-friend-paths/settings.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-with-friend-paths/settings.gradle new file mode 100644 index 00000000000..8c762203b79 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-with-friend-paths/settings.gradle @@ -0,0 +1,4 @@ +rootProject.name = "kotlin-js-with-friend-paths" + +include("lib") +include("app") diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/apple/XCFrameworkTask.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/apple/XCFrameworkTask.kt index b75dc5200fc..d60dd371ad5 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/apple/XCFrameworkTask.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/apple/XCFrameworkTask.kt @@ -19,6 +19,7 @@ import org.jetbrains.kotlin.gradle.plugin.diagnostics.UsesKotlinToolingDiagnosti import org.jetbrains.kotlin.gradle.plugin.mpp.Framework import org.jetbrains.kotlin.gradle.plugin.mpp.NativeBuildType import org.jetbrains.kotlin.gradle.tasks.* +import org.jetbrains.kotlin.gradle.utils.existsCompat import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName import org.jetbrains.kotlin.konan.target.HostManager import org.jetbrains.kotlin.konan.target.KonanTarget @@ -181,7 +182,9 @@ internal constructor( @get:PathSensitive(PathSensitivity.ABSOLUTE) @get:SkipWhenEmpty val inputFrameworkFiles: Collection - get() = groupedFrameworkFiles.values.flatten().map { it.file }.filter { it.exists() } + get() = groupedFrameworkFiles.values.flatten().map { it.file }.filter { + it.existsCompat() + } /** * A parent directory for the XCFramework. diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/Kotlin2JsCompile.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/Kotlin2JsCompile.kt index 38a64e2762d..207e00709be 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/Kotlin2JsCompile.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/Kotlin2JsCompile.kt @@ -41,6 +41,7 @@ import org.jetbrains.kotlin.gradle.targets.js.ir.PRODUCE_UNZIPPED_KLIB import org.jetbrains.kotlin.gradle.targets.js.ir.PRODUCE_ZIPPED_KLIB import org.jetbrains.kotlin.gradle.tasks.internal.KotlinJsOptionsCompat import org.jetbrains.kotlin.gradle.utils.getFile +import org.jetbrains.kotlin.gradle.utils.existsCompat import org.jetbrains.kotlin.gradle.utils.isParentOf import org.jetbrains.kotlin.gradle.utils.newInstance import org.jetbrains.kotlin.gradle.utils.toPathsArray @@ -220,9 +221,7 @@ abstract class Kotlin2JsCompile @Inject constructor( internal val friendDependencies: FileCollection = objectFactory .fileCollection() .from(friendPaths) - .filter { - it.exists() && libraryFilter(it) - } + .filter { libraryFilter(it) } @get:Internal internal val sourceMapBaseDir: Property = objectFactory diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/utils/fileUtils.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/utils/fileUtils.kt index c61b38ae2e1..ae37b616569 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/utils/fileUtils.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/utils/fileUtils.kt @@ -129,3 +129,19 @@ internal fun Provider.getFile(): File = get().asFile @JvmName("getDirectoryAsFile") // avoids jvm signature clash internal fun Provider.getFile(): File = get().asFile + + +/** + * Checks if the file exists, taking into account compatibility with different versions of Gradle. + * It should be used instead of [File.exists] in checking UPD inputs. See KT-54232 for more info. + * + * @return `true` if the file exists, `false` otherwise. + * + * NOTE: You can remove this method and all its usages since the minimal supported version of gradle become 8.0 + */ +internal fun File.existsCompat(): Boolean = + if (isGradleVersionAtLeast(8, 0)) { + true + } else { + exists() + } \ No newline at end of file