From 09add47777b7ececc3a776f021555cfcf2379c45 Mon Sep 17 00:00:00 2001 From: Alexander Korepanov Date: Wed, 7 Sep 2022 19:50:07 +0200 Subject: [PATCH] [JS IR] Trigger klib rebuild after removing a dependency ^KT-50503 Fixed --- .../kotlin/incremental/DirtyFilesContainer.kt | 4 ++- .../IncrementalJsCompilerRunner.kt | 6 +++- .../kotlin/gradle/Kotlin2JsGradlePluginIT.kt | 28 +++++++++++++++++++ .../app/build.gradle.kts | 10 +++++++ .../app/src/main/kotlin/App.kt | 5 ++++ .../build.gradle.kts | 13 +++++++++ .../gradle.properties | 2 ++ .../lib/build.gradle.kts | 11 ++++++++ .../lib/src/main/kotlin/Lib.kt | 5 ++++ .../settings.gradle | 4 +++ 10 files changed, 86 insertions(+), 2 deletions(-) create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-ir-ic-remove-unused-dep/app/build.gradle.kts create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-ir-ic-remove-unused-dep/app/src/main/kotlin/App.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-ir-ic-remove-unused-dep/build.gradle.kts create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-ir-ic-remove-unused-dep/gradle.properties create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-ir-ic-remove-unused-dep/lib/build.gradle.kts create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-ir-ic-remove-unused-dep/lib/src/main/kotlin/Lib.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-ir-ic-remove-unused-dep/settings.gradle diff --git a/compiler/incremental-compilation-impl/src/org/jetbrains/kotlin/incremental/DirtyFilesContainer.kt b/compiler/incremental-compilation-impl/src/org/jetbrains/kotlin/incremental/DirtyFilesContainer.kt index e94019990fb..3636697c697 100644 --- a/compiler/incremental-compilation-impl/src/org/jetbrains/kotlin/incremental/DirtyFilesContainer.kt +++ b/compiler/incremental-compilation-impl/src/org/jetbrains/kotlin/incremental/DirtyFilesContainer.kt @@ -16,6 +16,8 @@ class DirtyFilesContainer( ) { private val myDirtyFiles = HashSet() + fun isEmpty() = myDirtyFiles.isEmpty() + fun toMutableLinkedSet(): LinkedHashSet = LinkedHashSet(myDirtyFiles) @@ -51,4 +53,4 @@ class DirtyFilesContainer( // reason is null, because files are reported in mapClassesFqNamesToFiles add(dirtyFilesFromFqNames, reason = null) } -} \ No newline at end of file +} diff --git a/compiler/incremental-compilation-impl/src/org/jetbrains/kotlin/incremental/IncrementalJsCompilerRunner.kt b/compiler/incremental-compilation-impl/src/org/jetbrains/kotlin/incremental/IncrementalJsCompilerRunner.kt index 70482779085..bcc55c17e8f 100644 --- a/compiler/incremental-compilation-impl/src/org/jetbrains/kotlin/incremental/IncrementalJsCompilerRunner.kt +++ b/compiler/incremental-compilation-impl/src/org/jetbrains/kotlin/incremental/IncrementalJsCompilerRunner.kt @@ -153,6 +153,10 @@ class IncrementalJsCompilerRunner( dirtyFiles.addByDirtySymbols(removedClassesChanges.dirtyLookupSymbols) dirtyFiles.addByDirtyClasses(removedClassesChanges.dirtyClassesFqNames) dirtyFiles.addByDirtyClasses(removedClassesChanges.dirtyClassesFqNamesForceRecompile) + + if (dirtyFiles.isEmpty() && changedFiles.removed.isNotEmpty()) { + return CompilationMode.Rebuild(BuildAttribute.DEP_CHANGE_REMOVED_ENTRY) + } return CompilationMode.Incremental(dirtyFiles) } @@ -259,4 +263,4 @@ class IncrementalJsCompilerRunner( return newDirtySources.isNotEmpty() } } -} \ No newline at end of file +} 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 1e26b643b9b..83728116665 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 @@ -219,6 +219,34 @@ class Kotlin2JsIrGradlePluginIT : AbstractKotlin2JsGradlePluginIT(true) { } } + @DisplayName("Remove unused dependency from klib") + @GradleTest + fun testJsIrIncrementalKlibRemoveUnusedDependency(gradleVersion: GradleVersion) { + project("kotlin-js-ir-ic-remove-unused-dep", gradleVersion) { + val appBuildGradleKts = subProject("app").buildGradleKts + + val buildGradleKtsWithoutDependency = appBuildGradleKts.readText() + appBuildGradleKts.appendText( + """ + | + |dependencies { + | implementation(project(":lib")) + |} + | + """.trimMargin() + ) + + build("compileDevelopmentExecutableKotlinJs") { + assertTasksExecuted(":app:compileDevelopmentExecutableKotlinJs") + } + + appBuildGradleKts.writeText(buildGradleKtsWithoutDependency) + build("compileDevelopmentExecutableKotlinJs") { + assertTasksExecuted(":app:compileDevelopmentExecutableKotlinJs") + } + } + } + @DisplayName("falsify kotlin js compiler args") @GradleTest fun testFalsifyKotlinJsCompilerArgs(gradleVersion: GradleVersion) { diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-ir-ic-remove-unused-dep/app/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-ir-ic-remove-unused-dep/app/build.gradle.kts new file mode 100644 index 00000000000..799dfdeb874 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-ir-ic-remove-unused-dep/app/build.gradle.kts @@ -0,0 +1,10 @@ +plugins { + kotlin("js") +} + +kotlin { + js { + browser {} + binaries.executable() + } +} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-ir-ic-remove-unused-dep/app/src/main/kotlin/App.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-ir-ic-remove-unused-dep/app/src/main/kotlin/App.kt new file mode 100644 index 00000000000..2b29cc8cf8d --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-ir-ic-remove-unused-dep/app/src/main/kotlin/App.kt @@ -0,0 +1,5 @@ +package com.example + +fun main() { + println("Hello, World!") +} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-ir-ic-remove-unused-dep/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-ir-ic-remove-unused-dep/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-ir-ic-remove-unused-dep/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-ir-ic-remove-unused-dep/gradle.properties b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-ir-ic-remove-unused-dep/gradle.properties new file mode 100644 index 00000000000..5de000d1dda --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-ir-ic-remove-unused-dep/gradle.properties @@ -0,0 +1,2 @@ +kotlin.incremental.js.klib=true +kotlin.incremental.js.ir=true \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-ir-ic-remove-unused-dep/lib/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-ir-ic-remove-unused-dep/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-ir-ic-remove-unused-dep/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-ir-ic-remove-unused-dep/lib/src/main/kotlin/Lib.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-ir-ic-remove-unused-dep/lib/src/main/kotlin/Lib.kt new file mode 100644 index 00000000000..d465f46a979 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-ir-ic-remove-unused-dep/lib/src/main/kotlin/Lib.kt @@ -0,0 +1,5 @@ +package com.example + +fun foo(): Int { + return 42 +} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-ir-ic-remove-unused-dep/settings.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-ir-ic-remove-unused-dep/settings.gradle new file mode 100644 index 00000000000..5dd1e197b2d --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-ir-ic-remove-unused-dep/settings.gradle @@ -0,0 +1,4 @@ +rootProject.name = "kotlin-js-ir-ic-remove-unused-dep" + +include("lib") +include("app")