From e974d16e7a1197cd195638c5e05340a753a16ffa Mon Sep 17 00:00:00 2001 From: "konstantin.tskhovrebov" Date: Thu, 14 Apr 2022 18:04:34 +0200 Subject: [PATCH] Add KotlinArtifactsExtensionImpl code generator. --- .../build.gradle.kts | 11 +++ .../gradle/dsl/KotlinArtifactsDSLCodegen.kt | 81 +++++++++++++++++++ ...factDSL.kt => KotlinArtifactsExtension.kt} | 49 ----------- .../artifact/KotlinArtifactsExtensionImpl.kt | 59 ++++++++++++++ 4 files changed, 151 insertions(+), 49 deletions(-) create mode 100644 libraries/tools/kotlin-gradle-plugin-dsl-codegen/src/main/kotlin/org/jetbrains/kotlin/generators/gradle/dsl/KotlinArtifactsDSLCodegen.kt rename libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/artifact/{KotlinArtifactDSL.kt => KotlinArtifactsExtension.kt} (61%) create mode 100644 libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/artifact/KotlinArtifactsExtensionImpl.kt diff --git a/libraries/tools/kotlin-gradle-plugin-dsl-codegen/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-dsl-codegen/build.gradle.kts index cefafb122af..b0153bdccc2 100644 --- a/libraries/tools/kotlin-gradle-plugin-dsl-codegen/build.gradle.kts +++ b/libraries/tools/kotlin-gradle-plugin-dsl-codegen/build.gradle.kts @@ -24,6 +24,17 @@ val generateAbstractBinaryContainer by generator( group = generateGroupName } +val generateAbstractKotlinArtifactsExtensionImplementation by generator( + "org.jetbrains.kotlin.generators.gradle.dsl.KotlinArtifactsDSLCodegenKt", + sourceSets["main"] +) { + group = generateGroupName + systemProperty( + "org.jetbrains.kotlin.generators.gradle.dsl.outputSourceRoot", + project(":kotlin-gradle-plugin").projectDir.resolve("src/common/kotlin").absolutePath + ) +} + val generateKpmNativeVariants by generator( "org.jetbrains.kotlin.generators.gradle.dsl.KpmNativeVariantCodegenKt", sourceSets["main"] diff --git a/libraries/tools/kotlin-gradle-plugin-dsl-codegen/src/main/kotlin/org/jetbrains/kotlin/generators/gradle/dsl/KotlinArtifactsDSLCodegen.kt b/libraries/tools/kotlin-gradle-plugin-dsl-codegen/src/main/kotlin/org/jetbrains/kotlin/generators/gradle/dsl/KotlinArtifactsDSLCodegen.kt new file mode 100644 index 00000000000..230910b144b --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-dsl-codegen/src/main/kotlin/org/jetbrains/kotlin/generators/gradle/dsl/KotlinArtifactsDSLCodegen.kt @@ -0,0 +1,81 @@ +/* + * Copyright 2010-2022 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.generators.gradle.dsl + +import org.jetbrains.kotlin.gradle.plugin.mpp.BitcodeEmbeddingMode +import org.jetbrains.kotlin.gradle.plugin.mpp.NativeBuildType +import org.jetbrains.kotlin.konan.target.KonanTarget +import java.io.File + +fun main() { + generateAbstractKotlinArtifactsExtensionImplementation() +} + +private fun generateAbstractKotlinArtifactsExtensionImplementation() { + val className = typeName("org.jetbrains.kotlin.gradle.targets.native.tasks.artifact.KotlinArtifactsExtensionImpl") + + val imports = """ + import org.gradle.api.Project + import org.jetbrains.kotlin.gradle.dsl.KotlinArtifact + import org.jetbrains.kotlin.gradle.dsl.KotlinArtifactConfig + import org.jetbrains.kotlin.gradle.dsl.KotlinArtifactsExtension + import org.jetbrains.kotlin.gradle.plugin.mpp.BitcodeEmbeddingMode + import org.jetbrains.kotlin.gradle.plugin.mpp.NativeBuildType + import org.jetbrains.kotlin.konan.target.KonanTarget + import javax.inject.Inject + """.trimIndent() + + val generatedCodeWarning = "// DO NOT EDIT MANUALLY! Generated by ${object {}.javaClass.enclosingClass.name}" + + val overrides = listOf( + "override val artifactConfigs = project.objects.domainObjectSet(KotlinArtifactConfig::class.java)", + "override val artifacts = project.objects.namedDomainObjectSet(KotlinArtifact::class.java)", + "override val Native = project.objects.newInstance(KotlinNativeArtifactDSLImpl::class.java, project)" + ).joinToString("\n").indented(4) + + val buildTypeConstants = NativeBuildType.values().joinToString("\n") { + "val ${it.name} = NativeBuildType.${it.name}" + }.indented(4) + + val bitcodeModeConstants = BitcodeEmbeddingMode.values().joinToString( + separator = "\n", + prefix = "class BitcodeEmbeddingModeDsl {\n", + postfix = "\n}" + ) { + "val ${it.name} = BitcodeEmbeddingMode.${it.name}".indented(4) + }.indented(4) + + val bitcodeMode = listOf( + "@JvmField", + "val EmbedBitcodeMode = BitcodeEmbeddingModeDsl()" + ).joinToString("\n").indented(4) + + val konanTargetConstants = KonanTarget.predefinedTargets.values.joinToString("\n") { + val nameParts = it.name.split("_") + val name = nameParts.drop(1).joinToString( + separator = "", + prefix = nameParts.first(), + transform = String::capitalize + ) + "val $name = KonanTarget.${it.name.toUpperCase()}" + }.indented(4) + + val code = listOf( + "package ${className.packageName()}", + imports, + generatedCodeWarning, + "abstract class ${className.shortName()} @Inject constructor(project: Project) : KotlinArtifactsExtension {", + overrides, + buildTypeConstants, + bitcodeModeConstants, + bitcodeMode, + konanTargetConstants, + "}" + ).joinToString(separator = "\n\n") + + val targetFile = File("$outputSourceRoot/${className.fqName.replace(".", "/")}.kt") + targetFile.writeText(code) +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/artifact/KotlinArtifactDSL.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/artifact/KotlinArtifactsExtension.kt similarity index 61% rename from libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/artifact/KotlinArtifactDSL.kt rename to libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/artifact/KotlinArtifactsExtension.kt index 15f32b1385e..1ecc85ac83b 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/artifact/KotlinArtifactDSL.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/artifact/KotlinArtifactsExtension.kt @@ -6,14 +6,10 @@ package org.jetbrains.kotlin.gradle.targets.native.tasks.artifact import org.gradle.api.Action -import org.gradle.api.DomainObjectSet -import org.gradle.api.NamedDomainObjectSet import org.gradle.api.Project import org.gradle.api.plugins.ExtensionAware import org.jetbrains.kotlin.gradle.dsl.* -import org.jetbrains.kotlin.gradle.plugin.mpp.NativeBuildType import org.jetbrains.kotlin.gradle.utils.castIsolatedKotlinPluginClassLoaderAware -import org.jetbrains.kotlin.konan.target.KonanTarget import javax.inject.Inject private const val KOTLIN_ARTIFACTS_EXTENSION_NAME = "kotlinArtifacts" @@ -26,51 +22,6 @@ internal fun Project.registerKotlinArtifactsExtension() { val Project.kotlinArtifactsExtension: KotlinArtifactsExtension get() = extensions.getByName(KOTLIN_ARTIFACTS_EXTENSION_NAME).castIsolatedKotlinPluginClassLoaderAware() -abstract class KotlinArtifactsExtensionImpl @Inject constructor(project: Project) : KotlinArtifactsExtension { - override val artifactConfigs = project.objects.domainObjectSet(KotlinArtifactConfig::class.java) - override val artifacts = project.objects.namedDomainObjectSet(KotlinArtifact::class.java) - override val Native = project.objects.newInstance(KotlinNativeArtifactDSLImpl::class.java, project) - - val DEBUG = NativeBuildType.DEBUG - val RELEASE = NativeBuildType.RELEASE - - class BitcodeEmbeddingModeDsl { - val DISABLE = org.jetbrains.kotlin.gradle.plugin.mpp.BitcodeEmbeddingMode.DISABLE - val BITCODE = org.jetbrains.kotlin.gradle.plugin.mpp.BitcodeEmbeddingMode.BITCODE - val MARKER = org.jetbrains.kotlin.gradle.plugin.mpp.BitcodeEmbeddingMode.MARKER - } - - @JvmField - val EmbedBitcodeMode = BitcodeEmbeddingModeDsl() - - val androidX64 = KonanTarget.ANDROID_X64 - val androidX86 = KonanTarget.ANDROID_X86 - val androidArm32 = KonanTarget.ANDROID_ARM32 - val androidArm64 = KonanTarget.ANDROID_ARM64 - val iosArm32 = KonanTarget.IOS_ARM32 - val iosArm64 = KonanTarget.IOS_ARM64 - val iosX64 = KonanTarget.IOS_X64 - val iosSimulatorArm64 = KonanTarget.IOS_SIMULATOR_ARM64 - val watchosArm32 = KonanTarget.WATCHOS_ARM32 - val watchosArm64 = KonanTarget.WATCHOS_ARM64 - val watchosX86 = KonanTarget.WATCHOS_X86 - val watchosX64 = KonanTarget.WATCHOS_X64 - val watchosSimulatorArm64 = KonanTarget.WATCHOS_SIMULATOR_ARM64 - val tvosArm64 = KonanTarget.TVOS_ARM64 - val tvosX64 = KonanTarget.TVOS_X64 - val tvosSimulatorArm64 = KonanTarget.TVOS_SIMULATOR_ARM64 - val linuxX64 = KonanTarget.LINUX_X64 - val mingwX86 = KonanTarget.MINGW_X86 - val mingwX64 = KonanTarget.MINGW_X64 - val macosX64 = KonanTarget.MACOS_X64 - val macosArm64 = KonanTarget.MACOS_ARM64 - val linuxArm64 = KonanTarget.LINUX_ARM64 - val linuxArm32Hfp = KonanTarget.LINUX_ARM32_HFP - val linuxMips32 = KonanTarget.LINUX_MIPS32 - val linuxMipsel32 = KonanTarget.LINUX_MIPSEL32 - val wasm32 = KonanTarget.WASM32 -} - abstract class KotlinNativeArtifactDSLImpl @Inject constructor(private val project: Project) : KotlinNativeArtifactDSL { companion object { private val UNSAFE_NAME_SYMBOLS = """\W""".toRegex() diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/artifact/KotlinArtifactsExtensionImpl.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/artifact/KotlinArtifactsExtensionImpl.kt new file mode 100644 index 00000000000..552429cdc83 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/artifact/KotlinArtifactsExtensionImpl.kt @@ -0,0 +1,59 @@ +package org.jetbrains.kotlin.gradle.targets.native.tasks.artifact + +import org.gradle.api.Project +import org.jetbrains.kotlin.gradle.dsl.KotlinArtifact +import org.jetbrains.kotlin.gradle.dsl.KotlinArtifactConfig +import org.jetbrains.kotlin.gradle.dsl.KotlinArtifactsExtension +import org.jetbrains.kotlin.gradle.plugin.mpp.BitcodeEmbeddingMode +import org.jetbrains.kotlin.gradle.plugin.mpp.NativeBuildType +import org.jetbrains.kotlin.konan.target.KonanTarget +import javax.inject.Inject + +// DO NOT EDIT MANUALLY! Generated by org.jetbrains.kotlin.generators.gradle.dsl.KotlinArtifactsDSLCodegenKt + +abstract class KotlinArtifactsExtensionImpl @Inject constructor(project: Project) : KotlinArtifactsExtension { + + override val artifactConfigs = project.objects.domainObjectSet(KotlinArtifactConfig::class.java) + override val artifacts = project.objects.namedDomainObjectSet(KotlinArtifact::class.java) + override val Native = project.objects.newInstance(KotlinNativeArtifactDSLImpl::class.java, project) + + val RELEASE = NativeBuildType.RELEASE + val DEBUG = NativeBuildType.DEBUG + + class BitcodeEmbeddingModeDsl { + val DISABLE = BitcodeEmbeddingMode.DISABLE + val BITCODE = BitcodeEmbeddingMode.BITCODE + val MARKER = BitcodeEmbeddingMode.MARKER + } + + @JvmField + val EmbedBitcodeMode = BitcodeEmbeddingModeDsl() + + val androidX64 = KonanTarget.ANDROID_X64 + val androidX86 = KonanTarget.ANDROID_X86 + val androidArm32 = KonanTarget.ANDROID_ARM32 + val androidArm64 = KonanTarget.ANDROID_ARM64 + val iosArm32 = KonanTarget.IOS_ARM32 + val iosArm64 = KonanTarget.IOS_ARM64 + val iosX64 = KonanTarget.IOS_X64 + val iosSimulatorArm64 = KonanTarget.IOS_SIMULATOR_ARM64 + val watchosArm32 = KonanTarget.WATCHOS_ARM32 + val watchosArm64 = KonanTarget.WATCHOS_ARM64 + val watchosX86 = KonanTarget.WATCHOS_X86 + val watchosX64 = KonanTarget.WATCHOS_X64 + val watchosSimulatorArm64 = KonanTarget.WATCHOS_SIMULATOR_ARM64 + val tvosArm64 = KonanTarget.TVOS_ARM64 + val tvosX64 = KonanTarget.TVOS_X64 + val tvosSimulatorArm64 = KonanTarget.TVOS_SIMULATOR_ARM64 + val linuxX64 = KonanTarget.LINUX_X64 + val mingwX86 = KonanTarget.MINGW_X86 + val mingwX64 = KonanTarget.MINGW_X64 + val macosX64 = KonanTarget.MACOS_X64 + val macosArm64 = KonanTarget.MACOS_ARM64 + val linuxArm64 = KonanTarget.LINUX_ARM64 + val linuxArm32Hfp = KonanTarget.LINUX_ARM32_HFP + val linuxMips32 = KonanTarget.LINUX_MIPS32 + val linuxMipsel32 = KonanTarget.LINUX_MIPSEL32 + val wasm32 = KonanTarget.WASM32 + +} \ No newline at end of file