[Gradle, JS] Configure compiler type with single platform plugin

This commit is contained in:
Ilya Goncharov
2020-02-18 12:10:19 +03:00
parent 22e826770d
commit b967e11511
11 changed files with 39 additions and 125 deletions
@@ -31,7 +31,6 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsSingleTargetPreset
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinWithJavaTarget import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinWithJavaTarget
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.KotlinJsIrSingleTargetPreset import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrSingleTargetPreset
import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrTarget
import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName
import org.jetbrains.kotlin.konan.target.CompilerOutputKind import org.jetbrains.kotlin.konan.target.CompilerOutputKind
import kotlin.reflect.KClass import kotlin.reflect.KClass
@@ -56,7 +55,7 @@ internal val Project.multiplatformExtensionOrNull: KotlinMultiplatformExtension?
internal val Project.multiplatformExtension: KotlinMultiplatformExtension internal val Project.multiplatformExtension: KotlinMultiplatformExtension
get() = extensions.getByName(KOTLIN_PROJECT_EXTENSION_NAME) as KotlinMultiplatformExtension get() = extensions.getByName(KOTLIN_PROJECT_EXTENSION_NAME) as KotlinMultiplatformExtension
open class KotlinProjectExtension: KotlinSourceSetContainer { open class KotlinProjectExtension : KotlinSourceSetContainer {
val experimental: ExperimentalExtension val experimental: ExperimentalExtension
get() = DslObject(this).extensions.getByType(ExperimentalExtension::class.java) get() = DslObject(this).extensions.getByType(ExperimentalExtension::class.java)
@@ -103,12 +102,18 @@ open class KotlinJsProjectExtension : KotlinSingleTargetExtension() {
compiler: JsCompilerType = legacy, compiler: JsCompilerType = legacy,
body: KotlinJsTargetDsl.() -> Unit body: KotlinJsTargetDsl.() -> Unit
) { ) {
val target = when (compiler) { val target: KotlinJsTargetDsl = when (compiler) {
legacy -> legacyPreset legacy -> legacyPreset
.also { it.irPreset = null }
.createTarget("js") .createTarget("js")
ir -> irPreset ir -> irPreset
.also { it.mixedMode = false }
.createTarget("js") .createTarget("js")
both -> legacyPreset both -> legacyPreset
.also {
irPreset.mixedMode = true
it.irPreset = irPreset
}
.createTarget( .createTarget(
lowerCamelCaseName( lowerCamelCaseName(
"js", "js",
@@ -139,19 +144,6 @@ open class KotlinJsProjectExtension : KotlinSingleTargetExtension() {
target.project.container(KotlinTarget::class.java).apply { add(target) } target.project.container(KotlinTarget::class.java).apply { add(target) }
} }
open class KotlinJsIrProjectExtension : KotlinSingleTargetExtension() {
override lateinit var target: KotlinJsIrTarget
open fun js(body: KotlinJsIrTarget.() -> Unit) = target.run(body)
@Deprecated(
"Needed for IDE import using the MPP import mechanism",
level = DeprecationLevel.HIDDEN
)
fun getTargets() =
target.project.container(KotlinTarget::class.java).apply { add(target) }
}
open class KotlinCommonProjectExtension : KotlinSingleJavaTargetExtension() { open class KotlinCommonProjectExtension : KotlinSingleJavaTargetExtension() {
override lateinit var target: KotlinWithJavaTarget<KotlinMultiplatformCommonOptions> override lateinit var target: KotlinWithJavaTarget<KotlinMultiplatformCommonOptions>
internal set internal set
@@ -26,14 +26,12 @@ import org.gradle.api.logging.Logging
import org.gradle.tooling.provider.model.ToolingModelBuilderRegistry import org.gradle.tooling.provider.model.ToolingModelBuilderRegistry
import org.jetbrains.kotlin.gradle.dsl.* import org.jetbrains.kotlin.gradle.dsl.*
import org.jetbrains.kotlin.gradle.logging.kotlinDebug import org.jetbrains.kotlin.gradle.logging.kotlinDebug
import org.jetbrains.kotlin.gradle.plugin.JsCompilerType
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinMultiplatformPlugin import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinMultiplatformPlugin
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinUsages import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinUsages
import org.jetbrains.kotlin.gradle.plugin.sources.DefaultKotlinSourceSetFactory import org.jetbrains.kotlin.gradle.plugin.sources.DefaultKotlinSourceSetFactory
import org.jetbrains.kotlin.gradle.plugin.statistics.KotlinBuildStatsService import org.jetbrains.kotlin.gradle.plugin.statistics.KotlinBuildStatsService
import org.jetbrains.kotlin.gradle.targets.js.KotlinJsPlugin import org.jetbrains.kotlin.gradle.targets.js.KotlinJsPlugin
import org.jetbrains.kotlin.gradle.targets.js.KotlinJsTarget import org.jetbrains.kotlin.gradle.targets.js.KotlinJsTarget
import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrPlugin
import org.jetbrains.kotlin.gradle.targets.js.npm.addNpmDependencyExtension import org.jetbrains.kotlin.gradle.targets.js.npm.addNpmDependencyExtension
import org.jetbrains.kotlin.gradle.tasks.KOTLIN_COMPILER_EMBEDDABLE import org.jetbrains.kotlin.gradle.tasks.KOTLIN_COMPILER_EMBEDDABLE
import org.jetbrains.kotlin.gradle.tasks.KOTLIN_KLIB_COMMONIZER_EMBEDDABLE import org.jetbrains.kotlin.gradle.tasks.KOTLIN_KLIB_COMMONIZER_EMBEDDABLE
@@ -79,8 +77,6 @@ abstract class KotlinBasePluginWrapper(
kotlinGradleBuildServices.detectKotlinPluginLoadedInMultipleProjects(project, kotlinPluginVersion) kotlinGradleBuildServices.detectKotlinPluginLoadedInMultipleProjects(project, kotlinPluginVersion)
defineExtension(project)
project.createKotlinExtension(projectExtensionClass).apply { project.createKotlinExtension(projectExtensionClass).apply {
fun kotlinSourceSetContainer(factory: NamedDomainObjectFactory<KotlinSourceSet>) = fun kotlinSourceSetContainer(factory: NamedDomainObjectFactory<KotlinSourceSet>) =
project.container(KotlinSourceSet::class.java, factory) project.container(KotlinSourceSet::class.java, factory)
@@ -112,9 +108,6 @@ abstract class KotlinBasePluginWrapper(
project: Project, project: Project,
kotlinGradleBuildServices: KotlinGradleBuildServices kotlinGradleBuildServices: KotlinGradleBuildServices
): Plugin<Project> ): Plugin<Project>
protected open fun defineExtension(project: Project) {
}
} }
open class KotlinPluginWrapper @Inject constructor( open class KotlinPluginWrapper @Inject constructor(
@@ -164,26 +157,11 @@ open class Kotlin2JsPluginWrapper @Inject constructor(
open class KotlinJsPluginWrapper @Inject constructor( open class KotlinJsPluginWrapper @Inject constructor(
fileResolver: FileResolver fileResolver: FileResolver
) : KotlinBasePluginWrapper(fileResolver) { ) : KotlinBasePluginWrapper(fileResolver) {
override fun getPlugin(project: Project, kotlinGradleBuildServices: KotlinGradleBuildServices): Plugin<Project> { override fun getPlugin(project: Project, kotlinGradleBuildServices: KotlinGradleBuildServices): Plugin<Project> =
val propertiesProvider = PropertiesProvider(project) KotlinJsPlugin(kotlinPluginVersion)
return when (propertiesProvider.jsCompiler) { override val projectExtensionClass: KClass<out KotlinJsProjectExtension>
JsCompilerType.ir -> KotlinJsIrPlugin(kotlinPluginVersion) get() = KotlinJsProjectExtension::class
JsCompilerType.legacy -> KotlinJsPlugin(kotlinPluginVersion, false)
JsCompilerType.both -> KotlinJsPlugin(kotlinPluginVersion, true)
}
}
override lateinit var projectExtensionClass: KClass<out KotlinProjectExtension>
override fun defineExtension(project: Project) {
val propertiesProvider = PropertiesProvider(project)
projectExtensionClass = when (propertiesProvider.jsCompiler) {
JsCompilerType.ir -> KotlinJsIrProjectExtension::class
JsCompilerType.legacy, JsCompilerType.both -> KotlinJsProjectExtension::class
}
}
override fun createTestRegistry(project: Project) = KotlinTestsRegistry(project, "test") override fun createTestRegistry(project: Project) = KotlinTestsRegistry(project, "test")
} }
@@ -19,8 +19,6 @@ package org.jetbrains.kotlin.gradle.plugin
import org.gradle.api.Project import org.gradle.api.Project
import org.jetbrains.kotlin.gradle.dsl.Coroutines import org.jetbrains.kotlin.gradle.dsl.Coroutines
import org.jetbrains.kotlin.gradle.dsl.NativeCacheKind import org.jetbrains.kotlin.gradle.dsl.NativeCacheKind
import org.jetbrains.kotlin.gradle.plugin.JsCompilerType
import org.jetbrains.kotlin.gradle.plugin.JsCompilerType.Companion.jsCompilerProperty
import org.jetbrains.kotlin.gradle.targets.native.DisabledNativeTargetsReporter import org.jetbrains.kotlin.gradle.targets.native.DisabledNativeTargetsReporter
import org.jetbrains.kotlin.gradle.tasks.AbstractKotlinCompile import org.jetbrains.kotlin.gradle.tasks.AbstractKotlinCompile
import org.jetbrains.kotlin.gradle.tasks.Kotlin2JsCompile import org.jetbrains.kotlin.gradle.tasks.Kotlin2JsCompile
@@ -170,12 +168,6 @@ internal class PropertiesProvider private constructor(private val project: Proje
val jsDiscoverTypes: Boolean? val jsDiscoverTypes: Boolean?
get() = booleanProperty("kotlin.js.experimental.discoverTypes") get() = booleanProperty("kotlin.js.experimental.discoverTypes")
/**
* Use Kotlin/JS backend mode
*/
val jsCompiler: JsCompilerType
get() = property(jsCompilerProperty)?.let { JsCompilerType.byArgument(it) } ?: JsCompilerType.legacy
private fun propertyWithDeprecatedVariant(propName: String, deprecatedPropName: String): String? { private fun propertyWithDeprecatedVariant(propName: String, deprecatedPropName: String): String? {
val deprecatedProperty = property(deprecatedPropName) val deprecatedProperty = property(deprecatedPropName)
if (deprecatedProperty != null) { if (deprecatedProperty != null) {
@@ -155,14 +155,16 @@ class KotlinMultiplatformPlugin(
fun setupDefaultPresets(project: Project) { fun setupDefaultPresets(project: Project) {
with(project.multiplatformExtension.presets) { with(project.multiplatformExtension.presets) {
add(KotlinJvmTargetPreset(project, kotlinPluginVersion)) add(KotlinJvmTargetPreset(project, kotlinPluginVersion))
add(KotlinJsTargetPreset(project, kotlinPluginVersion, null)) add(KotlinJsTargetPreset(project, kotlinPluginVersion).apply { irPreset = null })
add(KotlinJsIrTargetPreset(project, kotlinPluginVersion, false)) add(KotlinJsIrTargetPreset(project, kotlinPluginVersion).apply { mixedMode = false })
add( add(
KotlinJsTargetPreset( KotlinJsTargetPreset(
project, project,
kotlinPluginVersion, kotlinPluginVersion
KotlinJsIrTargetPreset(project, kotlinPluginVersion, true) ).apply {
) irPreset = KotlinJsIrTargetPreset(project, kotlinPluginVersion)
.apply { mixedMode = true }
}
) )
add(KotlinAndroidTargetPreset(project, kotlinPluginVersion)) add(KotlinAndroidTargetPreset(project, kotlinPluginVersion))
add(KotlinJvmWithJavaTargetPreset(project, kotlinPluginVersion)) add(KotlinJvmWithJavaTargetPreset(project, kotlinPluginVersion))
@@ -10,16 +10,13 @@ import org.gradle.api.Project
import org.gradle.api.plugins.JavaBasePlugin import org.gradle.api.plugins.JavaBasePlugin
import org.jetbrains.kotlin.gradle.dsl.KotlinJsProjectExtension 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.JsCompilerType
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.targets.js.ir.KotlinJsIrSingleTargetPreset
import org.jetbrains.kotlin.gradle.utils.checkGradleCompatibility import org.jetbrains.kotlin.gradle.utils.checkGradleCompatibility
import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName
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) {
@@ -33,20 +30,9 @@ open class KotlinJsPlugin(
val kotlinExtension = project.kotlinExtension as KotlinJsProjectExtension val kotlinExtension = project.kotlinExtension as KotlinJsProjectExtension
configureDefaultVersionsResolutionStrategy(project, kotlinPluginVersion) configureDefaultVersionsResolutionStrategy(project, kotlinPluginVersion)
val irPreset = if (mixedMode) kotlinExtension.apply {
KotlinJsIrSingleTargetPreset(project, kotlinPluginVersion, mixedMode) irPreset = KotlinJsIrSingleTargetPreset(project, kotlinPluginVersion)
else null legacyPreset = KotlinJsSingleTargetPreset(project, kotlinPluginVersion)
}
val target = KotlinJsSingleTargetPreset(project, kotlinPluginVersion, irPreset)
.createTarget(
lowerCamelCaseName(
"js",
irPreset?.let { JsCompilerType.legacy.name }
)
)
kotlinExtension.target = target
project.components.addAll(target.components)
} }
} }
@@ -182,7 +182,7 @@ constructor(
} }
} }
fun useCommonJs() { override fun useCommonJs() {
compilations.all { compilations.all {
it.compileKotlinTask.kotlinOptions { it.compileKotlinTask.kotlinOptions {
moduleKind = "commonjs" moduleKind = "commonjs"
@@ -14,18 +14,19 @@ import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType
import org.jetbrains.kotlin.gradle.plugin.removeCapitalizedJsCompilerSuffix import org.jetbrains.kotlin.gradle.plugin.removeCapitalizedJsCompilerSuffix
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.KotlinJsIrTargetPreset import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrTargetPreset
import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName
open class KotlinJsTargetPreset( open class KotlinJsTargetPreset(
project: Project, project: Project,
kotlinPluginVersion: String, kotlinPluginVersion: String
val irPreset: KotlinJsIrTargetPreset?
) : KotlinOnlyTargetPreset<KotlinJsTarget, KotlinJsCompilation>( ) : KotlinOnlyTargetPreset<KotlinJsTarget, KotlinJsCompilation>(
project, project,
kotlinPluginVersion kotlinPluginVersion
) { ) {
var irPreset: KotlinJsIrTargetPreset? = null
internal set
override val platformType: KotlinPlatformType override val platformType: KotlinPlatformType
get() = KotlinPlatformType.js get() = KotlinPlatformType.js
@@ -63,12 +64,10 @@ open class KotlinJsTargetPreset(
class KotlinJsSingleTargetPreset( class KotlinJsSingleTargetPreset(
project: Project, project: Project,
kotlinPluginVersion: String, kotlinPluginVersion: String
irPreset: KotlinJsIrSingleTargetPreset?
) : KotlinJsTargetPreset( ) : KotlinJsTargetPreset(
project, project,
kotlinPluginVersion, 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:
@@ -52,6 +52,8 @@ interface KotlinJsTargetDsl : KotlinTarget {
fun produceExecutable() fun produceExecutable()
fun useCommonJs()
val testRuns: NamedDomainObjectContainer<KotlinJsReportAggregatingTestRun> val testRuns: NamedDomainObjectContainer<KotlinJsReportAggregatingTestRun>
// Need to compatibility when users use KotlinJsCompilation specific in build script // Need to compatibility when users use KotlinJsCompilation specific in build script
@@ -1,37 +0,0 @@
/*
* Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.gradle.targets.js.ir
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.api.plugins.JavaBasePlugin
import org.jetbrains.kotlin.gradle.dsl.KotlinJsIrProjectExtension
import org.jetbrains.kotlin.gradle.dsl.kotlinExtension
import org.jetbrains.kotlin.gradle.plugin.configureDefaultVersionsResolutionStrategy
import org.jetbrains.kotlin.gradle.utils.checkGradleCompatibility
open class KotlinJsIrPlugin(
private val kotlinPluginVersion: String
) : Plugin<Project> {
override fun apply(project: Project) {
// TODO get rid of this plugin, too? Use the 'base' plugin instead?
// in fact, the attributes schema of the Java base plugin may be required to consume non-MPP Kotlin/JS libs,
// so investigation is needed
project.plugins.apply(JavaBasePlugin::class.java)
checkGradleCompatibility()
val kotlinExtension = project.kotlinExtension as KotlinJsIrProjectExtension
configureDefaultVersionsResolutionStrategy(project, kotlinPluginVersion)
val target = KotlinJsIrSingleTargetPreset(project, kotlinPluginVersion, false).createTarget("js")
kotlinExtension.target = target
project.components.addAll(target.components)
}
}
@@ -128,7 +128,7 @@ constructor(
} }
} }
fun useCommonJs() { override fun useCommonJs() {
compilations.all { compilations.all {
it.compileKotlinTask.configureCommonJsOptions() it.compileKotlinTask.configureCommonJsOptions()
@@ -16,12 +16,13 @@ import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName
open class KotlinJsIrTargetPreset( open class KotlinJsIrTargetPreset(
project: Project, project: Project,
kotlinPluginVersion: String, kotlinPluginVersion: String
private val mixedMode: Boolean
) : KotlinOnlyTargetPreset<KotlinJsIrTarget, KotlinJsIrCompilation>( ) : KotlinOnlyTargetPreset<KotlinJsIrTarget, KotlinJsIrCompilation>(
project, project,
kotlinPluginVersion kotlinPluginVersion
) { ) {
internal var mixedMode: Boolean? = null
override val platformType: KotlinPlatformType override val platformType: KotlinPlatformType
get() = KotlinPlatformType.js get() = KotlinPlatformType.js
@@ -50,10 +51,9 @@ open class KotlinJsIrTargetPreset(
class KotlinJsIrSingleTargetPreset( class KotlinJsIrSingleTargetPreset(
project: Project, project: Project,
kotlinPluginVersion: String, kotlinPluginVersion: String
mixedMode: Boolean
) : ) :
KotlinJsIrTargetPreset(project, kotlinPluginVersion, mixedMode) { KotlinJsIrTargetPreset(project, kotlinPluginVersion) {
// 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<KotlinJsIrCompilation>): String? = null override fun provideTargetDisambiguationClassifier(target: KotlinOnlyTarget<KotlinJsIrCompilation>): String? = null