[Gradle, JS] Inject ir's classes into legacy for mixed mode

This commit is contained in:
Ilya Goncharov
2020-01-20 14:18:44 +03:00
parent e6be134f2a
commit fd93654c4f
6 changed files with 78 additions and 23 deletions
@@ -166,8 +166,8 @@ open class KotlinJsPluginWrapper @Inject constructor(
return when (propertiesProvider.jsMode) { return when (propertiesProvider.jsMode) {
JsMode.IR -> KotlinJsIrPlugin(kotlinPluginVersion) JsMode.IR -> KotlinJsIrPlugin(kotlinPluginVersion)
JsMode.LEGACY -> KotlinJsPlugin(kotlinPluginVersion) JsMode.LEGACY -> KotlinJsPlugin(kotlinPluginVersion, false)
JsMode.MIXED -> KotlinJsPlugin(kotlinPluginVersion) JsMode.MIXED -> KotlinJsPlugin(kotlinPluginVersion, true)
} }
} }
@@ -176,11 +176,9 @@ open class KotlinJsPluginWrapper @Inject constructor(
override fun defineExtension(project: Project) { override fun defineExtension(project: Project) {
val propertiesProvider = PropertiesProvider(project) val propertiesProvider = PropertiesProvider(project)
when (propertiesProvider.jsMode) { projectExtensionClass = when (propertiesProvider.jsMode) {
JsMode.IR -> projectExtensionClass = KotlinJsIrProjectExtension::class JsMode.IR -> KotlinJsIrProjectExtension::class
JsMode.LEGACY -> projectExtensionClass = KotlinJsProjectExtension::class JsMode.LEGACY, JsMode.MIXED -> KotlinJsProjectExtension::class
JsMode.MIXED -> {
} //TODO MIXED MODE
} }
} }
@@ -153,10 +153,21 @@ class KotlinMultiplatformPlugin(
} }
fun setupDefaultPresets(project: Project) { fun setupDefaultPresets(project: Project) {
val propertiesProvider = PropertiesProvider(project)
with(project.multiplatformExtension.presets) { with(project.multiplatformExtension.presets) {
add(KotlinJvmTargetPreset(project, kotlinPluginVersion)) add(KotlinJvmTargetPreset(project, kotlinPluginVersion))
add(KotlinJsTargetPreset(project, kotlinPluginVersion)) when (propertiesProvider.jsMode) {
add(KotlinJsIrTargetPreset(project, kotlinPluginVersion)) 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(KotlinAndroidTargetPreset(project, kotlinPluginVersion))
add(KotlinJvmWithJavaTargetPreset(project, kotlinPluginVersion)) add(KotlinJvmWithJavaTargetPreset(project, kotlinPluginVersion))
@@ -7,10 +7,12 @@
package org.jetbrains.kotlin.gradle.plugin.mpp package org.jetbrains.kotlin.gradle.plugin.mpp
import org.gradle.api.Project import org.gradle.api.Project
import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrCompilation
class KotlinJsCompilationFactory( class KotlinJsCompilationFactory(
val project: Project, val project: Project,
val target: KotlinOnlyTarget<KotlinJsCompilation> val target: KotlinOnlyTarget<KotlinJsCompilation>,
val irTarget: KotlinOnlyTarget<KotlinJsIrCompilation>?
) : KotlinCompilationFactory<KotlinJsCompilation> { ) : KotlinCompilationFactory<KotlinJsCompilation> {
override val itemClass: Class<KotlinJsCompilation> override val itemClass: Class<KotlinJsCompilation>
get() = KotlinJsCompilation::class.java get() = KotlinJsCompilation::class.java
@@ -12,10 +12,12 @@ import org.jetbrains.kotlin.gradle.dsl.KotlinJsProjectExtension
import org.jetbrains.kotlin.gradle.dsl.kotlinExtension import org.jetbrains.kotlin.gradle.dsl.kotlinExtension
import org.jetbrains.kotlin.gradle.plugin.configureDefaultVersionsResolutionStrategy import org.jetbrains.kotlin.gradle.plugin.configureDefaultVersionsResolutionStrategy
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsSingleTargetPreset import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsSingleTargetPreset
import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrSingleTargetPreset
import org.jetbrains.kotlin.gradle.utils.checkGradleCompatibility import org.jetbrains.kotlin.gradle.utils.checkGradleCompatibility
open class KotlinJsPlugin( open class KotlinJsPlugin(
private val kotlinPluginVersion: String private val kotlinPluginVersion: String,
private val mixedMode: Boolean
) : Plugin<Project> { ) : Plugin<Project> {
override fun apply(project: Project) { override fun apply(project: Project) {
@@ -29,7 +31,9 @@ open class KotlinJsPlugin(
val kotlinExtension = project.kotlinExtension as KotlinJsProjectExtension val kotlinExtension = project.kotlinExtension as KotlinJsProjectExtension
configureDefaultVersionsResolutionStrategy(project, kotlinPluginVersion) 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 kotlinExtension.target = target
@@ -8,13 +8,15 @@ package org.jetbrains.kotlin.gradle.targets.js
import org.gradle.api.NamedDomainObjectContainer import org.gradle.api.NamedDomainObjectContainer
import org.gradle.api.Project import org.gradle.api.Project
import org.gradle.api.tasks.TaskProvider 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.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.KotlinJsCompilation
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinOnlyTarget 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.KotlinJsBrowserDsl
import org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinJsNodeDsl 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.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.KotlinBrowserJs
import org.jetbrains.kotlin.gradle.targets.js.subtargets.KotlinNodeJs import org.jetbrains.kotlin.gradle.targets.js.subtargets.KotlinNodeJs
import org.jetbrains.kotlin.gradle.tasks.locateTask 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 org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName
import javax.inject.Inject 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<KotlinJsCompilation>(project, platformType), KotlinOnlyTarget<KotlinJsCompilation>(project, platformType),
KotlinTargetWithTests<JsAggregatingExecutionSource, KotlinJsReportAggregatingTestRun>, KotlinTargetWithTests<JsAggregatingExecutionSource, KotlinJsReportAggregatingTestRun>,
KotlinJsTargetDsl KotlinJsTargetDsl {
{
override lateinit var testRuns: NamedDomainObjectContainer<KotlinJsReportAggregatingTestRun> override lateinit var testRuns: NamedDomainObjectContainer<KotlinJsReportAggregatingTestRun>
internal set internal set
@@ -12,10 +12,14 @@ import org.gradle.api.Project
import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType
import org.jetbrains.kotlin.gradle.targets.js.KotlinJsTarget import org.jetbrains.kotlin.gradle.targets.js.KotlinJsTarget
import org.jetbrains.kotlin.gradle.targets.js.KotlinJsTargetConfigurator 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( open class KotlinJsTargetPreset(
project: Project, project: Project,
kotlinPluginVersion: String kotlinPluginVersion: String,
irPreset: KotlinJsIrTargetPreset?
) : KotlinOnlyTargetPreset<KotlinJsTarget, KotlinJsCompilation>( ) : KotlinOnlyTargetPreset<KotlinJsTarget, KotlinJsCompilation>(
project, project,
kotlinPluginVersion kotlinPluginVersion
@@ -24,15 +28,40 @@ open class KotlinJsTargetPreset(
get() = KotlinPlatformType.js get() = KotlinPlatformType.js
override fun instantiateTarget(): KotlinJsTarget { 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 createKotlinTargetConfigurator() = KotlinJsTargetConfigurator(kotlinPluginVersion)
override fun getName(): String = PRESET_NAME override fun getName(): String = PRESET_NAME
override fun createCompilationFactory(forTarget: KotlinOnlyTarget<KotlinJsCompilation>) = override fun createCompilationFactory(forTarget: KotlinOnlyTarget<KotlinJsCompilation>): KotlinJsCompilationFactory {
KotlinJsCompilationFactory(project, forTarget) forTarget as KotlinJsTarget
return KotlinJsCompilationFactory(project, forTarget, forTarget.irTarget)
}
companion object { companion object {
const val PRESET_NAME = "js" const val PRESET_NAME = "js"
@@ -41,9 +70,13 @@ open class KotlinJsTargetPreset(
class KotlinJsSingleTargetPreset( class KotlinJsSingleTargetPreset(
project: Project, project: Project,
kotlinPluginVersion: String kotlinPluginVersion: String,
) : irPreset: KotlinJsIrSingleTargetPreset?
KotlinJsTargetPreset(project, kotlinPluginVersion) { ) : KotlinJsTargetPreset(
project,
kotlinPluginVersion,
irPreset
) {
// In a Kotlin/JS single-platform project, we don't need any disambiguation suffixes or prefixes in the names: // In a Kotlin/JS single-platform project, we don't need any disambiguation suffixes or prefixes in the names:
override fun provideTargetDisambiguationClassifier(target: KotlinOnlyTarget<KotlinJsCompilation>): String? = null override fun provideTargetDisambiguationClassifier(target: KotlinOnlyTarget<KotlinJsCompilation>): String? = null