From 55a0c86508e15fdfa82f27db217a4bab3850cc4b Mon Sep 17 00:00:00 2001 From: Yahor Berdnikau Date: Thu, 31 Aug 2023 22:41:32 +0200 Subject: [PATCH] [Gradle] Fix JS module name and freeCompilerArgs config is not propagated to the task Task was not using configured module name correctly. In case of using "browser()" DSL freeCompilerArgs could be overwritten. ^KT-61194 Fixed --- .../targets/js/ir/KotlinJsIrSubTarget.kt | 4 +- .../configuration/Kotlin2JsCompileConfig.kt | 3 +- .../unitTests/ProjectCompilerOptionsTests.kt | 49 +++++++++++++++++++ 3 files changed, 51 insertions(+), 5 deletions(-) diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrSubTarget.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrSubTarget.kt index c25fe1db617..95ec34ac379 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrSubTarget.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrSubTarget.kt @@ -56,9 +56,7 @@ abstract class KotlinJsIrSubTarget( internal fun configure() { target.compilations.all { val npmProject = it.npmProject - it.kotlinOptions { - freeCompilerArgs += "$PER_MODULE_OUTPUT_NAME=${npmProject.name}" - } + it.compilerOptions.options.freeCompilerArgs.add("$PER_MODULE_OUTPUT_NAME=${npmProject.name}") } configureTests() diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/configuration/Kotlin2JsCompileConfig.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/configuration/Kotlin2JsCompileConfig.kt index 1bbc0bcd746..0cac5ab9634 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/configuration/Kotlin2JsCompileConfig.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/configuration/Kotlin2JsCompileConfig.kt @@ -37,8 +37,7 @@ internal open class BaseKotlin2JsCompileConfig( configureAdditionalFreeCompilerArguments(task, compilation) - task.compilerOptions.moduleName.convention(compilation.moduleName) - task.moduleName.set(providers.provider { compilation.moduleName }) + task.moduleName.set(task.compilerOptions.moduleName) @Suppress("DEPRECATION") task.outputFileProperty.value( diff --git a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/unitTests/ProjectCompilerOptionsTests.kt b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/unitTests/ProjectCompilerOptionsTests.kt index ccb83c4530d..7baaf6a4053 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/unitTests/ProjectCompilerOptionsTests.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/unitTests/ProjectCompilerOptionsTests.kt @@ -11,11 +11,13 @@ import org.jetbrains.kotlin.gradle.dsl.multiplatformExtension import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinMetadataTarget import org.jetbrains.kotlin.gradle.plugin.mpp.external.createCompilation import org.jetbrains.kotlin.gradle.plugin.mpp.external.createExternalKotlinTarget +import org.jetbrains.kotlin.gradle.tasks.Kotlin2JsCompile import org.jetbrains.kotlin.gradle.tasks.KotlinCompilationTask import org.jetbrains.kotlin.gradle.tasks.KotlinJvmCompile as KotlinJvmCompileTask import org.jetbrains.kotlin.gradle.tasks.withType import org.jetbrains.kotlin.gradle.util.* import org.jetbrains.kotlin.gradle.utils.named +import org.jetbrains.kotlin.test.util.JUnit4Assertions.assertTrue import kotlin.test.Test import kotlin.test.assertEquals @@ -322,6 +324,53 @@ class ProjectCompilerOptionsTests { assertEquals("my-custom-module-name", project.kotlinJvmTask("compileKotlinJvm").compilerOptions.moduleName.orNull) } + @Test + fun testJsOptionsIsConfigured() { + val project = buildProjectWithMPP() + project.runLifecycleAwareTest { + with(multiplatformExtension) { + js { + compilerOptions { + moduleName.set("js-module-name") + freeCompilerArgs.add("-Xstrict-implicit-export-types") + } + } + } + } + + val kotlinJsCompileTask = project.kotlinJsTask("compileKotlinJs") + assertEquals("js-module-name", kotlinJsCompileTask.compilerOptions.moduleName.orNull) + assertTrue( + kotlinJsCompileTask + .compilerOptions + .freeCompilerArgs.get() + .contains("-Xstrict-implicit-export-types") + ) + } + + @Test + fun testJsBrowserConfigDoesNotOverrideFreeCompilerArgsFromTarget() { + val project = buildProjectWithMPP() + project.runLifecycleAwareTest { + with(multiplatformExtension) { + js { + binaries.executable() + browser() + compilerOptions { + freeCompilerArgs.addAll("-Xstrict-implicit-export-types", "-Xexplicit-api=warning") + } + } + } + } + + val kotlinJsCompileTask = project.kotlinJsTask("compileKotlinJs") + assertTrue( + (kotlinJsCompileTask as Kotlin2JsCompile) + .enhancedFreeCompilerArgs.get() + .containsAll(listOf("-Xstrict-implicit-export-types", "-Xexplicit-api=warning")) + ) + } + private fun Project.kotlinNativeTask(name: String): KotlinCompilationTask = tasks .named>(name) .get()