[Gradle, JS] Check current chosen js compiler for targets in JS and MPP
This commit is contained in:
+19
-6
@@ -26,6 +26,7 @@ import org.jetbrains.kotlin.gradle.plugin.KotlinJsCompilerType.*
|
|||||||
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinAndroidTarget
|
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinAndroidTarget
|
||||||
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsSingleTargetPreset
|
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.calculateJsCompilerType
|
||||||
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.utils.lowerCamelCaseName
|
import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName
|
||||||
@@ -115,12 +116,19 @@ open class KotlinJsProjectExtension :
|
|||||||
|
|
||||||
override lateinit var defaultJsCompilerType: KotlinJsCompilerType
|
override lateinit var defaultJsCompilerType: KotlinJsCompilerType
|
||||||
|
|
||||||
open fun js(
|
private fun jsInternal(
|
||||||
compiler: KotlinJsCompilerType = defaultJsCompilerType,
|
compiler: KotlinJsCompilerType? = null,
|
||||||
body: KotlinJsTargetDsl.() -> Unit = { }
|
body: KotlinJsTargetDsl.() -> Unit
|
||||||
): KotlinJsTargetDsl {
|
): KotlinJsTargetDsl {
|
||||||
|
if (_target != null) {
|
||||||
|
val previousCompilerType = _target!!.calculateJsCompilerType()
|
||||||
|
check(compiler == null || previousCompilerType == compiler) {
|
||||||
|
"You already registered Kotlin/JS target with another compiler: ${previousCompilerType.lowerName}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (_target == null) {
|
if (_target == null) {
|
||||||
val target: KotlinJsTargetDsl = when (compiler) {
|
val target: KotlinJsTargetDsl = when (compiler ?: defaultJsCompilerType) {
|
||||||
LEGACY -> legacyPreset
|
LEGACY -> legacyPreset
|
||||||
.also { it.irPreset = null }
|
.also { it.irPreset = null }
|
||||||
.createTarget("js")
|
.createTarget("js")
|
||||||
@@ -151,8 +159,13 @@ open class KotlinJsProjectExtension :
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun js(
|
fun js(
|
||||||
|
compiler: KotlinJsCompilerType = defaultJsCompilerType,
|
||||||
body: KotlinJsTargetDsl.() -> Unit = { }
|
body: KotlinJsTargetDsl.() -> Unit = { }
|
||||||
) = js(compiler = defaultJsCompilerType, body = body)
|
): KotlinJsTargetDsl = jsInternal(compiler, body)
|
||||||
|
|
||||||
|
fun js(
|
||||||
|
body: KotlinJsTargetDsl.() -> Unit = { }
|
||||||
|
) = jsInternal(body = body)
|
||||||
|
|
||||||
fun js() = js { }
|
fun js() = js { }
|
||||||
|
|
||||||
@@ -161,7 +174,7 @@ open class KotlinJsProjectExtension :
|
|||||||
ConfigureUtil.configure(configure, this)
|
ConfigureUtil.configure(configure, this)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun js(configure: Closure<*>) = js {
|
fun js(configure: Closure<*>) = jsInternal {
|
||||||
ConfigureUtil.configure(configure, this)
|
ConfigureUtil.configure(configure, this)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+82
-20
@@ -2,10 +2,8 @@ package org.jetbrains.kotlin.gradle.dsl
|
|||||||
|
|
||||||
import groovy.lang.Closure
|
import groovy.lang.Closure
|
||||||
import org.gradle.util.ConfigureUtil
|
import org.gradle.util.ConfigureUtil
|
||||||
import org.jetbrains.kotlin.gradle.plugin.KotlinJsCompilerType
|
import org.jetbrains.kotlin.gradle.plugin.*
|
||||||
import org.jetbrains.kotlin.gradle.plugin.KotlinJsCompilerTypeHolder
|
import org.jetbrains.kotlin.gradle.targets.js.calculateJsCompilerType
|
||||||
import org.jetbrains.kotlin.gradle.plugin.KotlinTargetPreset
|
|
||||||
import org.jetbrains.kotlin.gradle.plugin.lowerName
|
|
||||||
import org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinJsTargetDsl
|
import org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinJsTargetDsl
|
||||||
import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName
|
import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName
|
||||||
|
|
||||||
@@ -16,17 +14,11 @@ interface KotlinTargetContainerWithJsPresetFunctions :
|
|||||||
name: String = "js",
|
name: String = "js",
|
||||||
compiler: KotlinJsCompilerType = defaultJsCompilerType,
|
compiler: KotlinJsCompilerType = defaultJsCompilerType,
|
||||||
configure: KotlinJsTargetDsl.() -> Unit = { }
|
configure: KotlinJsTargetDsl.() -> Unit = { }
|
||||||
): KotlinJsTargetDsl =
|
): KotlinJsTargetDsl = jsInternal(
|
||||||
configureOrCreate(
|
name,
|
||||||
lowerCamelCaseName(name, if (compiler == KotlinJsCompilerType.BOTH) KotlinJsCompilerType.LEGACY.lowerName else null),
|
compiler,
|
||||||
presets.getByName(
|
configure
|
||||||
lowerCamelCaseName(
|
)
|
||||||
"js",
|
|
||||||
if (compiler == KotlinJsCompilerType.LEGACY) null else compiler.lowerName
|
|
||||||
)
|
|
||||||
) as KotlinTargetPreset<KotlinJsTargetDsl>,
|
|
||||||
configure
|
|
||||||
)
|
|
||||||
|
|
||||||
fun js(
|
fun js(
|
||||||
name: String,
|
name: String,
|
||||||
@@ -44,18 +36,18 @@ interface KotlinTargetContainerWithJsPresetFunctions :
|
|||||||
fun js(
|
fun js(
|
||||||
name: String = "js",
|
name: String = "js",
|
||||||
configure: KotlinJsTargetDsl.() -> Unit = { }
|
configure: KotlinJsTargetDsl.() -> Unit = { }
|
||||||
) = js(name = name, compiler = defaultJsCompilerType, configure = configure)
|
) = jsInternal(name = name, configure = configure)
|
||||||
|
|
||||||
fun js(
|
fun js(
|
||||||
compiler: KotlinJsCompilerType,
|
compiler: KotlinJsCompilerType,
|
||||||
configure: KotlinJsTargetDsl.() -> Unit = { }
|
configure: KotlinJsTargetDsl.() -> Unit = { }
|
||||||
) = js(name = "js", compiler = compiler, configure = configure)
|
) = js(name = "js", compiler = compiler, configure = configure)
|
||||||
|
|
||||||
fun js() = js(name = "js") { }
|
fun js() = jsInternal(name = "js") { }
|
||||||
fun js(name: String) = js(name = name) { }
|
fun js(name: String) = jsInternal(name = name) { }
|
||||||
fun js(name: String, configure: Closure<*>) = js(name = name) { ConfigureUtil.configure(configure, this) }
|
fun js(name: String, configure: Closure<*>) = jsInternal(name = name) { ConfigureUtil.configure(configure, this) }
|
||||||
fun js(compiler: KotlinJsCompilerType, configure: Closure<*>) = js(compiler = compiler) { ConfigureUtil.configure(configure, this) }
|
fun js(compiler: KotlinJsCompilerType, configure: Closure<*>) = js(compiler = compiler) { ConfigureUtil.configure(configure, this) }
|
||||||
fun js(configure: Closure<*>) = js { ConfigureUtil.configure(configure, this) }
|
fun js(configure: Closure<*>) = jsInternal { ConfigureUtil.configure(configure, this) }
|
||||||
|
|
||||||
fun js(
|
fun js(
|
||||||
name: String,
|
name: String,
|
||||||
@@ -79,3 +71,73 @@ interface KotlinTargetContainerWithJsPresetFunctions :
|
|||||||
ConfigureUtil.configure(configure, this)
|
ConfigureUtil.configure(configure, this)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun KotlinTargetContainerWithJsPresetFunctions.jsInternal(
|
||||||
|
name: String = "js",
|
||||||
|
compiler: KotlinJsCompilerType? = null,
|
||||||
|
configure: KotlinJsTargetDsl.() -> Unit
|
||||||
|
): KotlinJsTargetDsl {
|
||||||
|
val existingTarget = getExistingTarget(name, compiler)
|
||||||
|
|
||||||
|
val compilerOrDefault = compiler
|
||||||
|
?: existingTarget?.calculateJsCompilerType()
|
||||||
|
?: defaultJsCompilerType
|
||||||
|
|
||||||
|
val targetName = getTargetName(name, compilerOrDefault)
|
||||||
|
|
||||||
|
if (existingTarget != null) {
|
||||||
|
val previousCompilerType = existingTarget.calculateJsCompilerType()
|
||||||
|
check(compiler == null || previousCompilerType == compiler) {
|
||||||
|
"You already registered Kotlin/JS target '$targetName' with another compiler: ${previousCompilerType.lowerName}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return configureOrCreate(
|
||||||
|
targetName,
|
||||||
|
presets.getByName(
|
||||||
|
lowerCamelCaseName(
|
||||||
|
"js",
|
||||||
|
if (compilerOrDefault == KotlinJsCompilerType.LEGACY) null else compilerOrDefault.lowerName
|
||||||
|
)
|
||||||
|
) as KotlinTargetPreset<KotlinJsTargetDsl>,
|
||||||
|
configure
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Try to find existing target with exact name
|
||||||
|
// and with append suffix Legacy in case when compiler for found target is BOTH,
|
||||||
|
// and removed suffix Legacy in case when current compiler is BOTH
|
||||||
|
private fun KotlinTargetContainerWithJsPresetFunctions.getExistingTarget(
|
||||||
|
name: String,
|
||||||
|
compiler: KotlinJsCompilerType?
|
||||||
|
): KotlinJsTargetDsl? {
|
||||||
|
|
||||||
|
fun getPreviousTarget(
|
||||||
|
targetName: String,
|
||||||
|
currentBoth: Boolean
|
||||||
|
): KotlinJsTargetDsl? {
|
||||||
|
val singleTarget = targets.findByName(
|
||||||
|
targetName
|
||||||
|
) as KotlinJsTargetDsl?
|
||||||
|
|
||||||
|
return singleTarget?.let {
|
||||||
|
val previousCompiler = it.calculateJsCompilerType()
|
||||||
|
if (compiler == KotlinJsCompilerType.BOTH && currentBoth || previousCompiler == KotlinJsCompilerType.BOTH && !currentBoth) {
|
||||||
|
it
|
||||||
|
} else null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
val targetNameCandidate = getTargetName(name, compiler)
|
||||||
|
|
||||||
|
return targets.findByName(targetNameCandidate) as KotlinJsTargetDsl?
|
||||||
|
?: getPreviousTarget(targetNameCandidate.removeJsCompilerSuffix(KotlinJsCompilerType.LEGACY), true)
|
||||||
|
?: getPreviousTarget(lowerCamelCaseName(targetNameCandidate, KotlinJsCompilerType.LEGACY.lowerName), false)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun getTargetName(name: String, compiler: KotlinJsCompilerType?): String {
|
||||||
|
return lowerCamelCaseName(
|
||||||
|
name,
|
||||||
|
if (compiler == KotlinJsCompilerType.BOTH) KotlinJsCompilerType.LEGACY.lowerName else null
|
||||||
|
)
|
||||||
|
}
|
||||||
+19
@@ -0,0 +1,19 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2020 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
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.gradle.plugin.KotlinJsCompilerType
|
||||||
|
import org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinJsTargetDsl
|
||||||
|
import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrTarget
|
||||||
|
|
||||||
|
fun KotlinJsTargetDsl.calculateJsCompilerType(): KotlinJsCompilerType {
|
||||||
|
return when {
|
||||||
|
this is KotlinJsTarget && this.irTarget == null -> KotlinJsCompilerType.LEGACY
|
||||||
|
this is KotlinJsIrTarget && !this.mixedMode -> KotlinJsCompilerType.IR
|
||||||
|
this is KotlinJsTarget && this.irTarget != null -> KotlinJsCompilerType.BOTH
|
||||||
|
else -> throw IllegalStateException("Unable to find previous Kotlin/JS compiler type for $this")
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user