diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/NewMultiplatformIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/NewMultiplatformIT.kt index 7b7e3dc801c..b877b1cf9ca 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/NewMultiplatformIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/NewMultiplatformIT.kt @@ -78,6 +78,13 @@ class NewMultiplatformIT : BaseGradleIT() { JsMode.IR ) + @Test + fun testLibAndAppJsMixed() = doTestLibAndApp( + "sample-lib", + "sample-app", + JsMode.MIXED + ) + @Test fun testLibAndAppWithGradleKotlinDsl() = doTestLibAndApp( "sample-lib-gradle-kotlin-dsl", @@ -92,6 +99,13 @@ class NewMultiplatformIT : BaseGradleIT() { JsMode.IR ) + @Test + fun testLibAndAppWithGradleKotlinDslJsMixed() = doTestLibAndApp( + "sample-lib-gradle-kotlin-dsl", + "sample-app-gradle-kotlin-dsl", + JsMode.MIXED + ) + private fun doTestLibAndApp( libProjectName: String, appProjectName: String, @@ -235,6 +249,23 @@ class NewMultiplatformIT : BaseGradleIT() { assertTasksExecuted(":resolveRuntimeDependencies") // KT-26301 } + if (jsMode == JsMode.MIXED) { + listOf( + JsMode.LEGACY, + JsMode.IR + ).forEach { + build( + "assemble", + "resolveRuntimeDependencies", + "--rerun-tasks", + options = defaultBuildOptions().copy(jsMode = it) + ) { + checkAppBuild() + assertTasksExecuted(":resolveRuntimeDependencies") // KT-26301 + } + } + } + // Now run again with a project dependency instead of a module one: libProject.projectDir.copyRecursively(projectDir.resolve(libProject.projectDir.name)) gradleSettingsScript().appendText("\ninclude(\"${libProject.projectDir.name}\")") diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinTargetConfigurator.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinTargetConfigurator.kt index 51d7b067317..d24c599e32f 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinTargetConfigurator.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinTargetConfigurator.kt @@ -30,6 +30,7 @@ import org.jetbrains.kotlin.gradle.dsl.kotlinExtension import org.jetbrains.kotlin.gradle.plugin.mpp.* import org.jetbrains.kotlin.gradle.targets.js.KotlinJsTarget import org.jetbrains.kotlin.gradle.targets.js.KotlinJsTarget.Companion.IR +import org.jetbrains.kotlin.gradle.targets.js.KotlinJsTarget.Companion.LEGACY import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrTarget import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName import java.util.concurrent.Callable @@ -448,6 +449,10 @@ internal fun Project.usageByName(usageName: String): Usage = fun Configuration.usesPlatformOf(target: KotlinTarget): Configuration { attributes.attribute(KotlinPlatformType.attribute, target.platformType) + if (target is KotlinJsTarget) { + attributes.attribute(KotlinJsTarget.jsModeAttribute, LEGACY) + } + if (target is KotlinJsIrTarget) { attributes.attribute(KotlinJsTarget.jsModeAttribute, IR) } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinMultiplatformPlugin.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinMultiplatformPlugin.kt index acd7af85a97..ab84a63002d 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinMultiplatformPlugin.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinMultiplatformPlugin.kt @@ -159,12 +159,12 @@ class KotlinMultiplatformPlugin( add(KotlinJvmTargetPreset(project, kotlinPluginVersion)) when (propertiesProvider.jsMode) { JsMode.LEGACY -> add(KotlinJsTargetPreset(project, kotlinPluginVersion, null)) - JsMode.IR -> add(KotlinJsIrTargetPreset(project, kotlinPluginVersion)) + JsMode.IR -> add(KotlinJsIrTargetPreset(project, kotlinPluginVersion, false)) JsMode.MIXED -> add( KotlinJsTargetPreset( project, kotlinPluginVersion, - KotlinJsIrTargetPreset(project, kotlinPluginVersion) + KotlinJsIrTargetPreset(project, kotlinPluginVersion, true) ) ) } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/kotlinTargetPresets.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/kotlinTargetPresets.kt index 7e0f24fce2e..a600bdbd24e 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/kotlinTargetPresets.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/kotlinTargetPresets.kt @@ -21,10 +21,10 @@ abstract class KotlinOnlyTargetPreset, T : KotlinCompila protected open fun provideTargetDisambiguationClassifier(target: KotlinOnlyTarget): String? = target.targetName - abstract protected fun instantiateTarget(): R + abstract protected fun instantiateTarget(name: String): R override fun createTarget(name: String): R { - val result = instantiateTarget().apply { + val result = instantiateTarget(name).apply { targetName = name disambiguationClassifier = provideTargetDisambiguationClassifier(this@apply) preset = this@KotlinOnlyTargetPreset diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsPlugin.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsPlugin.kt index 4214889beb9..50743840687 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsPlugin.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsPlugin.kt @@ -31,7 +31,9 @@ open class KotlinJsPlugin( val kotlinExtension = project.kotlinExtension as KotlinJsProjectExtension configureDefaultVersionsResolutionStrategy(project, kotlinPluginVersion) - val irPreset = if (mixedMode) KotlinJsIrSingleTargetPreset(project, kotlinPluginVersion) else null + val irPreset = if (mixedMode) + KotlinJsIrSingleTargetPreset(project, kotlinPluginVersion, mixedMode) + else null val target = KotlinJsSingleTargetPreset(project, kotlinPluginVersion, irPreset).createTarget("Js") diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsTarget.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsTarget.kt index 7b1be46e019..89e14dcdfc7 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsTarget.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsTarget.kt @@ -191,6 +191,7 @@ constructor( ) const val IR = "ir" + const val LEGACY = "legacy" fun setupAttributesMatchingStrategy(attributesSchema: AttributesSchema) { attributesSchema.attribute(jsModeAttribute) diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsTargetPreset.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsTargetPreset.kt index c695db61ae6..57deedfe71c 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsTargetPreset.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsTargetPreset.kt @@ -12,6 +12,7 @@ import org.gradle.api.Project import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType import org.jetbrains.kotlin.gradle.targets.js.KotlinJsTarget import org.jetbrains.kotlin.gradle.targets.js.KotlinJsTargetConfigurator +import org.jetbrains.kotlin.gradle.targets.js.ir.* import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrSingleTargetPreset import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrTargetConfigurator import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrTargetPreset @@ -27,16 +28,13 @@ open class KotlinJsTargetPreset( override val platformType: KotlinPlatformType get() = KotlinPlatformType.js - override fun instantiateTarget(): KotlinJsTarget { - - val irTarget = irPreset?.createTarget("JsIr") - + override fun instantiateTarget(name: String): KotlinJsTarget { return project.objects.newInstance( KotlinJsTarget::class.java, project, platformType ).apply { - this.irTarget = irTarget + this.irTarget = irPreset?.createTarget("$name$IR_TARGET_SUFFIX") } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrCompilation.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrCompilation.kt index b1346c42c20..83a29da20bc 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrCompilation.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrCompilation.kt @@ -43,4 +43,16 @@ class KotlinJsIrCompilation( super.addSourcesToCompileTask(sourceSet, addAsCommonSources) allSources.add(sourceSet.kotlin) } + + override val defaultSourceSetName: String + get() { + return lowerCamelCaseName( + if ((target as KotlinJsIrTarget).mixedMode) + target.disambiguationClassifier + ?.removeSuffix(IR_TARGET_SUFFIX) + else + target.disambiguationClassifier, + compilationName + ) + } } \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrPlugin.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrPlugin.kt index a68d0984959..8e6eccff227 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrPlugin.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrPlugin.kt @@ -28,7 +28,7 @@ open class KotlinJsIrPlugin( val kotlinExtension = project.kotlinExtension as KotlinJsIrProjectExtension configureDefaultVersionsResolutionStrategy(project, kotlinPluginVersion) - val target = KotlinJsIrSingleTargetPreset(project, kotlinPluginVersion).createTarget("Js") + val target = KotlinJsIrSingleTargetPreset(project, kotlinPluginVersion, false).createTarget("js") kotlinExtension.target = target diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrTarget.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrTarget.kt index 6c03bf728fa..c5355413701 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrTarget.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrTarget.kt @@ -25,7 +25,13 @@ import org.jetbrains.kotlin.gradle.testing.testTaskName import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName import javax.inject.Inject -open class KotlinJsIrTarget @Inject constructor(project: Project, platformType: KotlinPlatformType) : +open class KotlinJsIrTarget +@Inject +constructor( + project: Project, + platformType: KotlinPlatformType, + internal val mixedMode: Boolean +) : KotlinOnlyTarget(project, platformType), KotlinTargetWithTests, KotlinJsTargetDsl, diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrTargetPreset.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrTargetPreset.kt index 2502def556b..d0395d81b0e 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrTargetPreset.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrTargetPreset.kt @@ -6,15 +6,18 @@ package org.jetbrains.kotlin.gradle.targets.js.ir import org.gradle.api.Project +import org.jetbrains.kotlin.gradle.plugin.JsMode import org.jetbrains.kotlin.gradle.plugin.KotlinOnlyTargetConfigurator import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType +import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinCompilationFactory import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinOnlyTarget import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinOnlyTargetPreset open class KotlinJsIrTargetPreset( project: Project, - kotlinPluginVersion: String + kotlinPluginVersion: String, + private val mixedMode: Boolean ) : KotlinOnlyTargetPreset( project, kotlinPluginVersion @@ -22,8 +25,8 @@ open class KotlinJsIrTargetPreset( override val platformType: KotlinPlatformType get() = KotlinPlatformType.js - override fun instantiateTarget(): KotlinJsIrTarget { - return project.objects.newInstance(KotlinJsIrTarget::class.java, project, platformType) + override fun instantiateTarget(name: String): KotlinJsIrTarget { + return project.objects.newInstance(KotlinJsIrTarget::class.java, project, platformType, mixedMode) } override fun createKotlinTargetConfigurator(): KotlinOnlyTargetConfigurator = @@ -44,13 +47,16 @@ open class KotlinJsIrTargetPreset( class KotlinJsIrSingleTargetPreset( project: Project, - kotlinPluginVersion: String + kotlinPluginVersion: String, + mixedMode: Boolean ) : - KotlinJsIrTargetPreset(project, kotlinPluginVersion) { + KotlinJsIrTargetPreset(project, kotlinPluginVersion, mixedMode) { // 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? = null override fun createKotlinTargetConfigurator(): KotlinOnlyTargetConfigurator = KotlinJsIrTargetConfigurator(kotlinPluginVersion) -} \ No newline at end of file +} + +const val IR_TARGET_SUFFIX = "Ir" \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/jvm/KotlinJvmTargetPreset.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/jvm/KotlinJvmTargetPreset.kt index e330d3afa8c..0139f4589a3 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/jvm/KotlinJvmTargetPreset.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/jvm/KotlinJvmTargetPreset.kt @@ -18,7 +18,7 @@ class KotlinJvmTargetPreset( project, kotlinPluginVersion ) { - override fun instantiateTarget(): KotlinJvmTarget { + override fun instantiateTarget(name: String): KotlinJvmTarget { return project.objects.newInstance(KotlinJvmTarget::class.java, project) } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/metadata/KotlinMetadataTargetPreset.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/metadata/KotlinMetadataTargetPreset.kt index f15d3cfdb0a..f9bd88deeeb 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/metadata/KotlinMetadataTargetPreset.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/metadata/KotlinMetadataTargetPreset.kt @@ -44,7 +44,7 @@ class KotlinMetadataTargetPreset( override fun createKotlinTargetConfigurator(): KotlinOnlyTargetConfigurator, KotlinMetadataTarget> = KotlinMetadataTargetConfigurator(kotlinPluginVersion) - override fun instantiateTarget(): KotlinMetadataTarget { + override fun instantiateTarget(name: String): KotlinMetadataTarget { return project.objects.newInstance(KotlinMetadataTarget::class.java, project) }