[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.targets.js.dsl.KotlinJsTargetDsl
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.konan.target.CompilerOutputKind
import kotlin.reflect.KClass
@@ -56,7 +55,7 @@ internal val Project.multiplatformExtensionOrNull: KotlinMultiplatformExtension?
internal val Project.multiplatformExtension: KotlinMultiplatformExtension
get() = extensions.getByName(KOTLIN_PROJECT_EXTENSION_NAME) as KotlinMultiplatformExtension
open class KotlinProjectExtension: KotlinSourceSetContainer {
open class KotlinProjectExtension : KotlinSourceSetContainer {
val experimental: ExperimentalExtension
get() = DslObject(this).extensions.getByType(ExperimentalExtension::class.java)
@@ -103,12 +102,18 @@ open class KotlinJsProjectExtension : KotlinSingleTargetExtension() {
compiler: JsCompilerType = legacy,
body: KotlinJsTargetDsl.() -> Unit
) {
val target = when (compiler) {
val target: KotlinJsTargetDsl = when (compiler) {
legacy -> legacyPreset
.also { it.irPreset = null }
.createTarget("js")
ir -> irPreset
.also { it.mixedMode = false }
.createTarget("js")
both -> legacyPreset
.also {
irPreset.mixedMode = true
it.irPreset = irPreset
}
.createTarget(
lowerCamelCaseName(
"js",
@@ -139,19 +144,6 @@ open class KotlinJsProjectExtension : KotlinSingleTargetExtension() {
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() {
override lateinit var target: KotlinWithJavaTarget<KotlinMultiplatformCommonOptions>
internal set
@@ -26,14 +26,12 @@ import org.gradle.api.logging.Logging
import org.gradle.tooling.provider.model.ToolingModelBuilderRegistry
import org.jetbrains.kotlin.gradle.dsl.*
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.KotlinUsages
import org.jetbrains.kotlin.gradle.plugin.sources.DefaultKotlinSourceSetFactory
import org.jetbrains.kotlin.gradle.plugin.statistics.KotlinBuildStatsService
import org.jetbrains.kotlin.gradle.targets.js.KotlinJsPlugin
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.tasks.KOTLIN_COMPILER_EMBEDDABLE
import org.jetbrains.kotlin.gradle.tasks.KOTLIN_KLIB_COMMONIZER_EMBEDDABLE
@@ -79,8 +77,6 @@ abstract class KotlinBasePluginWrapper(
kotlinGradleBuildServices.detectKotlinPluginLoadedInMultipleProjects(project, kotlinPluginVersion)
defineExtension(project)
project.createKotlinExtension(projectExtensionClass).apply {
fun kotlinSourceSetContainer(factory: NamedDomainObjectFactory<KotlinSourceSet>) =
project.container(KotlinSourceSet::class.java, factory)
@@ -112,9 +108,6 @@ abstract class KotlinBasePluginWrapper(
project: Project,
kotlinGradleBuildServices: KotlinGradleBuildServices
): Plugin<Project>
protected open fun defineExtension(project: Project) {
}
}
open class KotlinPluginWrapper @Inject constructor(
@@ -164,26 +157,11 @@ open class Kotlin2JsPluginWrapper @Inject constructor(
open class KotlinJsPluginWrapper @Inject constructor(
fileResolver: FileResolver
) : KotlinBasePluginWrapper(fileResolver) {
override fun getPlugin(project: Project, kotlinGradleBuildServices: KotlinGradleBuildServices): Plugin<Project> {
val propertiesProvider = PropertiesProvider(project)
override fun getPlugin(project: Project, kotlinGradleBuildServices: KotlinGradleBuildServices): Plugin<Project> =
KotlinJsPlugin(kotlinPluginVersion)
return when (propertiesProvider.jsCompiler) {
JsCompilerType.ir -> KotlinJsIrPlugin(kotlinPluginVersion)
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 val projectExtensionClass: KClass<out KotlinJsProjectExtension>
get() = KotlinJsProjectExtension::class
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.jetbrains.kotlin.gradle.dsl.Coroutines
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.tasks.AbstractKotlinCompile
import org.jetbrains.kotlin.gradle.tasks.Kotlin2JsCompile
@@ -170,12 +168,6 @@ internal class PropertiesProvider private constructor(private val project: Proje
val jsDiscoverTypes: Boolean?
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? {
val deprecatedProperty = property(deprecatedPropName)
if (deprecatedProperty != null) {
@@ -155,14 +155,16 @@ class KotlinMultiplatformPlugin(
fun setupDefaultPresets(project: Project) {
with(project.multiplatformExtension.presets) {
add(KotlinJvmTargetPreset(project, kotlinPluginVersion))
add(KotlinJsTargetPreset(project, kotlinPluginVersion, null))
add(KotlinJsIrTargetPreset(project, kotlinPluginVersion, false))
add(KotlinJsTargetPreset(project, kotlinPluginVersion).apply { irPreset = null })
add(KotlinJsIrTargetPreset(project, kotlinPluginVersion).apply { mixedMode = false })
add(
KotlinJsTargetPreset(
project,
kotlinPluginVersion,
KotlinJsIrTargetPreset(project, kotlinPluginVersion, true)
)
kotlinPluginVersion
).apply {
irPreset = KotlinJsIrTargetPreset(project, kotlinPluginVersion)
.apply { mixedMode = true }
}
)
add(KotlinAndroidTargetPreset(project, kotlinPluginVersion))
add(KotlinJvmWithJavaTargetPreset(project, kotlinPluginVersion))
@@ -10,16 +10,13 @@ import org.gradle.api.Project
import org.gradle.api.plugins.JavaBasePlugin
import org.jetbrains.kotlin.gradle.dsl.KotlinJsProjectExtension
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.mpp.KotlinJsSingleTargetPreset
import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrSingleTargetPreset
import org.jetbrains.kotlin.gradle.utils.checkGradleCompatibility
import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName
open class KotlinJsPlugin(
private val kotlinPluginVersion: String,
private val mixedMode: Boolean
private val kotlinPluginVersion: String
) : Plugin<Project> {
override fun apply(project: Project) {
@@ -33,20 +30,9 @@ open class KotlinJsPlugin(
val kotlinExtension = project.kotlinExtension as KotlinJsProjectExtension
configureDefaultVersionsResolutionStrategy(project, kotlinPluginVersion)
val irPreset = if (mixedMode)
KotlinJsIrSingleTargetPreset(project, kotlinPluginVersion, mixedMode)
else null
val target = KotlinJsSingleTargetPreset(project, kotlinPluginVersion, irPreset)
.createTarget(
lowerCamelCaseName(
"js",
irPreset?.let { JsCompilerType.legacy.name }
)
)
kotlinExtension.target = target
project.components.addAll(target.components)
kotlinExtension.apply {
irPreset = KotlinJsIrSingleTargetPreset(project, kotlinPluginVersion)
legacyPreset = KotlinJsSingleTargetPreset(project, kotlinPluginVersion)
}
}
}
@@ -182,7 +182,7 @@ constructor(
}
}
fun useCommonJs() {
override fun useCommonJs() {
compilations.all {
it.compileKotlinTask.kotlinOptions {
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.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.KotlinJsIrTargetPreset
import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName
open class KotlinJsTargetPreset(
project: Project,
kotlinPluginVersion: String,
val irPreset: KotlinJsIrTargetPreset?
kotlinPluginVersion: String
) : KotlinOnlyTargetPreset<KotlinJsTarget, KotlinJsCompilation>(
project,
kotlinPluginVersion
) {
var irPreset: KotlinJsIrTargetPreset? = null
internal set
override val platformType: KotlinPlatformType
get() = KotlinPlatformType.js
@@ -63,12 +64,10 @@ open class KotlinJsTargetPreset(
class KotlinJsSingleTargetPreset(
project: Project,
kotlinPluginVersion: String,
irPreset: KotlinJsIrSingleTargetPreset?
kotlinPluginVersion: String
) : KotlinJsTargetPreset(
project,
kotlinPluginVersion,
irPreset
kotlinPluginVersion
) {
// 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 useCommonJs()
val testRuns: NamedDomainObjectContainer<KotlinJsReportAggregatingTestRun>
// 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 {
it.compileKotlinTask.configureCommonJsOptions()
@@ -16,12 +16,13 @@ import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName
open class KotlinJsIrTargetPreset(
project: Project,
kotlinPluginVersion: String,
private val mixedMode: Boolean
kotlinPluginVersion: String
) : KotlinOnlyTargetPreset<KotlinJsIrTarget, KotlinJsIrCompilation>(
project,
kotlinPluginVersion
) {
internal var mixedMode: Boolean? = null
override val platformType: KotlinPlatformType
get() = KotlinPlatformType.js
@@ -50,10 +51,9 @@ open class KotlinJsIrTargetPreset(
class KotlinJsIrSingleTargetPreset(
project: Project,
kotlinPluginVersion: String,
mixedMode: Boolean
kotlinPluginVersion: String
) :
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:
override fun provideTargetDisambiguationClassifier(target: KotlinOnlyTarget<KotlinJsIrCompilation>): String? = null