From f8668838719937d1b6518bfb50294f21c39408ac Mon Sep 17 00:00:00 2001 From: Yahor Berdnikau Date: Fri, 1 Sep 2023 12:59:54 +0200 Subject: [PATCH] [Gradle] Also configure JsIrLink tasks with target compiler options This should synchronize options between JS compile and link tasks configured with target compiler options DSL. ^KT-61253 Fixed --- .../plugin/KotlinJsIrSourceSetProcessor.kt | 14 +++++++ .../gradle/targets/js/ir/KotlinJsIrTarget.kt | 6 +-- .../js/ir/KotlinJsIrTargetConfigurator.kt | 23 ++++------- .../configuration/Kotlin2JsCompileConfig.kt | 15 ++++++- .../unitTests/ProjectCompilerOptionsTests.kt | 40 +++++++++++++++++++ 5 files changed, 76 insertions(+), 22 deletions(-) diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinJsIrSourceSetProcessor.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinJsIrSourceSetProcessor.kt index 67d6bbbdac9..20eb85440ce 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinJsIrSourceSetProcessor.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinJsIrSourceSetProcessor.kt @@ -8,8 +8,11 @@ package org.jetbrains.kotlin.gradle.plugin import org.gradle.api.Project import org.gradle.api.tasks.TaskProvider import org.jetbrains.kotlin.gradle.dsl.KotlinJsCompilerOptions +import org.jetbrains.kotlin.gradle.dsl.KotlinJsCompilerOptionsHelper import org.jetbrains.kotlin.gradle.targets.js.ir.JsIrBinary import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrCompilation +import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrTarget +import org.jetbrains.kotlin.gradle.targets.js.npm.npmProject import org.jetbrains.kotlin.gradle.tasks.Kotlin2JsCompile import org.jetbrains.kotlin.gradle.tasks.KotlinTasksProvider import org.jetbrains.kotlin.gradle.tasks.configuration.Kotlin2JsCompileConfig @@ -50,6 +53,17 @@ internal class KotlinJsIrSourceSetProcessor( it.libraries.from(project.filesProvider { compilation.runtimeDependencyFiles }) } configAction.configureTask { task -> + val targetCompilerOptions = (compilation.target as KotlinJsIrTarget).compilerOptions + KotlinJsCompilerOptionsHelper.syncOptionsAsConvention( + targetCompilerOptions, + task.compilerOptions + ) + + // Restoring already configured module name + task.compilerOptions.moduleName.convention( + project.provider { compilation.npmProject.name } + ) + task.modeProperty.set(binary.mode) task.dependsOn(kotlinTask) } diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrTarget.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrTarget.kt index 00697eb36e1..a876900d1a1 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrTarget.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrTarget.kt @@ -399,11 +399,7 @@ constructor( override val compilerOptions: KotlinJsCompilerOptions = project.objects .newInstance() .apply { - configureJsDefaultOptions() - - if (platformType == KotlinPlatformType.wasm) { - freeCompilerArgs.add(WASM_BACKEND) - } + configureJsDefaultOptions(platformType) freeCompilerArgs.add(DISABLE_PRE_IR) } diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrTargetConfigurator.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrTargetConfigurator.kt index c32ff1b1abb..4b09bf7e6be 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrTargetConfigurator.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrTargetConfigurator.kt @@ -85,21 +85,6 @@ open class KotlinJsIrTargetConfigurator : } } - override fun configureCompilations(target: KotlinJsIrTarget) { - super.configureCompilations(target) - - - target.compilations.all { compilation -> - compilation.binaries - .withType(JsIrBinary::class.java) - .all { binary -> - binary.linkTask.configure { linkTask -> - linkTask.compilerOptions.configureJsDefaultOptions() - } - } - } - } - override fun defineConfigurationsForTarget(target: KotlinJsIrTarget) { super.defineConfigurationsForTarget(target) @@ -118,10 +103,16 @@ open class KotlinJsIrTargetConfigurator : } internal companion object { - internal fun KotlinJsCompilerOptions.configureJsDefaultOptions() { + internal fun KotlinJsCompilerOptions.configureJsDefaultOptions( + platformType: KotlinPlatformType + ) { moduleKind.set(JsModuleKind.MODULE_UMD) sourceMap.set(true) sourceMapEmbedSources.set(JsSourceMapEmbedMode.SOURCE_MAP_SOURCE_CONTENT_NEVER) + + if (platformType == KotlinPlatformType.wasm) { + freeCompilerArgs.add(WASM_BACKEND) + } } } } 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 0cac5ab9634..f6552801264 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 @@ -9,6 +9,10 @@ import org.jetbrains.kotlin.compilerRunner.GradleCompilerRunner import org.jetbrains.kotlin.gradle.incremental.IncrementalModuleInfoBuildService import org.jetbrains.kotlin.gradle.plugin.KotlinCompilationInfo import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType +import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation +import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinWithJavaTarget +import org.jetbrains.kotlin.gradle.plugin.tcs +import org.jetbrains.kotlin.gradle.targets.js.KotlinJsTarget import org.jetbrains.kotlin.gradle.targets.js.KotlinWasmTargetType import org.jetbrains.kotlin.gradle.targets.js.internal.LibraryFilterCachingService import org.jetbrains.kotlin.gradle.targets.js.ir.* @@ -37,7 +41,16 @@ internal open class BaseKotlin2JsCompileConfig( configureAdditionalFreeCompilerArguments(task, compilation) - task.moduleName.set(task.compilerOptions.moduleName) + val compilationTarget = compilation.tcs.compilation.target + if (compilationTarget is KotlinJsTarget || + (compilationTarget is KotlinWithJavaTarget<*, *> && compilationTarget.platformType == KotlinPlatformType.js) + ) { + // JS v1 which does not configure module name via target compiler options + task.compilerOptions.moduleName.convention(compilation.moduleName) + task.moduleName.set(providers.provider { compilation.moduleName }) + } else { + 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 7baaf6a4053..cca0eccc705 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 @@ -371,6 +371,46 @@ class ProjectCompilerOptionsTests { ) } + @Test + fun testJsLinkTaskAreAlsoConfiguredWithOptionsFromDSL() { + val project = buildProjectWithMPP() + project.runLifecycleAwareTest { + with(multiplatformExtension) { + js { + nodejs() + binaries.library() + compilerOptions { + moduleName.set("my-custom-module") + languageVersion.set(KotlinVersion.KOTLIN_1_8) + apiVersion.set(KotlinVersion.KOTLIN_1_8) + moduleKind.set(JsModuleKind.MODULE_PLAIN) + freeCompilerArgs.addAll("-Xstrict-implicit-export-types", "-Xexplicit-api=warning") + } + } + } + } + + val jsTasks = listOf( + project.kotlinJsTask("compileKotlinJs"), + project.kotlinJsTask("compileDevelopmentLibraryKotlinJs"), + project.kotlinJsTask("compileProductionLibraryKotlinJs") + ) + jsTasks.forEach { jsTask -> + if (jsTask.name == "compileKotlinJs") { + // JS IR has different module name from 'compileKotlinJs' + assertEquals("my-custom-module", jsTask.compilerOptions.moduleName.orNull) + } + assertEquals(KotlinVersion.KOTLIN_1_8, jsTask.compilerOptions.languageVersion.orNull) + assertEquals(KotlinVersion.KOTLIN_1_8, jsTask.compilerOptions.apiVersion.orNull) + assertEquals(JsModuleKind.MODULE_PLAIN, jsTask.compilerOptions.moduleKind.orNull) + assertTrue( + jsTask.compilerOptions.freeCompilerArgs.get().containsAll( + listOf("-Xstrict-implicit-export-types", "-Xexplicit-api=warning") + ) + ) + } + } + private fun Project.kotlinNativeTask(name: String): KotlinCompilationTask = tasks .named>(name) .get()