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 f7947e57f42..b5eb38fac8a 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 @@ -469,7 +469,7 @@ class Kotlin2JsGradlePluginIT : AbstractKotlin2JsGradlePluginIT(false) { val baseBuildscript = baseSubproject.buildGradleKts val libBuildscript = libSubproject.buildGradleKts baseBuildscript.modify { - it.replace("js(\"both\")", "js(\"both\") { (this as org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrTarget).legacyTarget?.moduleName = \"base2\" }") + it.replace("js(\"both\")", "js(\"both\") { moduleName = \"base2\" }") } libBuildscript.modify { it.replace("implementation(project(\":base\"))", "implementation(files(\"${normalizePath(originalBaseJar.toString())}\"))") diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-js-dce/libraryProject/build.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-js-dce/libraryProject/build.gradle index e5ec156ac80..0fce16ee9ba 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-js-dce/libraryProject/build.gradle +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-js-dce/libraryProject/build.gradle @@ -15,7 +15,7 @@ repositories { mavenCentral() } -kotlin.targets.fromPreset(kotlin.presets.jsLegacy, 'nodeJs') { +kotlin.targets.fromPreset(kotlin.presets.js, 'nodeJs') { nodejs() } diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-js-dce/mainProject/build.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-js-dce/mainProject/build.gradle index e85afa6cb60..a19db0bf1c0 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-js-dce/mainProject/build.gradle +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-js-dce/mainProject/build.gradle @@ -15,7 +15,7 @@ repositories { mavenCentral() } -kotlin.targets.fromPreset(kotlin.presets.jsLegacy, 'browser') { +kotlin.targets.fromPreset(kotlin.presets.js, 'browser') { browser() } diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-old-style-app/app-common/build.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-old-style-app/app-common/build.gradle index 7971645a92d..6f0d0f42837 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-old-style-app/app-common/build.gradle +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-lib-and-app/sample-old-style-app/app-common/build.gradle @@ -1,5 +1,5 @@ apply plugin: 'kotlin-platform-common' dependencies { - implementation 'com.example:sample-lib:1.0' + implementation 'com.example:sample-lib:1.0' } \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinProjectExtension.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinProjectExtension.kt index 64d68b53ec6..13dc9d42045 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinProjectExtension.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinProjectExtension.kt @@ -299,25 +299,25 @@ abstract class KotlinJsProjectExtension(project: Project) : val target: KotlinJsTargetDsl = when (compilerOrDefault) { KotlinJsCompilerType.LEGACY -> legacyPreset .also { - it.mixedMode = false + it.irPreset = null } .createTarget("js") KotlinJsCompilerType.IR -> irPreset .also { - it.legacyPreset = null + it.mixedMode = false } .createTarget("js") - KotlinJsCompilerType.BOTH -> irPreset + KotlinJsCompilerType.BOTH -> legacyPreset .also { - legacyPreset.mixedMode = true - it.legacyPreset = legacyPreset + irPreset.mixedMode = true + it.irPreset = irPreset } .createTarget( lowerCamelCaseName( "js", - IR.lowerName + LEGACY.lowerName ) ) } diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinTargetContainerWithJsPresetFunctions.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinTargetContainerWithJsPresetFunctions.kt index 9b3728c0b96..21352334551 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinTargetContainerWithJsPresetFunctions.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinTargetContainerWithJsPresetFunctions.kt @@ -106,7 +106,7 @@ private fun KotlinTargetContainerWithJsPresetFunctions.jsInternal( presets.getByName( lowerCamelCaseName( "js", - if (compilerOrDefault == KotlinJsCompilerType.IR) null else compilerOrDefault.lowerName + if (compilerOrDefault == KotlinJsCompilerType.LEGACY) null else compilerOrDefault.lowerName ) ) as KotlinTargetPreset, configure @@ -116,8 +116,8 @@ private fun KotlinTargetContainerWithJsPresetFunctions.jsInternal( } // Try to find existing target with exact name -// and removed suffix IR in case when current compiler is BOTH -// and with append suffix IR in case when compiler for found target is not BOTH +// and with append suffix Legacy in case when compiler for found target is BOTH, +// and removed suffix Legacy in case when current compiler is BOTH private fun KotlinTargetContainerWithJsPresetFunctions.getExistingTarget( name: String, compiler: KotlinJsCompilerType? @@ -142,13 +142,13 @@ private fun KotlinTargetContainerWithJsPresetFunctions.getExistingTarget( val targetNameCandidate = getTargetName(name, compiler) return targets.findByName(targetNameCandidate) as KotlinJsTargetDsl? - ?: getPreviousTarget(targetNameCandidate.removeJsCompilerSuffix(KotlinJsCompilerType.IR), true) - ?: getPreviousTarget(lowerCamelCaseName(targetNameCandidate, KotlinJsCompilerType.IR.lowerName), false) + ?: getPreviousTarget(targetNameCandidate.removeJsCompilerSuffix(KotlinJsCompilerType.LEGACY), true) + ?: getPreviousTarget(lowerCamelCaseName(targetNameCandidate, KotlinJsCompilerType.LEGACY.lowerName), false) } private fun getTargetName(name: String, compiler: KotlinJsCompilerType?): String { return lowerCamelCaseName( name, - if (compiler == KotlinJsCompilerType.BOTH) KotlinJsCompilerType.IR.lowerName else null + if (compiler == KotlinJsCompilerType.BOTH) KotlinJsCompilerType.LEGACY.lowerName else null ) } diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinMultiplatformPlugin.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinMultiplatformPlugin.kt index f0c3107c935..37cb70152ad 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinMultiplatformPlugin.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinMultiplatformPlugin.kt @@ -141,11 +141,11 @@ class KotlinMultiplatformPlugin : Plugin { fun setupDefaultPresets(project: Project) { with(project.multiplatformExtension.presets) { add(KotlinJvmTargetPreset(project)) - add(KotlinJsTargetPreset(project).apply { mixedMode = false }) - add(KotlinJsIrTargetPreset(project)) + add(KotlinJsTargetPreset(project).apply { irPreset = null }) + add(KotlinJsIrTargetPreset(project).apply { mixedMode = false }) add( - KotlinJsIrTargetPreset(project).apply { - legacyPreset = KotlinJsTargetPreset(project).apply { mixedMode = true } + KotlinJsTargetPreset(project).apply { + irPreset = KotlinJsIrTargetPreset(project).apply { mixedMode = true } } ) add(KotlinWasmTargetPreset(project)) diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/sources/KotlinSourceSetFactory.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/sources/KotlinSourceSetFactory.kt index 84b90b3694c..b69c72f3e1d 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/sources/KotlinSourceSetFactory.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/sources/KotlinSourceSetFactory.kt @@ -136,11 +136,12 @@ internal class DefaultKotlinSourceSetFactory( if (sourceSet in notOnlyJsSourceSets) return fun chooseCompilerAttribute(target: KotlinTarget): KotlinJsCompilerAttribute { - if (target is KotlinJsTarget) { - return KotlinJsCompilerAttribute.legacy + if (target is KotlinJsIrTarget) { + return KotlinJsCompilerAttribute.ir } - return KotlinJsCompilerAttribute.ir + target as KotlinJsTarget + return if (target.irTarget != null) KotlinJsCompilerAttribute.ir else KotlinJsCompilerAttribute.legacy } project.kotlinExtension.targets diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsCompilation.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsCompilation.kt index 75d3a1de5b9..50117f235b1 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsCompilation.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsCompilation.kt @@ -32,7 +32,7 @@ abstract class KotlinJsCompilation @Inject internal constructor( final override val compilerOptions: HasCompilerOptions get() = super.compilerOptions as HasCompilerOptions - val binaries: KotlinJsBinaryContainer = + internal val binaries: KotlinJsBinaryContainer = target.project.objects.newInstance( KotlinJsBinaryContainer::class.java, target, diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsCompilationFactory.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsCompilationFactory.kt index ac833b3b8e0..7506e2c6c7e 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsCompilationFactory.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsCompilationFactory.kt @@ -16,7 +16,7 @@ class KotlinJsCompilationFactory( get() = KotlinJsCompilation::class.java override fun defaultSourceSetName(compilationName: String): String { - val classifier = if (target is KotlinJsTarget && target.mixedMode) + val classifier = if (target is KotlinJsTarget && target.irTarget != null) target.disambiguationClassifierInPlatform else target.disambiguationClassifier 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 fec5a602de7..7f0e5d2b44b 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 @@ -34,8 +34,7 @@ abstract class KotlinJsTarget @Inject constructor( project: Project, - platformType: KotlinPlatformType, - internal val mixedMode: Boolean + platformType: KotlinPlatformType ) : KotlinTargetWithBinaries(project, platformType), KotlinTargetWithTests, @@ -54,24 +53,46 @@ constructor( internal val commonFakeApiElementsConfigurationName: String get() = lowerCamelCaseName( - if (mixedMode) - disambiguationClassifierInPlatform - else - disambiguationClassifier, + irTarget?.let { + this.disambiguationClassifierInPlatform + } ?: disambiguationClassifier, "commonFakeApiElements" ) val disambiguationClassifierInPlatform: String? - get() = if (mixedMode) { - disambiguationClassifier?.removeJsCompilerSuffix(KotlinJsCompilerType.LEGACY) + get() = if (irTarget != null) { + disambiguationClassifier?.removeJsCompilerSuffix(LEGACY) } else { disambiguationClassifier } + override val kotlinComponents: Set by lazy { + if (irTarget == null) + super.kotlinComponents + else { + val mainCompilation = compilations.getByName(MAIN_COMPILATION_NAME) + val usageContexts = createUsageContexts(mainCompilation) + + irTarget!!.createUsageContexts(irTarget!!.compilations.getByName(MAIN_COMPILATION_NAME)) + + val componentName = + if (project.kotlinExtension is KotlinMultiplatformExtension) + irTarget?.let { targetName.removeJsCompilerSuffix(LEGACY) } ?: targetName + else PRIMARY_SINGLE_COMPONENT_NAME + + val result = createKotlinVariant(componentName, mainCompilation, usageContexts) + + result.sourcesArtifacts = setOf( + sourcesJarArtifact(mainCompilation, componentName, dashSeparatedName(targetName.toLowerCase())) + ) + + setOf(result) + } + } + override fun createUsageContexts(producingCompilation: KotlinCompilation<*>): Set { val usageContexts = super.createUsageContexts(producingCompilation) - if (isMpp!! || mixedMode) return usageContexts + if (isMpp!!) return usageContexts return usageContexts + DefaultKotlinUsageContext( @@ -82,12 +103,27 @@ constructor( ) } + override fun createKotlinVariant( + componentName: String, + compilation: KotlinCompilation<*>, + usageContexts: Set + ): KotlinVariant { + return super.createKotlinVariant(componentName, compilation, usageContexts).apply { + irTarget?.let { + artifactTargetName = targetName.removeJsCompilerSuffix(LEGACY) + } + } + } + override val binaries: KotlinJsBinaryContainer get() = compilations.withType(KotlinJsCompilation::class.java) .named(MAIN_COMPILATION_NAME) .map { it.binaries } .get() + var irTarget: KotlinJsIrTarget? = null + internal set + open var isMpp: Boolean? = null internal set @@ -108,7 +144,7 @@ constructor( project.objects.newInstance(KotlinBrowserJs::class.java, this).also { it.configure() - if (propertiesProvider.jsGenerateExecutableDefault && !mixedMode) { + if (propertiesProvider.jsGenerateExecutableDefault && irTarget == null) { binaries.executable() } @@ -128,6 +164,7 @@ constructor( override fun browser(body: KotlinJsBrowserDsl.() -> Unit) { body(browser) + irTarget?.browser(body) } //node.js @@ -135,7 +172,7 @@ constructor( project.objects.newInstance(KotlinNodeJs::class.java, this).also { it.configure() - if (propertiesProvider.jsGenerateExecutableDefault && !mixedMode) { + if (propertiesProvider.jsGenerateExecutableDefault && irTarget == null) { binaries.executable() } @@ -156,6 +193,7 @@ constructor( override fun nodejs(body: KotlinJsNodeDsl.() -> Unit) { body(nodejs) + irTarget?.nodejs(body) } override fun whenBrowserConfigured(body: KotlinJsBrowserDsl.() -> Unit) { @@ -182,6 +220,7 @@ constructor( sourceMapEmbedSources = null } } + irTarget?.useCommonJs() } override fun useEsModules() { diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsTargetPreset.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsTargetPreset.kt index 3839e67a8ca..fedf4682937 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsTargetPreset.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsTargetPreset.kt @@ -16,7 +16,6 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.mapTargetCompilationsToKpmVar import org.jetbrains.kotlin.gradle.plugin.statistics.KotlinBuildStatsService import org.jetbrains.kotlin.gradle.targets.js.KotlinJsTarget import org.jetbrains.kotlin.gradle.targets.js.KotlinJsTargetConfigurator -import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrTarget import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrTargetPreset import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName import org.jetbrains.kotlin.gradle.utils.runProjectConfigurationHealthCheckWhenEvaluated @@ -27,7 +26,8 @@ open class KotlinJsTargetPreset( ) : KotlinOnlyTargetPreset( project ) { - var mixedMode: Boolean? = null + var irPreset: KotlinJsIrTargetPreset? = null + internal set open val isMpp: Boolean get() = true @@ -35,20 +35,33 @@ open class KotlinJsTargetPreset( override val platformType: KotlinPlatformType get() = KotlinPlatformType.js + override fun useDisambiguationClassifierAsSourceSetNamePrefix() = irPreset == null + + override fun overrideDisambiguationClassifierOnIdeImport(name: String): String? = + irPreset?.let { + name.removeJsCompilerSuffix(KotlinJsCompilerType.LEGACY) + } + override fun instantiateTarget(name: String): KotlinJsTarget { return project.objects.newInstance( KotlinJsTarget::class.java, project, - platformType, - mixedMode + platformType ).apply { + this.irTarget = irPreset?.createTarget( + lowerCamelCaseName( + name.removeJsCompilerSuffix(KotlinJsCompilerType.LEGACY), + KotlinJsCompilerType.IR.lowerName + ) + )?.also { + it.legacyTarget = this + } this.isMpp = this@KotlinJsTargetPreset.isMpp - if (!mixedMode) { - project.runProjectConfigurationHealthCheckWhenEvaluated { - if (!isBrowserConfigured && !isNodejsConfigured) { - project.logger.warn( - """ + project.runProjectConfigurationHealthCheckWhenEvaluated { + if (!isBrowserConfigured && !isNodejsConfigured) { + project.logger.warn( + """ Please choose a JavaScript environment to build distributions and run tests. Not choosing any of them will be an error in the future releases. kotlin { @@ -59,23 +72,37 @@ open class KotlinJsTargetPreset( } } """.trimIndent() - ) - } - val buildStatsService = KotlinBuildStatsService.getInstance() - when { - isBrowserConfigured && isNodejsConfigured -> buildStatsService?.report(StringMetrics.JS_TARGET_MODE, "both") - isBrowserConfigured -> buildStatsService?.report(StringMetrics.JS_TARGET_MODE, "browser") - isNodejsConfigured -> buildStatsService?.report(StringMetrics.JS_TARGET_MODE, "nodejs") - !isBrowserConfigured && !isNodejsConfigured -> buildStatsService?.report(StringMetrics.JS_TARGET_MODE, "none") - } - Unit + ) } + val buildStatsService = KotlinBuildStatsService.getInstance() + when { + isBrowserConfigured && isNodejsConfigured -> buildStatsService?.report(StringMetrics.JS_TARGET_MODE, "both") + isBrowserConfigured -> buildStatsService?.report(StringMetrics.JS_TARGET_MODE, "browser") + isNodejsConfigured -> buildStatsService?.report(StringMetrics.JS_TARGET_MODE, "nodejs") + !isBrowserConfigured && !isNodejsConfigured -> buildStatsService?.report(StringMetrics.JS_TARGET_MODE, "none") + } + Unit } } } override fun createKotlinTargetConfigurator() = KotlinJsTargetConfigurator() + override fun getName(): String { + return lowerCamelCaseName( + PRESET_NAME, + irPreset?.let { KotlinJsCompilerType.BOTH.lowerName } + ) + } + + override fun createCompilationFactory(forTarget: KotlinJsTarget): KotlinJsCompilationFactory { + return KotlinJsCompilationFactory(forTarget) + } + + companion object { + const val PRESET_NAME = "js" + } + override fun createTarget(name: String): KotlinJsTarget { val result = super.createTarget(name) if (project.hasKpmModel) { @@ -83,19 +110,6 @@ open class KotlinJsTargetPreset( } return result } - - override fun getName(): String = JS_PRESET_NAME - - public override fun createCompilationFactory(forTarget: KotlinJsTarget): KotlinJsCompilationFactory { - return KotlinJsCompilationFactory(forTarget) - } - - companion object { - val JS_PRESET_NAME = lowerCamelCaseName( - "js", - KotlinJsCompilerType.LEGACY.lowerName - ) - } } class KotlinJsSingleTargetPreset( @@ -106,14 +120,15 @@ class KotlinJsSingleTargetPreset( override val isMpp: Boolean get() = false + override fun overrideDisambiguationClassifierOnIdeImport(name: String): String? = + null + // In a Kotlin/JS single-platform project, we don't need any disambiguation suffixes or prefixes in the names: override fun provideTargetDisambiguationClassifier(target: KotlinOnlyTarget): String? = - if (mixedMode!!) { + irPreset?.let { super.provideTargetDisambiguationClassifier(target) ?.removePrefix(target.name.removeJsCompilerSuffix(KotlinJsCompilerType.LEGACY)) ?.decapitalize() - } else { - null } override fun createKotlinTargetConfigurator() = KotlinJsTargetConfigurator() diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsTargets.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsTargets.kt index 82837b455cc..d984bd7b9e5 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsTargets.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsTargets.kt @@ -11,9 +11,9 @@ import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrTarget fun KotlinJsTargetDsl.calculateJsCompilerType(): KotlinJsCompilerType { return when { - this is KotlinJsTarget && !this.mixedMode -> KotlinJsCompilerType.LEGACY - this is KotlinJsIrTarget && this.legacyTarget == null -> KotlinJsCompilerType.IR - this is KotlinJsIrTarget && this.legacyTarget != null -> KotlinJsCompilerType.BOTH + this is KotlinJsTarget && this.irTarget == null -> KotlinJsCompilerType.LEGACY + this is KotlinJsIrTarget && !this.mixedMode -> KotlinJsCompilerType.IR + this is KotlinJsTarget && this.irTarget != null -> KotlinJsCompilerType.BOTH else -> throw IllegalStateException("Unable to find previous Kotlin/JS compiler type for $this") } } \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsBinaryContainer.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsBinaryContainer.kt index 11198da12bf..f3b24385872 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsBinaryContainer.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsBinaryContainer.kt @@ -68,9 +68,6 @@ constructor( compilation: KotlinJsCompilation = defaultCompilation ): List { if (target is KotlinJsIrTarget) { - target.legacyTarget - ?.let { throw IllegalStateException("Can't use `executable()` with 'both' compiler type") } - target.whenBrowserConfigured { (this as KotlinJsIrSubTarget).produceExecutable() } @@ -87,6 +84,9 @@ constructor( } if (target is KotlinJsTarget) { + target.irTarget + ?.let { throw IllegalStateException("Can't use `executable()` with 'both' compiler type") } + target.whenBrowserConfigured { (this as KotlinJsSubTarget).produceExecutable() } 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 9860e3cf16e..77027b3ffb4 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,7 +7,6 @@ package org.jetbrains.kotlin.gradle.targets.js.ir import org.jetbrains.kotlin.gradle.plugin.mpp.JsIrCompilationDetails import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinCompilationFactory -import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation import org.jetbrains.kotlin.gradle.plugin.mpp.getOrCreateDefaultSourceSet import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName @@ -19,7 +18,7 @@ class KotlinJsIrCompilationFactory( override fun defaultSourceSetName(compilationName: String): String { return lowerCamelCaseName( - if (target.legacyTarget != null) + if (target.mixedMode) target.disambiguationClassifierInPlatform else target.disambiguationClassifier, diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrLink.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrLink.kt index 0bf5783039f..77a95218571 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrLink.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrLink.kt @@ -26,7 +26,6 @@ import org.jetbrains.kotlin.gradle.tasks.Kotlin2JsCompile import org.jetbrains.kotlin.gradle.utils.toHexString import org.jetbrains.kotlin.statistics.metrics.BooleanMetrics import org.jetbrains.kotlin.statistics.metrics.StringMetrics -import org.jetbrains.kotlin.utils.tryConstructClassFromStringArgs import java.io.File import java.nio.charset.StandardCharsets import java.security.MessageDigest @@ -95,7 +94,7 @@ abstract class KotlinJsIrLink @Inject constructor( @get:IgnoreEmptyDirectories @get:NormalizeLineEndings @get:InputDirectory - @get:PathSensitive(PathSensitivity.NONE) + @get:PathSensitive(PathSensitivity.RELATIVE) internal abstract val entryModule: DirectoryProperty @get:Internal 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 101b07626bf..f7f316a9d88 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 @@ -11,15 +11,11 @@ import org.gradle.api.Task import org.gradle.api.tasks.Copy import org.gradle.api.tasks.TaskProvider 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.plugin.AbstractKotlinTargetConfigurator.Companion.runTaskNameSuffix import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation.Companion.MAIN_COMPILATION_NAME import org.jetbrains.kotlin.gradle.plugin.mpp.DefaultKotlinUsageContext import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinTargetWithBinaries -import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinVariant -import org.jetbrains.kotlin.gradle.plugin.mpp.PRIMARY_SINGLE_COMPONENT_NAME import org.jetbrains.kotlin.gradle.targets.js.JsAggregatingExecutionSource import org.jetbrains.kotlin.gradle.targets.js.KotlinJsReportAggregatingTestRun import org.jetbrains.kotlin.gradle.targets.js.KotlinJsTarget @@ -30,7 +26,6 @@ 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.dashSeparatedName import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName import org.jetbrains.kotlin.gradle.utils.setProperty import javax.inject.Inject @@ -40,6 +35,7 @@ abstract class KotlinJsIrTarget constructor( project: Project, platformType: KotlinPlatformType, + internal val mixedMode: Boolean ) : KotlinTargetWithBinaries(project, platformType), KotlinTargetWithTests, @@ -65,33 +61,10 @@ constructor( field = value } - override val kotlinComponents: Set by lazy { - if (legacyTarget == null) - super.kotlinComponents - else { - val mainCompilation = compilations.getByName(MAIN_COMPILATION_NAME) - val usageContexts = createUsageContexts(mainCompilation) + - legacyTarget!!.createUsageContexts(legacyTarget!!.compilations.getByName(MAIN_COMPILATION_NAME)) - - val componentName = - if (project.kotlinExtension is KotlinMultiplatformExtension) - legacyTarget?.let { targetName.removeJsCompilerSuffix(KotlinJsCompilerType.IR) } ?: targetName - else PRIMARY_SINGLE_COMPONENT_NAME - - val result = createKotlinVariant(componentName, mainCompilation, usageContexts) - - result.sourcesArtifacts = setOf( - sourcesJarArtifact(mainCompilation, componentName, dashSeparatedName(targetName.toLowerCase())) - ) - - setOf(result) - } - } - override fun createUsageContexts(producingCompilation: KotlinCompilation<*>): Set { val usageContexts = super.createUsageContexts(producingCompilation) - if (isMpp!!) return usageContexts + if (isMpp!! || mixedMode) return usageContexts return usageContexts + DefaultKotlinUsageContext( @@ -102,28 +75,17 @@ constructor( ) } - override fun createKotlinVariant( - componentName: String, - compilation: KotlinCompilation<*>, - usageContexts: Set - ): KotlinVariant { - return super.createKotlinVariant(componentName, compilation, usageContexts).apply { - legacyTarget?.let { - artifactTargetName = targetName.removeJsCompilerSuffix(KotlinJsCompilerType.IR) - } - } - } - internal val commonFakeApiElementsConfigurationName: String get() = lowerCamelCaseName( - legacyTarget?.let { - this.disambiguationClassifierInPlatform - } ?: disambiguationClassifier, + if (mixedMode) + disambiguationClassifierInPlatform + else + disambiguationClassifier, "commonFakeApiElements" ) val disambiguationClassifierInPlatform: String? - get() = if (legacyTarget != null) { + get() = if (mixedMode) { disambiguationClassifier?.removeJsCompilerSuffix(KotlinJsCompilerType.IR) } else { disambiguationClassifier @@ -256,7 +218,6 @@ constructor( override fun browser(body: KotlinJsBrowserDsl.() -> Unit) { body(browser) - legacyTarget?.browser(body) } //node.js @@ -281,7 +242,6 @@ constructor( override fun nodejs(body: KotlinJsNodeDsl.() -> Unit) { body(nodejs) - legacyTarget?.nodejs(body) } //d8 @@ -349,7 +309,6 @@ constructor( } } } - legacyTarget?.useCommonJs() } override fun useEsModules() { diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrTargetPreset.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrTargetPreset.kt index 3e922756103..a1312f5cd27 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrTargetPreset.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrTargetPreset.kt @@ -7,7 +7,9 @@ package org.jetbrains.kotlin.gradle.targets.js.ir import org.gradle.api.Project import org.jetbrains.kotlin.gradle.plugin.* -import org.jetbrains.kotlin.gradle.plugin.mpp.* +import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinCompilationFactory +import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinOnlyTarget +import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinOnlyTargetPreset import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.PublicationRegistrationMode import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.hasKpmModel import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.mapTargetCompilationsToKpmVariants @@ -21,34 +23,21 @@ open class KotlinJsIrTargetPreset( ) : KotlinOnlyTargetPreset( project ) { - internal var legacyPreset: KotlinJsTargetPreset? = null - internal set + internal var mixedMode: Boolean? = null open val isMpp: Boolean get() = true override val platformType: KotlinPlatformType = KotlinPlatformType.js - override fun useDisambiguationClassifierAsSourceSetNamePrefix() = legacyPreset == null - - override fun overrideDisambiguationClassifierOnIdeImport(name: String): String? = - legacyPreset?.let { - name.removeJsCompilerSuffix(KotlinJsCompilerType.IR) - } - override fun instantiateTarget(name: String): KotlinJsIrTarget { - return project.objects.newInstance(KotlinJsIrTarget::class.java, project, platformType).apply { + return project.objects.newInstance(KotlinJsIrTarget::class.java, project, platformType, mixedMode).apply { this.isMpp = this@KotlinJsIrTargetPreset.isMpp - this.legacyTarget = legacyPreset?.createTarget( - lowerCamelCaseName( - name.removeJsCompilerSuffix(KotlinJsCompilerType.IR), - KotlinJsCompilerType.LEGACY.lowerName - ) - ) - project.runProjectConfigurationHealthCheckWhenEvaluated { - if (!isBrowserConfigured && !isNodejsConfigured) { - project.logger.warn( - """ + if (!mixedMode) { + project.runProjectConfigurationHealthCheckWhenEvaluated { + if (!isBrowserConfigured && !isNodejsConfigured) { + project.logger.warn( + """ Please choose a JavaScript environment to build distributions and run tests. Not choosing any of them will be an error in the future releases. kotlin { @@ -59,16 +48,17 @@ open class KotlinJsIrTargetPreset( } } """.trimIndent() - ) + ) + } + val buildStatsService = KotlinBuildStatsService.getInstance() + when { + isBrowserConfigured && isNodejsConfigured -> buildStatsService?.report(StringMetrics.JS_TARGET_MODE, "both") + isBrowserConfigured -> buildStatsService?.report(StringMetrics.JS_TARGET_MODE, "browser") + isNodejsConfigured -> buildStatsService?.report(StringMetrics.JS_TARGET_MODE, "nodejs") + !isBrowserConfigured && !isNodejsConfigured -> buildStatsService?.report(StringMetrics.JS_TARGET_MODE, "none") + } + Unit } - val buildStatsService = KotlinBuildStatsService.getInstance() - when { - isBrowserConfigured && isNodejsConfigured -> buildStatsService?.report(StringMetrics.JS_TARGET_MODE, "both") - isBrowserConfigured -> buildStatsService?.report(StringMetrics.JS_TARGET_MODE, "browser") - isNodejsConfigured -> buildStatsService?.report(StringMetrics.JS_TARGET_MODE, "nodejs") - !isBrowserConfigured && !isNodejsConfigured -> buildStatsService?.report(StringMetrics.JS_TARGET_MODE, "none") - } - Unit } } } @@ -84,19 +74,19 @@ open class KotlinJsIrTargetPreset( return result } - override fun getName(): String = lowerCamelCaseName( - PRESET_NAME, - legacyPreset?.let { KotlinJsCompilerType.BOTH.lowerName } - ) + override fun getName(): String = JS_PRESET_NAME - override fun createCompilationFactory( + //TODO[Ilya Goncharov] remove public morozov + public override fun createCompilationFactory( forTarget: KotlinJsIrTarget - ): KotlinCompilationFactory { - return KotlinJsIrCompilationFactory(forTarget) - } + ): KotlinCompilationFactory = + KotlinJsIrCompilationFactory(forTarget) companion object { - const val PRESET_NAME = "js" + val JS_PRESET_NAME = lowerCamelCaseName( + "js", + KotlinJsCompilerType.IR.lowerName + ) } } @@ -108,16 +98,16 @@ class KotlinJsIrSingleTargetPreset( override val isMpp: Boolean get() = false - override fun overrideDisambiguationClassifierOnIdeImport(name: String): String? = - null - // In a Kotlin/JS single-platform project, we don't need any disambiguation suffixes or prefixes in the names: - override fun provideTargetDisambiguationClassifier(target: KotlinOnlyTarget): String? = - legacyPreset?.let { + override fun provideTargetDisambiguationClassifier(target: KotlinOnlyTarget): String? { + return if (mixedMode!!) { super.provideTargetDisambiguationClassifier(target) ?.removePrefix(target.name.removeJsCompilerSuffix(KotlinJsCompilerType.IR)) ?.decapitalize() + } else { + null } + } override fun createKotlinTargetConfigurator(): KotlinOnlyTargetConfigurator = KotlinJsIrTargetConfigurator() diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinWasmTargetPreset.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinWasmTargetPreset.kt index 9d35a021383..6a44259b629 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinWasmTargetPreset.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinWasmTargetPreset.kt @@ -26,7 +26,7 @@ class KotlinWasmTargetPreset( project.logger.warn("New 'wasm' target is Work-in-Progress and is subject to change without notice.") } - val irTarget = project.objects.newInstance(KotlinJsIrTarget::class.java, project, KotlinPlatformType.wasm) + val irTarget = project.objects.newInstance(KotlinJsIrTarget::class.java, project, KotlinPlatformType.wasm, false) irTarget.isMpp = true project.runProjectConfigurationHealthCheckWhenEvaluated { diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolver/KotlinProjectNpmResolver.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolver/KotlinProjectNpmResolver.kt index 0c4fcf0fb00..ed080536da6 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolver/KotlinProjectNpmResolver.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolver/KotlinProjectNpmResolver.kt @@ -16,7 +16,6 @@ import org.jetbrains.kotlin.gradle.plugin.KotlinTarget import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation import org.jetbrains.kotlin.gradle.plugin.whenEvaluated import org.jetbrains.kotlin.gradle.targets.js.KotlinJsTarget -import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrTarget import org.jetbrains.kotlin.gradle.targets.js.npm.RequiresNpmDependencies import org.jetbrains.kotlin.gradle.targets.js.npm.resolved.KotlinProjectNpmResolution import org.jetbrains.kotlin.gradle.targets.js.testing.KotlinJsTest @@ -104,8 +103,8 @@ internal class KotlinProjectNpmResolver( } // Hack for mixed mode, when target is JS and contain JS-IR - if (target is KotlinJsIrTarget) { - target.legacyTarget?.compilations?.all { compilation -> + if (target is KotlinJsTarget) { + target.irTarget?.compilations?.all { compilation -> if (compilation is KotlinJsCompilation) { addCompilation(compilation) } diff --git a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/ConfigurationsTest.kt b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/ConfigurationsTest.kt index 366c7f77be7..df502b913de 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/ConfigurationsTest.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/ConfigurationsTest.kt @@ -20,7 +20,6 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.targets import org.jetbrains.kotlin.gradle.targets.js.KotlinJsCompilerAttribute import org.jetbrains.kotlin.gradle.targets.js.KotlinJsTarget import org.jetbrains.kotlin.gradle.targets.js.dsl.ExperimentalWasmDsl -import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrTarget import kotlin.test.Test import kotlin.test.assertEquals import kotlin.test.assertNotNull @@ -134,8 +133,8 @@ class ConfigurationsTest : MultiplatformExtensionTest() { val project = buildProjectWithMPP { kotlin { js(BOTH) - targets.withType { - legacyTarget!!.compilations.getByName("main").dependencies { + targets.withType { + irTarget!!.compilations.getByName("main").dependencies { api("test:compilation-dependency") } }