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 7ca88bc3953..4175f17b3ba 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 @@ -7,7 +7,6 @@ package org.jetbrains.kotlin.generators.gradle.dsl import groovy.lang.Closure import org.gradle.util.ConfigureUtil -import org.jetbrains.kotlin.gradle.plugin.KotlinJsCompilerTypeHolder import org.jetbrains.kotlin.gradle.plugin.KotlinTargetsContainerWithPresets import java.io.File @@ -15,29 +14,25 @@ fun main() { generateKotlinTargetContainerWithPresetFunctionsInterface() } -private val parentInterfaces = listOf( - KotlinTargetsContainerWithPresets::class, - KotlinJsCompilerTypeHolder::class -) +private val parentInterface = KotlinTargetsContainerWithPresets::class private val presetsProperty = KotlinTargetsContainerWithPresets::presets.name private fun generateKotlinTargetContainerWithPresetFunctionsInterface() { // Generate KotlinMultiplatformExtension subclass with member functions for the presets: val functions = allPresetEntries.map { - it.generatePresetFunctions(presetsProperty, "configureOrCreate") + generatePresetFunctions(it, presetsProperty, "configureOrCreate") } - val parentInterfaceNames = - parentInterfaces.map { typeName(it.java.canonicalName) } - + val parentInterfaceName = + typeName(parentInterface.java.canonicalName) val className = typeName("org.jetbrains.kotlin.gradle.dsl.KotlinTargetContainerWithPresetFunctions") val imports = allPresetEntries .flatMap { it.typeNames() } - .plus(parentInterfaceNames) + .plus(parentInterfaceName) .plus(typeName(ConfigureUtil::class.java.canonicalName)) .plus(typeName(Closure::class.java.canonicalName)) .filter { it.packageName() != className.packageName() } @@ -51,7 +46,7 @@ private fun generateKotlinTargetContainerWithPresetFunctionsInterface() { "package ${className.packageName()}", imports, generatedCodeWarning, - "interface ${className.renderShort()} : ${parentInterfaceNames.joinToString { it.renderShort() }} {", + "interface ${className.renderShort()} : ${parentInterfaceName.renderShort()} {", functions.joinToString("\n\n") { it.indented(4) }, "}" ).joinToString("\n\n") @@ -59,4 +54,28 @@ 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) -} \ No newline at end of file +} + +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() +} 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 749912df340..4c399d9ad4a 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,100 +7,17 @@ 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 open class KotlinPresetEntry( +internal class KotlinPresetEntry( val presetName: String, val presetType: TypeName, val targetType: TypeName -) { - open fun 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 = defaultJsCompilerType, - 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 = name, compiler = defaultJsCompilerType, 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 fun KotlinPresetEntry.typeNames(): Set = setOf(presetType, targetType) internal const val MPP_PACKAGE = "org.jetbrains.kotlin.gradle.plugin.mpp" @@ -124,13 +41,6 @@ internal val jvmPresetEntry = KotlinPresetEntry( typeName("org.jetbrains.kotlin.gradle.targets.jvm.KotlinJvmTarget") ) -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"), - typeName("org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinJsTargetDsl") -) - internal val androidPresetEntry = KotlinPresetEntry( "android", typeName("$MPP_PACKAGE.KotlinAndroidTargetPreset"), @@ -160,6 +70,5 @@ internal val nativePresetEntries = HostManager().targets internal val allPresetEntries = listOf( jvmPresetEntry, - jsPresetEntry, androidPresetEntry ) + nativePresetEntries \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinMultiplatformExtension.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinMultiplatformExtension.kt index a5539fdaed0..78dccb40787 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinMultiplatformExtension.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinMultiplatformExtension.kt @@ -18,6 +18,7 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.* open class KotlinMultiplatformExtension : KotlinProjectExtension(), KotlinTargetContainerWithPresetFunctions, + KotlinTargetContainerWithJsPresetFunctions, KotlinTargetContainerWithNativeShortcuts { override lateinit var presets: NamedDomainObjectCollection> internal set @@ -83,9 +84,9 @@ internal fun KotlinTargetsContainerWithPresets.configureOrCre else -> { throw InvalidUserCodeException( "The target '$targetName' already exists, but it was not created with the '${targetPreset.name}' preset. " + - "To configure it, access it by name in `kotlin.targets`" + - " or use the preset function '${existingTarget.preset?.name}'." - .takeIf { existingTarget.preset != null } ?: "." + "To configure it, access it by name in `kotlin.targets`" + + " or use the preset function '${existingTarget.preset?.name}'." + .takeIf { existingTarget.preset != null } ?: "." ) } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinTargetContainerWithJsPresetFunctions.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinTargetContainerWithJsPresetFunctions.kt new file mode 100644 index 00000000000..11e117580cf --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinTargetContainerWithJsPresetFunctions.kt @@ -0,0 +1,45 @@ +package org.jetbrains.kotlin.gradle.dsl + +import groovy.lang.Closure +import org.gradle.util.ConfigureUtil +import org.jetbrains.kotlin.gradle.plugin.JsCompilerType +import org.jetbrains.kotlin.gradle.plugin.KotlinJsCompilerTypeHolder +import org.jetbrains.kotlin.gradle.plugin.KotlinTargetPreset +import org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinJsTargetDsl +import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName + +interface KotlinTargetContainerWithJsPresetFunctions : + KotlinTargetContainerWithPresetFunctions, + KotlinJsCompilerTypeHolder { + fun js( + name: String = "js", + compiler: JsCompilerType = defaultJsCompilerType, + configure: KotlinJsTargetDsl.() -> Unit = { } + ): KotlinJsTargetDsl = + configureOrCreate( + lowerCamelCaseName(name, if (compiler == JsCompilerType.both) JsCompilerType.legacy.name else null), + presets.getByName( + lowerCamelCaseName( + "js", + if (compiler == JsCompilerType.legacy) null else compiler.name + ) + ) as KotlinTargetPreset, + configure + ) + + fun js( + name: String = "js", + configure: KotlinJsTargetDsl.() -> Unit = { } + ) = js(name = name, compiler = defaultJsCompilerType, 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) } +} \ No newline at end of file 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 5107f623a2a..c80d377663e 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 @@ -2,18 +2,13 @@ package org.jetbrains.kotlin.gradle.dsl import groovy.lang.Closure import org.gradle.util.ConfigureUtil -import org.jetbrains.kotlin.gradle.plugin.JsCompilerType -import org.jetbrains.kotlin.gradle.plugin.KotlinJsCompilerTypeHolder -import org.jetbrains.kotlin.gradle.plugin.KotlinTargetPreset import org.jetbrains.kotlin.gradle.plugin.KotlinTargetsContainerWithPresets import org.jetbrains.kotlin.gradle.plugin.mpp.* -import org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinJsTargetDsl import org.jetbrains.kotlin.gradle.targets.jvm.KotlinJvmTarget -import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName // DO NOT EDIT MANUALLY! Generated by org.jetbrains.kotlin.generators.gradle.dsl.MppPresetFunctionsCodegenKt -interface KotlinTargetContainerWithPresetFunctions : KotlinTargetsContainerWithPresets, KotlinJsCompilerTypeHolder { +interface KotlinTargetContainerWithPresetFunctions : KotlinTargetsContainerWithPresets { fun jvm( name: String = "jvm", @@ -30,38 +25,6 @@ interface KotlinTargetContainerWithPresetFunctions : KotlinTargetsContainerWithP fun jvm(name: String, configure: Closure<*>) = jvm(name) { ConfigureUtil.configure(configure, this) } fun jvm(configure: Closure<*>) = jvm { ConfigureUtil.configure(configure, this) } - fun js( - name: String = "js", - compiler: JsCompilerType = defaultJsCompilerType, - configure: KotlinJsTargetDsl.() -> Unit = { } - ): KotlinJsTargetDsl = - configureOrCreate( - lowerCamelCaseName(name, if (compiler == JsCompilerType.both) JsCompilerType.legacy.name else null), - presets.getByName( - lowerCamelCaseName( - "js", - if (compiler == JsCompilerType.legacy) null else compiler.name - ) - ) as KotlinTargetPreset, - configure - ) - - fun js( - name: String = "js", - configure: KotlinJsTargetDsl.() -> Unit = { } - ) = js(name = name, compiler = defaultJsCompilerType, 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( name: String = "android", configure: KotlinAndroidTarget.() -> Unit = { }