[Gradle, JS] Configure compiler type with single platform plugin
This commit is contained in:
+8
-16
@@ -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
|
||||
|
||||
+4
-26
@@ -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")
|
||||
}
|
||||
|
||||
-8
@@ -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) {
|
||||
|
||||
+7
-5
@@ -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))
|
||||
|
||||
+5
-19
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
+1
-1
@@ -182,7 +182,7 @@ constructor(
|
||||
}
|
||||
}
|
||||
|
||||
fun useCommonJs() {
|
||||
override fun useCommonJs() {
|
||||
compilations.all {
|
||||
it.compileKotlinTask.kotlinOptions {
|
||||
moduleKind = "commonjs"
|
||||
|
||||
+6
-7
@@ -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:
|
||||
|
||||
+2
@@ -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
|
||||
|
||||
-37
@@ -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)
|
||||
}
|
||||
}
|
||||
+1
-1
@@ -128,7 +128,7 @@ constructor(
|
||||
}
|
||||
}
|
||||
|
||||
fun useCommonJs() {
|
||||
override fun useCommonJs() {
|
||||
compilations.all {
|
||||
it.compileKotlinTask.configureCommonJsOptions()
|
||||
|
||||
|
||||
+5
-5
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user