diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/compilationImpl/KotlinCompilationCompilerOptionsConfigurator.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/compilationImpl/KotlinCompilationCompilerOptionsConfigurator.kt index b4ff7d4f6c6..72b357bc8a5 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/compilationImpl/KotlinCompilationCompilerOptionsConfigurator.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/compilationImpl/KotlinCompilationCompilerOptionsConfigurator.kt @@ -5,9 +5,8 @@ package org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl -import org.jetbrains.kotlin.gradle.dsl.KotlinJvmCompilerOptions +import org.jetbrains.kotlin.gradle.dsl.* import org.jetbrains.kotlin.gradle.dsl.KotlinJvmCompilerOptionsHelper -import org.jetbrains.kotlin.gradle.dsl.KotlinNativeCompilerOptions import org.jetbrains.kotlin.gradle.dsl.KotlinNativeCompilerOptionsHelper import org.jetbrains.kotlin.gradle.plugin.mpp.DecoratedKotlinCompilation import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.factory.KotlinCompilationImplFactory @@ -50,3 +49,22 @@ internal class KotlinCompilationNativeCompilerOptionsFromTargetConfigurator( ) } } + +internal class KotlinCompilationJsCompilerOptionsFromTargetConfigurator( + private val targetCompilerOptions: KotlinJsCompilerOptions +) : KotlinCompilationImplFactory.PostConfigure { + override fun configure(compilation: DecoratedKotlinCompilation<*>) { + val jsCompilerOptions = compilation.compilerOptions.options as KotlinJsCompilerOptions + KotlinJsCompilerOptionsHelper.syncOptionsAsConvention( + targetCompilerOptions, + jsCompilerOptions + ) + + jsCompilerOptions.moduleName.convention( + moduleNameForCompilation( + compilation.compilationName, + targetCompilerOptions.moduleName + ).orElse(compilation.moduleNameForCompilation()) + ) + } +} diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsTarget.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsTarget.kt index 8b2738914ed..30e7d047cd6 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsTarget.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsTarget.kt @@ -9,8 +9,7 @@ import org.gradle.api.NamedDomainObjectContainer import org.gradle.api.Project import org.gradle.api.Task import org.gradle.api.tasks.TaskProvider -import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension -import org.jetbrains.kotlin.gradle.dsl.kotlinExtension +import org.jetbrains.kotlin.gradle.dsl.* import org.jetbrains.kotlin.gradle.plugin.* import org.jetbrains.kotlin.gradle.plugin.AbstractKotlinTargetConfigurator.Companion.runTaskNameSuffix import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation.Companion.MAIN_COMPILATION_NAME @@ -32,6 +31,7 @@ import org.jetbrains.kotlin.gradle.testing.internal.KotlinTestReport import org.jetbrains.kotlin.gradle.testing.testTaskName import org.jetbrains.kotlin.gradle.utils.dashSeparatedName import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName +import org.jetbrains.kotlin.gradle.utils.newInstance import org.jetbrains.kotlin.gradle.utils.setProperty import org.jetbrains.kotlin.util.capitalizeDecapitalize.toLowerCaseAsciiOnly import org.jetbrains.kotlin.utils.addIfNotNull @@ -249,4 +249,7 @@ constructor( override fun generateTypeScriptDefinitions() { project.logger.warn("Legacy compiler does not support generation of TypeScript Definitions") } + + override val compilerOptions: KotlinJsCompilerOptions = + project.objects.newInstance() } \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/dsl/KotlinJsTargetDsl.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/dsl/KotlinJsTargetDsl.kt index a438c62d03f..f509f2bd0ed 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/dsl/KotlinJsTargetDsl.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/dsl/KotlinJsTargetDsl.kt @@ -8,6 +8,8 @@ package org.jetbrains.kotlin.gradle.targets.js.dsl import org.gradle.api.Action import org.gradle.api.GradleException import org.gradle.api.NamedDomainObjectContainer +import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi +import org.jetbrains.kotlin.gradle.dsl.KotlinJsCompilerOptions import org.jetbrains.kotlin.gradle.dsl.KotlinJsDce import org.jetbrains.kotlin.gradle.plugin.KotlinTarget import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation @@ -64,6 +66,19 @@ interface KotlinJsTargetDsl : KotlinTarget, KotlinTargetWithNodeJsDsl { // Need to compatibility when users use KotlinJsCompilation specific in build script override val compilations: NamedDomainObjectContainer + + @ExperimentalKotlinGradlePluginApi + override val compilerOptions: KotlinJsCompilerOptions + + @ExperimentalKotlinGradlePluginApi + fun compilerOptions(configure: KotlinJsCompilerOptions.() -> Unit) { + configure(compilerOptions) + } + + @ExperimentalKotlinGradlePluginApi + fun compilerOptions(configure: Action) { + configure.execute(compilerOptions) + } } interface KotlinTargetWithNodeJsDsl { diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrCompilationFactory.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrCompilationFactory.kt index 9ee27831c60..b87fcbec5b5 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrCompilationFactory.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrCompilationFactory.kt @@ -7,16 +7,21 @@ package org.jetbrains.kotlin.gradle.targets.js.ir import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinCompilationFactory -import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinOnlyTarget import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.DefaultKotlinCompilationFriendPathsResolver import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.DefaultKotlinCompilationPreConfigure import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.factory.* import org.jetbrains.kotlin.gradle.plugin.mpp.isMain import org.jetbrains.kotlin.gradle.plugin.mpp.sourcesJarTask import org.jetbrains.kotlin.util.capitalizeDecapitalize.toLowerCaseAsciiOnly +import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.factory.JsIrCompilationSourceSetsContainerFactory +import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.factory.JsKotlinCompilationDependencyConfigurationsFactory +import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.DefaultKotlinCompilationPostConfigure +import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.KotlinCompilationJsCompilerOptionsFromTargetConfigurator +import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.factory.KotlinCompilationImplFactory +import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.factory.KotlinJsCompilerOptionsFactory class KotlinJsIrCompilationFactory internal constructor( - override val target: KotlinOnlyTarget, + override val target: KotlinJsIrTarget, ) : KotlinCompilationFactory { override val itemClass: Class get() = KotlinJsIrCompilation::class.java @@ -24,7 +29,7 @@ class KotlinJsIrCompilationFactory internal constructor( private val compilationImplFactory: KotlinCompilationImplFactory = KotlinCompilationImplFactory( compilerOptionsFactory = KotlinJsCompilerOptionsFactory, compilationFriendPathsResolver = DefaultKotlinCompilationFriendPathsResolver( - friendArtifactResolver = DefaultKotlinCompilationFriendPathsResolver.FriendArtifactResolver { _ -> + friendArtifactResolver = { _ -> target.project.files() } ), @@ -36,7 +41,11 @@ class KotlinJsIrCompilationFactory internal constructor( ?: compilation.target.targetName.toLowerCaseAsciiOnly() sourcesJarTask(compilation, compilation.target.targetName, artifactNameAppendix) } - } + }, + postConfigureAction = KotlinCompilationImplFactory.PostConfigure.composite( + DefaultKotlinCompilationPostConfigure, + KotlinCompilationJsCompilerOptionsFromTargetConfigurator(target.compilerOptions) + ) ) override fun create(name: String): KotlinJsIrCompilation = target.project.objects.newInstance( 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 968cff1d0cf..a8c7971d269 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 @@ -13,6 +13,9 @@ import org.jetbrains.kotlin.gradle.dsl.KotlinJsOptions import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension import org.jetbrains.kotlin.gradle.dsl.kotlinExtension import org.jetbrains.kotlin.gradle.plugin.* +import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi +import org.jetbrains.kotlin.gradle.dsl.* +import org.jetbrains.kotlin.gradle.dsl.KotlinJsCompilerOptionsDefault import org.jetbrains.kotlin.gradle.plugin.AbstractKotlinTargetConfigurator.Companion.runTaskNameSuffix import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation.Companion.MAIN_COMPILATION_NAME import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider @@ -23,15 +26,18 @@ import org.jetbrains.kotlin.gradle.targets.js.KotlinJsTarget import org.jetbrains.kotlin.gradle.targets.js.KotlinWasmTargetType import org.jetbrains.kotlin.gradle.targets.js.binaryen.BinaryenExec import org.jetbrains.kotlin.gradle.targets.js.dsl.* +import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrTargetConfigurator.Companion.configureJsDefaultOptions import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin import org.jetbrains.kotlin.gradle.targets.js.npm.NpmResolverPlugin import org.jetbrains.kotlin.gradle.targets.js.npm.npmProject import org.jetbrains.kotlin.gradle.targets.js.typescript.TypeScriptValidationTask import org.jetbrains.kotlin.gradle.tasks.locateOrRegisterTask import org.jetbrains.kotlin.gradle.tasks.registerTask +import org.jetbrains.kotlin.gradle.utils.* import org.jetbrains.kotlin.gradle.utils.dashSeparatedName import org.jetbrains.kotlin.gradle.utils.decamelize import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName +import org.jetbrains.kotlin.gradle.utils.newInstance import org.jetbrains.kotlin.gradle.utils.setProperty import org.jetbrains.kotlin.util.capitalizeDecapitalize.capitalizeAsciiOnly import org.jetbrains.kotlin.util.capitalizeDecapitalize.toLowerCaseAsciiOnly @@ -389,6 +395,20 @@ constructor( } } } + + @ExperimentalKotlinGradlePluginApi + override val compilerOptions: KotlinJsCompilerOptions = project.objects + .newInstance() + .configureExperimentalTryK2(project) + .apply { + configureJsDefaultOptions() + + if (platformType == KotlinPlatformType.wasm) { + freeCompilerArgs.add(WASM_BACKEND) + } + + freeCompilerArgs.add(DISABLE_PRE_IR) + } } fun KotlinJsIrTarget.wasmDecamelizedDefaultNameOrNull(): String? = if (platformType == KotlinPlatformType.wasm) { 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 28076d04143..cfcc8d5d3c6 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 @@ -14,15 +14,12 @@ import org.jetbrains.kotlin.gradle.dsl.JsSourceMapEmbedMode import org.jetbrains.kotlin.gradle.dsl.KotlinJsCompilerOptions import org.jetbrains.kotlin.gradle.plugin.* import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinUsages -import org.jetbrains.kotlin.gradle.plugin.mpp.isMain import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.libsDirectory -import org.jetbrains.kotlin.gradle.plugin.mpp.sourcesJarTask import org.jetbrains.kotlin.gradle.targets.js.KotlinJsReportAggregatingTestRun import org.jetbrains.kotlin.gradle.tasks.KotlinTasksProvider import org.jetbrains.kotlin.gradle.testing.internal.kotlinTestRegistry import org.jetbrains.kotlin.gradle.testing.testTaskName import org.jetbrains.kotlin.gradle.utils.decamelize -import org.jetbrains.kotlin.util.capitalizeDecapitalize.toLowerCaseAsciiOnly open class KotlinJsIrTargetConfigurator : KotlinOnlyTargetConfigurator(true), @@ -91,33 +88,18 @@ open class KotlinJsIrTargetConfigurator : override fun configureCompilations(target: KotlinJsIrTarget) { super.configureCompilations(target) + target.compilations.all { compilation -> - compilation.compilerOptions.configure { - configureOptions() - - if (target.platformType == KotlinPlatformType.wasm) { - freeCompilerArgs.add(WASM_BACKEND) - } - - freeCompilerArgs.add(DISABLE_PRE_IR) - } - compilation.binaries .withType(JsIrBinary::class.java) .all { binary -> binary.linkTask.configure { linkTask -> - linkTask.compilerOptions.configureOptions() + linkTask.compilerOptions.configureJsDefaultOptions() } } } } - private fun KotlinJsCompilerOptions.configureOptions() { - moduleKind.set(JsModuleKind.MODULE_UMD) - sourceMap.set(true) - sourceMapEmbedSources.set(JsSourceMapEmbedMode.SOURCE_MAP_SOURCE_CONTENT_NEVER) - } - override fun defineConfigurationsForTarget(target: KotlinJsIrTarget) { super.defineConfigurationsForTarget(target) @@ -134,4 +116,12 @@ open class KotlinJsIrTargetConfigurator : attributes.attribute(KotlinPlatformType.attribute, KotlinPlatformType.common) } } + + internal companion object { + internal fun KotlinJsCompilerOptions.configureJsDefaultOptions() { + moduleKind.set(JsModuleKind.MODULE_UMD) + sourceMap.set(true) + sourceMapEmbedSources.set(JsSourceMapEmbedMode.SOURCE_MAP_SOURCE_CONTENT_NEVER) + } + } } 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 87622185b5b..96b81b3ab3e 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 @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.gradle.unitTests import org.gradle.api.Project +import org.jetbrains.kotlin.gradle.dsl.KotlinJsCompilerOptions import org.jetbrains.kotlin.gradle.dsl.KotlinNativeCompilerOptions import org.jetbrains.kotlin.gradle.dsl.multiplatformExtension import org.jetbrains.kotlin.gradle.tasks.KotlinCompilationTask @@ -74,7 +75,56 @@ class ProjectCompilerOptionsTests { assertEquals(false, project.kotlinNativeTask("compileKotlinLinuxX64").compilerOptions.progressiveMode.get()) } + @Test + fun jsTargetCompilerOptionsDsl() { + val project = buildProjectWithMPP { + with(multiplatformExtension) { + js { + compilerOptions { + suppressWarnings.set(true) + } + } + + applyDefaultHierarchyTemplate() + } + } + + project.evaluate() + + assertEquals(true, project.kotlinJsTask("compileKotlinJs").compilerOptions.suppressWarnings.get()) + assertEquals(true, project.kotlinJsTask("compileTestKotlinJs").compilerOptions.suppressWarnings.get()) + } + + @Test + fun jsTaskOptionsOverridesTargetOptions() { + val project = buildProjectWithMPP { + tasks.withType>().configureEach { + if (it.name == "compileKotlinJs") { + it.compilerOptions.suppressWarnings.set(false) + } + } + + with(multiplatformExtension) { + js { + compilerOptions { + suppressWarnings.set(true) + } + } + + applyDefaultHierarchyTemplate() + } + } + + project.evaluate() + + assertEquals(false, project.kotlinJsTask("compileKotlinJs").compilerOptions.suppressWarnings.get()) + } + private fun Project.kotlinNativeTask(name: String): KotlinCompilationTask = tasks .named>(name) .get() + + private fun Project.kotlinJsTask(name: String): KotlinCompilationTask = tasks + .named>(name) + .get() } \ No newline at end of file