From 9d3234495e171b5fe455c4279827d5371eccd9d7 Mon Sep 17 00:00:00 2001 From: Ilya Goncharov Date: Tue, 11 Feb 2020 19:04:28 +0300 Subject: [PATCH] [Gradle, JS] Add binaries for javascript --- .../kotlin/gradle/targets/js/ir/JsBinary.kt | 22 +++++++ .../targets/js/ir/KotlinJsBinaryContainer.kt | 66 +++++++++++++++++++ .../gradle/targets/js/ir/KotlinJsIrTarget.kt | 15 ++++- 3 files changed, 102 insertions(+), 1 deletion(-) create mode 100644 libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/JsBinary.kt create mode 100644 libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsBinaryContainer.kt diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/JsBinary.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/JsBinary.kt new file mode 100644 index 00000000000..59c0115844f --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/JsBinary.kt @@ -0,0 +1,22 @@ +/* + * 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.ir + +import org.jetbrains.kotlin.gradle.targets.js.dsl.BuildVariantKind + +sealed class JsBinary( + internal val name: String, + private val buildKind: BuildVariantKind +) + +class Executable( + name: String, + buildKind: BuildVariantKind, + compilation: KotlinJsIrCompilation +) : JsBinary( + name, + buildKind +) \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsBinaryContainer.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsBinaryContainer.kt new file mode 100644 index 00000000000..1d34590089a --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsBinaryContainer.kt @@ -0,0 +1,66 @@ +/* + * Copyright 2010-2018 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.ir + +import org.gradle.api.* +import org.gradle.api.plugins.ExtensionAware +import org.gradle.util.WrapUtil +import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation +import org.jetbrains.kotlin.gradle.plugin.mpp.* +import org.jetbrains.kotlin.gradle.targets.js.dsl.BuildVariantKind +import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName +import javax.inject.Inject + + +open class KotlinJsBinaryContainer +@Inject +constructor( + val target: KotlinJsIrTarget, + backingContainer: DomainObjectSet +) : DomainObjectSet by backingContainer +{ + val project: Project + get() = target.project + + private val defaultCompilation: KotlinJsIrCompilation + get() = target.compilations.getByName(KotlinCompilation.MAIN_COMPILATION_NAME) + + private val nameToBinary = mutableMapOf() + + fun executable( + buildTypes: Collection = listOf(BuildVariantKind.PRODUCTION, BuildVariantKind.DEVELOPMENT), + configure: Executable.() -> Unit = {} + ) = createBinaries(project.name, buildTypes, ::Executable, configure) + + private fun createBinaries( + baseName: String, + buildKinds: Collection, + create: (name: String, buildType: BuildVariantKind, compilation: KotlinJsIrCompilation) -> T, + configure: T.() -> Unit + ) { + buildKinds.forEach { buildKind -> + val name = generateBinaryName(baseName, buildKind) + + require(name !in nameToBinary) { + "Cannot create binary $name: binary with such a name already exists" + } + + val binary = create(baseName, buildKind, defaultCompilation) + add(binary) + nameToBinary[binary.name] = binary + // Allow accessing binaries as properties of the container in Groovy DSL. + if (this is ExtensionAware) { + extensions.add(binary.name, binary) + } + binary.configure() + } + } + + companion object { + internal fun generateBinaryName(name: String, buildKind: BuildVariantKind) = + lowerCamelCaseName(name, buildKind.name) + } +} diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrTarget.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrTarget.kt index dd94bfdd9d1..ab4e83926c3 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrTarget.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrTarget.kt @@ -8,11 +8,16 @@ package org.jetbrains.kotlin.gradle.targets.js.ir import org.gradle.api.NamedDomainObjectContainer import org.gradle.api.Project import org.gradle.api.Task +import org.gradle.util.WrapUtil +import org.jetbrains.kotlin.gradle.dsl.KotlinNativeBinaryContainer import org.jetbrains.kotlin.gradle.plugin.AbstractKotlinTargetConfigurator.Companion.runTaskNameSuffix import org.jetbrains.kotlin.gradle.plugin.KotlinJsCompilerType import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType import org.jetbrains.kotlin.gradle.plugin.KotlinTargetWithTests +import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinBinaryContainer +import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeCompilation import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinOnlyTarget +import org.jetbrains.kotlin.gradle.plugin.mpp.NativeBinary import org.jetbrains.kotlin.gradle.plugin.removeJsCompilerSuffix import org.jetbrains.kotlin.gradle.targets.js.JsAggregatingExecutionSource import org.jetbrains.kotlin.gradle.targets.js.KotlinJsProducingType @@ -29,7 +34,7 @@ constructor( platformType: KotlinPlatformType, internal val mixedMode: Boolean ) : - KotlinOnlyTarget(project, platformType), + KotlinBinaryContainer(project, platformType), KotlinTargetWithTests, KotlinJsTargetDsl, KotlinJsSubTargetContainerDsl { @@ -41,6 +46,14 @@ constructor( var producingType: KotlinJsProducingType? = null + override val binaries: KotlinJsBinaryContainer = + // Use newInstance to allow accessing binaries by their names in Groovy using the extension mechanism. + project.objects.newInstance( + KotlinJsBinaryContainer::class.java, + this, + WrapUtil.toDomainObjectSet(JsBinary::class.java) + ) + private val runTaskName get() = lowerCamelCaseName(disambiguationClassifier, runTaskNameSuffix) val runTask: Task get() = project.tasks.maybeCreate(runTaskName).also {