diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/JsBinaries.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/JsBinaries.kt new file mode 100644 index 00000000000..3412cc6d9fb --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/JsBinaries.kt @@ -0,0 +1,58 @@ +/* + * 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.gradle.api.Project +import org.gradle.api.tasks.TaskProvider +import org.jetbrains.kotlin.gradle.plugin.KotlinTarget +import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation +import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName + +sealed class JsBinary( + internal val name: String, + internal val type: KotlinJsIrType, + internal val compilation: KotlinJsCompilation +) { + val linkTaskName: String = linkTaskName(type) + + val linkTask: TaskProvider + get() = target.project.tasks.named(linkTaskName) as TaskProvider + + private fun linkTaskName(type: KotlinJsIrType): String = + lowerCamelCaseName( + "compile", + type.name.toLowerCase(), + name, + "Kotlin", + target.targetName + ) + + val target: KotlinTarget + get() = compilation.target + + val project: Project + get() = target.project +} + +class Executable( + name: String, + type: KotlinJsIrType, + compilation: KotlinJsCompilation +) : JsBinary( + name, + type, + compilation +) + +class TestExecutable( + name: String, + type: KotlinJsIrType, + compilation: KotlinJsCompilation +) : JsBinary( + name, + type, + compilation +) \ No newline at end of file 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/JsBinaryTypes.kt similarity index 69% rename from libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/JsBinary.kt rename to libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/JsBinaryTypes.kt index e30c212d1d8..0a7993f818c 100644 --- 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/JsBinaryTypes.kt @@ -5,12 +5,7 @@ package org.jetbrains.kotlin.gradle.targets.js.ir -sealed class JsBinary( - internal val name: String -) - -class Executable( - name: String -) : JsBinary( - name -) \ No newline at end of file +enum class JsBinaryType { + EXECUTABLE, + TEST +} \ 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 index 80d04555867..58a6b573ba5 100644 --- 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 @@ -8,8 +8,11 @@ package org.jetbrains.kotlin.gradle.targets.js.ir import org.gradle.api.DomainObjectSet import org.gradle.api.Project import org.gradle.api.plugins.ExtensionAware +import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinBinaryContainer import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation +import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrType.DEVELOPMENT +import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrType.PRODUCTION import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName import javax.inject.Inject @@ -25,29 +28,68 @@ constructor( private val nameToBinary = mutableMapOf() - fun executable() = createBinaries(project.name, ::Executable) + private val defaultCompilation: KotlinJsCompilation + get() = target.compilations.getByName(KotlinCompilation.MAIN_COMPILATION_NAME) + + private val defaultTestCompilation: KotlinJsCompilation + get() = target.compilations.getByName(KotlinCompilation.TEST_COMPILATION_NAME) + + fun executable() = createBinaries( + baseName = project.name, + jsBinaryType = JsBinaryType.EXECUTABLE, + create = ::Executable + ) + + internal fun testExecutable() = createBinaries( + baseName = project.name, + jsBinaryType = JsBinaryType.TEST, + create = ::TestExecutable + ) private fun createBinaries( baseName: String, - create: (name: String) -> T + buildVariantKinds: Collection = listOf(PRODUCTION, DEVELOPMENT), + jsBinaryType: JsBinaryType, + create: (name: String, buildVariantKind: KotlinJsIrType, compilation: KotlinJsCompilation) -> T ) { - val name = generateBinaryName(baseName) + buildVariantKinds.forEach { buildVariantKind -> + val name = generateBinaryName( + baseName, + buildVariantKind, + jsBinaryType + ) - require(name !in nameToBinary) { - "Cannot create binary $name: binary with such a name already exists" - } + require(name !in nameToBinary) { + "Cannot create binary $name: binary with such a name already exists" + } - val binary = create(baseName) - 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) + val compilation = if (jsBinaryType == JsBinaryType.TEST) { + defaultTestCompilation + } else { + defaultCompilation + } + + + val binary = create(baseName, buildVariantKind, compilation) + 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) + } } } companion object { - internal fun generateBinaryName(name: String) = - lowerCamelCaseName(name) + internal fun generateBinaryName( + name: String, + buildVariantKind: KotlinJsIrType, + jsBinaryType: JsBinaryType + ) = + lowerCamelCaseName( + name, + buildVariantKind.name, + jsBinaryType.name + ) } }