From ae391f3776311eae7f2883eb94c074e2fa343e93 Mon Sep 17 00:00:00 2001 From: Ilya Goncharov Date: Thu, 13 Feb 2020 20:37:18 +0300 Subject: [PATCH] [Gradle, JS] Fix codegen for js platform --- .../gradle/dsl/mppPresetFunctionsCodegen.kt | 28 +----- .../generators/gradle/dsl/presetEntries.kt | 91 ++++++++++++++++++- ...otlinTargetContainerWithPresetFunctions.kt | 17 +++- 3 files changed, 103 insertions(+), 33 deletions(-) diff --git a/libraries/tools/kotlin-gradle-plugin-dsl-codegen/src/main/kotlin/org/jetbrains/kotlin/generators/gradle/dsl/mppPresetFunctionsCodegen.kt b/libraries/tools/kotlin-gradle-plugin-dsl-codegen/src/main/kotlin/org/jetbrains/kotlin/generators/gradle/dsl/mppPresetFunctionsCodegen.kt index 4175f17b3ba..448c4364baf 100644 --- a/libraries/tools/kotlin-gradle-plugin-dsl-codegen/src/main/kotlin/org/jetbrains/kotlin/generators/gradle/dsl/mppPresetFunctionsCodegen.kt +++ b/libraries/tools/kotlin-gradle-plugin-dsl-codegen/src/main/kotlin/org/jetbrains/kotlin/generators/gradle/dsl/mppPresetFunctionsCodegen.kt @@ -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() -} +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-dsl-codegen/src/main/kotlin/org/jetbrains/kotlin/generators/gradle/dsl/presetEntries.kt b/libraries/tools/kotlin-gradle-plugin-dsl-codegen/src/main/kotlin/org/jetbrains/kotlin/generators/gradle/dsl/presetEntries.kt index b1876e9e7be..128fb1d558a 100644 --- a/libraries/tools/kotlin-gradle-plugin-dsl-codegen/src/main/kotlin/org/jetbrains/kotlin/generators/gradle/dsl/presetEntries.kt +++ b/libraries/tools/kotlin-gradle-plugin-dsl-codegen/src/main/kotlin/org/jetbrains/kotlin/generators/gradle/dsl/presetEntries.kt @@ -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 = setOf(presetType, targetType) -internal fun KotlinPresetEntry.typeNames(): Set = 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 { + 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"), diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinTargetContainerWithPresetFunctions.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinTargetContainerWithPresetFunctions.kt index 46f7ca34c84..742ab4bc855 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinTargetContainerWithPresetFunctions.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinTargetContainerWithPresetFunctions.kt @@ -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, 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(