From fd93654c4fc97d7a0c1e352efa2b6459fc990d4c Mon Sep 17 00:00:00 2001 From: Ilya Goncharov Date: Mon, 20 Jan 2020 14:18:44 +0300 Subject: [PATCH] [Gradle, JS] Inject ir's classes into legacy for mixed mode --- .../gradle/plugin/KotlinPluginWrapper.kt | 12 ++--- .../plugin/mpp/KotlinMultiplatformPlugin.kt | 15 +++++- .../targets/js/KotlinJsCompilationFactory.kt | 4 +- .../gradle/targets/js/KotlinJsPlugin.kt | 8 +++- .../gradle/targets/js/KotlinJsTarget.kt | 15 ++++-- .../gradle/targets/js/KotlinJsTargetPreset.kt | 47 ++++++++++++++++--- 6 files changed, 78 insertions(+), 23 deletions(-) diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPluginWrapper.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPluginWrapper.kt index e92304d7158..f44b24f219d 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPluginWrapper.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPluginWrapper.kt @@ -166,8 +166,8 @@ open class KotlinJsPluginWrapper @Inject constructor( return when (propertiesProvider.jsMode) { JsMode.IR -> KotlinJsIrPlugin(kotlinPluginVersion) - JsMode.LEGACY -> KotlinJsPlugin(kotlinPluginVersion) - JsMode.MIXED -> KotlinJsPlugin(kotlinPluginVersion) + JsMode.LEGACY -> KotlinJsPlugin(kotlinPluginVersion, false) + JsMode.MIXED -> KotlinJsPlugin(kotlinPluginVersion, true) } } @@ -176,11 +176,9 @@ open class KotlinJsPluginWrapper @Inject constructor( override fun defineExtension(project: Project) { val propertiesProvider = PropertiesProvider(project) - when (propertiesProvider.jsMode) { - JsMode.IR -> projectExtensionClass = KotlinJsIrProjectExtension::class - JsMode.LEGACY -> projectExtensionClass = KotlinJsProjectExtension::class - JsMode.MIXED -> { - } //TODO MIXED MODE + projectExtensionClass = when (propertiesProvider.jsMode) { + JsMode.IR -> KotlinJsIrProjectExtension::class + JsMode.LEGACY, JsMode.MIXED -> KotlinJsProjectExtension::class } } 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 a892c502854..acd7af85a97 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 @@ -153,10 +153,21 @@ class KotlinMultiplatformPlugin( } fun setupDefaultPresets(project: Project) { + val propertiesProvider = PropertiesProvider(project) + with(project.multiplatformExtension.presets) { add(KotlinJvmTargetPreset(project, kotlinPluginVersion)) - add(KotlinJsTargetPreset(project, kotlinPluginVersion)) - add(KotlinJsIrTargetPreset(project, kotlinPluginVersion)) + when (propertiesProvider.jsMode) { + JsMode.LEGACY -> add(KotlinJsTargetPreset(project, kotlinPluginVersion, null)) + JsMode.IR -> add(KotlinJsIrTargetPreset(project, kotlinPluginVersion)) + JsMode.MIXED -> add( + KotlinJsTargetPreset( + project, + kotlinPluginVersion, + KotlinJsIrTargetPreset(project, kotlinPluginVersion) + ) + ) + } add(KotlinAndroidTargetPreset(project, kotlinPluginVersion)) add(KotlinJvmWithJavaTargetPreset(project, kotlinPluginVersion)) diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsCompilationFactory.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsCompilationFactory.kt index 7d665e29678..c09ac4da706 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsCompilationFactory.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsCompilationFactory.kt @@ -7,10 +7,12 @@ package org.jetbrains.kotlin.gradle.plugin.mpp import org.gradle.api.Project +import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrCompilation class KotlinJsCompilationFactory( val project: Project, - val target: KotlinOnlyTarget + val target: KotlinOnlyTarget, + val irTarget: KotlinOnlyTarget? ) : KotlinCompilationFactory { override val itemClass: Class get() = KotlinJsCompilation::class.java 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 77be98adb0b..2214a1ca80b 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 @@ -12,10 +12,12 @@ import org.jetbrains.kotlin.gradle.dsl.KotlinJsProjectExtension import org.jetbrains.kotlin.gradle.dsl.kotlinExtension import org.jetbrains.kotlin.gradle.plugin.configureDefaultVersionsResolutionStrategy import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsSingleTargetPreset +import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrSingleTargetPreset import org.jetbrains.kotlin.gradle.utils.checkGradleCompatibility open class KotlinJsPlugin( - private val kotlinPluginVersion: String + private val kotlinPluginVersion: String, + private val mixedMode: Boolean ) : Plugin { override fun apply(project: Project) { @@ -29,7 +31,9 @@ open class KotlinJsPlugin( val kotlinExtension = project.kotlinExtension as KotlinJsProjectExtension configureDefaultVersionsResolutionStrategy(project, kotlinPluginVersion) - val target = KotlinJsSingleTargetPreset(project, kotlinPluginVersion).createTarget("Js") + val irPrest = if (mixedMode) KotlinJsIrSingleTargetPreset(project, kotlinPluginVersion) else null + + val target = KotlinJsSingleTargetPreset(project, kotlinPluginVersion, irPrest).createTarget("Js") kotlinExtension.target = target 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 d08f63992a5..f66c47ed645 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 @@ -8,13 +8,15 @@ package org.jetbrains.kotlin.gradle.targets.js import org.gradle.api.NamedDomainObjectContainer import org.gradle.api.Project import org.gradle.api.tasks.TaskProvider -import org.jetbrains.kotlin.gradle.plugin.* import org.jetbrains.kotlin.gradle.plugin.AbstractKotlinTargetConfigurator.Companion.runTaskNameSuffix +import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType +import org.jetbrains.kotlin.gradle.plugin.KotlinTargetWithTests import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinOnlyTarget import org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinJsBrowserDsl import org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinJsNodeDsl import org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinJsTargetDsl +import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrTarget import org.jetbrains.kotlin.gradle.targets.js.subtargets.KotlinBrowserJs import org.jetbrains.kotlin.gradle.targets.js.subtargets.KotlinNodeJs import org.jetbrains.kotlin.gradle.tasks.locateTask @@ -23,11 +25,16 @@ import org.jetbrains.kotlin.gradle.testing.testTaskName import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName import javax.inject.Inject -open class KotlinJsTarget @Inject constructor(project: Project, platformType: KotlinPlatformType) : +open class KotlinJsTarget +@Inject +constructor( + project: Project, + platformType: KotlinPlatformType, + val irTarget: KotlinJsIrTarget? +) : KotlinOnlyTarget(project, platformType), KotlinTargetWithTests, - KotlinJsTargetDsl -{ + KotlinJsTargetDsl { override lateinit var testRuns: NamedDomainObjectContainer internal set 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 dc3197b9db9..d6cf08365b0 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,10 +12,14 @@ 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.KotlinJsIrSingleTargetPreset +import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrTarget +import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrTargetPreset open class KotlinJsTargetPreset( project: Project, - kotlinPluginVersion: String + kotlinPluginVersion: String, + irPreset: KotlinJsIrTargetPreset? ) : KotlinOnlyTargetPreset( project, kotlinPluginVersion @@ -24,15 +28,40 @@ open class KotlinJsTargetPreset( get() = KotlinPlatformType.js override fun instantiateTarget(): KotlinJsTarget { - return project.objects.newInstance(KotlinJsTarget::class.java, project, platformType) + + val irTarget = KotlinJsIrTarget(project, platformType) + + return project.objects.newInstance( + KotlinJsTarget::class.java, + project, + platformType, + irTarget + ) + } + + override fun createTarget(name: String): KotlinJsTarget { + val result = instantiateTarget().apply { + targetName = name + disambiguationClassifier = provideTargetDisambiguationClassifier(this) + preset = this@KotlinJsTargetPreset + + val compilationFactory = createCompilationFactory(this) + compilations = project.container(compilationFactory.itemClass, compilationFactory) + } + + createKotlinTargetConfigurator().configureTarget(result) + + return result } override fun createKotlinTargetConfigurator() = KotlinJsTargetConfigurator(kotlinPluginVersion) override fun getName(): String = PRESET_NAME - override fun createCompilationFactory(forTarget: KotlinOnlyTarget) = - KotlinJsCompilationFactory(project, forTarget) + override fun createCompilationFactory(forTarget: KotlinOnlyTarget): KotlinJsCompilationFactory { + forTarget as KotlinJsTarget + return KotlinJsCompilationFactory(project, forTarget, forTarget.irTarget) + } companion object { const val PRESET_NAME = "js" @@ -41,9 +70,13 @@ open class KotlinJsTargetPreset( class KotlinJsSingleTargetPreset( project: Project, - kotlinPluginVersion: String -) : - KotlinJsTargetPreset(project, kotlinPluginVersion) { + kotlinPluginVersion: String, + irPreset: KotlinJsIrSingleTargetPreset? +) : KotlinJsTargetPreset( + project, + kotlinPluginVersion, + irPreset +) { // 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