[Gradle, JS] Fix codegen for js platform

This commit is contained in:
Ilya Goncharov
2020-02-13 20:37:18 +03:00
parent 1bebcd398e
commit ae391f3776
3 changed files with 103 additions and 33 deletions
@@ -21,7 +21,7 @@ private val presetsProperty = KotlinTargetsContainerWithPresets::presets.name
private fun generateKotlinTargetContainerWithPresetFunctionsInterface() {
// Generate KotlinMultiplatformExtension subclass with member functions for the presets:
val functions = allPresetEntries.map {
generatePresetFunctions(it, presetsProperty, "configureOrCreate")
it.generatePresetFunctions(presetsProperty, "configureOrCreate")
}
val parentInterfaceName =
@@ -54,28 +54,4 @@ private fun generateKotlinTargetContainerWithPresetFunctionsInterface() {
val outputSourceRoot = System.getProperties()["org.jetbrains.kotlin.generators.gradle.dsl.outputSourceRoot"]
val targetFile = File("$outputSourceRoot/${className.fqName.replace(".", "/")}.kt")
targetFile.writeText(code)
}
private fun generatePresetFunctions(
presetEntry: KotlinPresetEntry,
getPresetsExpression: String,
configureOrCreateFunctionName: String
): String {
val presetName = presetEntry.presetName
return """
fun $presetName(
name: String = "$presetName",
configure: ${presetEntry.targetType.renderShort()}.() -> Unit = { }
): ${presetEntry.targetType.renderShort()} =
$configureOrCreateFunctionName(
name,
$getPresetsExpression.getByName("$presetName") as ${presetEntry.presetType.renderShort()},
configure
)
fun $presetName() = $presetName("$presetName") { }
fun $presetName(name: String) = $presetName(name) { }
fun $presetName(name: String, configure: Closure<*>) = $presetName(name) { ConfigureUtil.configure(configure, this) }
fun $presetName(configure: Closure<*>) = $presetName { ConfigureUtil.configure(configure, this) }
""".trimIndent()
}
}
@@ -7,17 +7,100 @@ package org.jetbrains.kotlin.generators.gradle.dsl
import org.jetbrains.kotlin.generators.gradle.dsl.NativeFQNames.Presets
import org.jetbrains.kotlin.generators.gradle.dsl.NativeFQNames.Targets
import org.jetbrains.kotlin.gradle.plugin.JsCompilerType
import org.jetbrains.kotlin.konan.target.HostManager
import org.jetbrains.kotlin.konan.target.KonanTarget
import org.jetbrains.kotlin.konan.target.presetName
internal class KotlinPresetEntry(
internal open class KotlinPresetEntry(
val presetName: String,
val presetType: TypeName,
val targetType: TypeName
)
) {
open fun typeNames(): Set<TypeName> = setOf(presetType, targetType)
internal fun KotlinPresetEntry.typeNames(): Set<TypeName> = setOf(presetType, targetType)
open fun generatePresetFunctions(
getPresetsExpression: String,
configureOrCreateFunctionName: String
): String {
val presetName = presetName
return """
fun $presetName(
name: String = "$presetName",
configure: ${targetType.renderShort()}.() -> Unit = { }
): ${targetType.renderShort()} =
$configureOrCreateFunctionName(
name,
$getPresetsExpression.getByName("$presetName") as ${presetType.renderShort()},
configure
)
fun $presetName() = $presetName("$presetName") { }
fun $presetName(name: String) = $presetName(name) { }
fun $presetName(name: String, configure: Closure<*>) = $presetName(name) { ConfigureUtil.configure(configure, this) }
fun $presetName(configure: Closure<*>) = $presetName { ConfigureUtil.configure(configure, this) }
""".trimIndent()
}
}
internal class KotlinJsPresetEntry(
presetName: String,
presetType: TypeName,
targetType: TypeName
) : KotlinPresetEntry(
presetName,
presetType,
targetType
) {
override fun typeNames(): Set<TypeName> {
return setOf(
typeName(JsCompilerType::class.qualifiedName!!),
typeName("org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName"),
presetType,
targetType
)
}
override fun generatePresetFunctions(
getPresetsExpression: String,
configureOrCreateFunctionName: String
): String {
val presetName = presetName
return """
fun $presetName(
name: String = "$presetName",
compiler: JsCompilerType = JsCompilerType.legacy,
configure: ${targetType.renderShort()}.() -> Unit = { }
): ${targetType.renderShort()} =
$configureOrCreateFunctionName(
lowerCamelCaseName(name, if (compiler == JsCompilerType.both) JsCompilerType.legacy.name else null),
$getPresetsExpression.getByName(
lowerCamelCaseName(
"$presetName",
if (compiler == JsCompilerType.legacy) null else compiler.name
)
) as ${presetType.renderShort()},
configure
)
fun $presetName(
name: String = "$presetName",
configure: ${targetType.renderShort()}.() -> Unit = { }
) = $presetName(name = "$presetName", compiler = JsCompilerType.legacy, configure = configure)
fun $presetName(
compiler: JsCompilerType,
configure: ${targetType.renderShort()}.() -> Unit = { }
) = $presetName(name = "$presetName", compiler = compiler, configure = configure)
fun $presetName() = $presetName(name = "$presetName") { }
fun $presetName(name: String) = $presetName(name = name) { }
fun $presetName(name: String, configure: Closure<*>) = $presetName(name = name) { ConfigureUtil.configure(configure, this) }
fun $presetName(compiler: JsCompilerType, configure: Closure<*>) = $presetName(compiler = compiler) { ConfigureUtil.configure(configure, this) }
fun $presetName(configure: Closure<*>) = $presetName { ConfigureUtil.configure(configure, this) }
""".trimIndent()
}
}
internal const val MPP_PACKAGE = "org.jetbrains.kotlin.gradle.plugin.mpp"
@@ -41,7 +124,7 @@ internal val jvmPresetEntry = KotlinPresetEntry(
typeName("org.jetbrains.kotlin.gradle.targets.jvm.KotlinJvmTarget")
)
internal val jsPresetEntry = KotlinPresetEntry(
internal val jsPresetEntry = KotlinJsPresetEntry(
"js",
// need for commonization KotlinJsTargetPreset and KotlinJsIrTargetPreset
typeName("org.jetbrains.kotlin.gradle.plugin.KotlinTargetPreset", "org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinJsTargetDsl"),
@@ -30,24 +30,35 @@ interface KotlinTargetContainerWithPresetFunctions : KotlinTargetsContainerWithP
fun jvm(configure: Closure<*>) = jvm { ConfigureUtil.configure(configure, this) }
fun js(
compiler: JsCompilerType = JsCompilerType.legacy,
name: String = "js",
compiler: JsCompilerType = JsCompilerType.legacy,
configure: KotlinJsTargetDsl.() -> Unit = { }
): KotlinJsTargetDsl =
configureOrCreate(
name,
lowerCamelCaseName(name, if (compiler == JsCompilerType.both) JsCompilerType.legacy.name else ""),
presets.getByName(
lowerCamelCaseName(
"js",
if (compiler == JsCompilerType.legacy) "" else compiler.name
if (compiler == JsCompilerType.legacy) null else compiler.name
)
) as KotlinTargetPreset<KotlinJsTargetDsl>,
configure
)
fun js(
name: String = "js",
configure: KotlinJsTargetDsl.() -> Unit = { }
) = js(name = "js", compiler = JsCompilerType.legacy, configure = configure)
fun js(
compiler: JsCompilerType,
configure: KotlinJsTargetDsl.() -> Unit = { }
) = js(name = "js", compiler = compiler, configure = configure)
fun js() = js(name = "js") { }
fun js(name: String) = js(name = name) { }
fun js(name: String, configure: Closure<*>) = js(name = name) { ConfigureUtil.configure(configure, this) }
fun js(compiler: JsCompilerType, configure: Closure<*>) = js(compiler = compiler) { ConfigureUtil.configure(configure, this) }
fun js(configure: Closure<*>) = js { ConfigureUtil.configure(configure, this) }
fun android(