diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPlugin.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPlugin.kt index 5204bd82351..ae11a2306b8 100755 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPlugin.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPlugin.kt @@ -38,8 +38,8 @@ import org.jetbrains.kotlin.gradle.model.builder.KotlinModelBuilder import org.jetbrains.kotlin.gradle.plugin.mpp.* import org.jetbrains.kotlin.gradle.scripting.internal.ScriptingGradleSubplugin import org.jetbrains.kotlin.gradle.targets.js.dsl.BuildVariantKind +import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrCompilation import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrLink -import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrTarget import org.jetbrains.kotlin.gradle.targets.jvm.KotlinJvmTarget import org.jetbrains.kotlin.gradle.tasks.* import org.jetbrains.kotlin.gradle.tasks.KotlinCompile @@ -350,15 +350,15 @@ internal class KotlinJsIrSourceSetProcessor( it.dependsOn(kotlinTask) } - (kotlinCompilation.target as KotlinJsIrTarget).binaries - .matching { it.compilation == kotlinCompilation } - .all { binary -> - registerKotlinCompileTask( - binary.linkTaskName - ) { project, name, action -> - registerJsLink(project, name, binary.type, action) - } + val compilation = kotlinCompilation as KotlinJsIrCompilation + + compilation.binaries.all { binary -> + registerKotlinCompileTask( + binary.linkTaskName + ) { project, name, action -> + registerJsLink(project, name, binary.type, action) } + } // outputFile can be set later during the configuration phase, get it only after the phase: project.runOnceAfterEvaluated("KotlinJsIrSourceSetProcessor.doTargetSpecificProcessing", kotlinTask) { 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 index a3eb82f5657..3eaed798e89 100644 --- 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 @@ -8,14 +8,13 @@ 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.targets.js.dsl.BuildVariantKind import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName sealed class JsBinary( + internal val target: KotlinTarget, internal val name: String, - internal val type: BuildVariantKind, - internal val compilation: KotlinJsCompilation + internal val type: BuildVariantKind ) { val linkTaskName: String = linkTaskName() @@ -33,29 +32,26 @@ sealed class JsBinary( target.targetName ) - val target: KotlinTarget - get() = compilation.target - val project: Project get() = target.project } class Executable( + target: KotlinTarget, name: String, - type: BuildVariantKind, - compilation: KotlinJsCompilation + type: BuildVariantKind ) : JsBinary( + target, name, - type, - compilation + type ) class TestExecutable( + target: KotlinTarget, name: String, - type: BuildVariantKind, - compilation: KotlinJsCompilation + type: BuildVariantKind ) : JsBinary( + target, name, - type, - compilation + type ) \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinBrowserJsIr.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinBrowserJsIr.kt index ecca955dfe6..72268325893 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinBrowserJsIr.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinBrowserJsIr.kt @@ -62,13 +62,12 @@ open class KotlinBrowserJsIr @Inject constructor(target: KotlinJsIrTarget) : override fun configureRun( compilation: KotlinJsIrCompilation ) { - val project = compilation.target.project val nodeJs = NodeJsRootPlugin.apply(project.rootProject) val commonRunTask = project.registerTask(disambiguateCamelCased(RUN_TASK_NAME)) {} - binaries.getBinaries(compilation).all { binary -> + compilation.binaries.all { binary -> val type = binary.type val runTask = project.registerTask( @@ -136,15 +135,7 @@ open class KotlinBrowserJsIr @Inject constructor(target: KotlinJsIrTarget) : val assembleTask = project.tasks.getByName(LifecycleBasePlugin.ASSEMBLE_TASK_NAME) assembleTask.dependsOn(distributeResourcesTask) - val webpackCommonTask = project.registerTask(disambiguateCamelCased(WEBPACK_TASK_NAME)) { - } - - project.registerTask(disambiguateCamelCased(DISTRIBUTION_TASK_NAME)) { - it.dependsOn(webpackCommonTask) - it.dependsOn(distributeResourcesTask) - } - - binaries.getBinaries(compilation).all { binary -> + compilation.binaries.all { binary -> val type = binary.type val webpackTask = project.registerTask( disambiguateCamelCased( @@ -172,9 +163,13 @@ open class KotlinBrowserJsIr @Inject constructor(target: KotlinJsIrTarget) : if (type == BuildVariantKind.PRODUCTION) { assembleTask.dependsOn(webpackTask) - webpackCommonTask.configure { + val webpackCommonTask = project.registerTask(disambiguateCamelCased(WEBPACK_TASK_NAME)) { it.dependsOn(webpackTask) } + project.registerTask(disambiguateCamelCased(DISTRIBUTION_TASK_NAME)) { + it.dependsOn(webpackCommonTask) + it.dependsOn(distributeResourcesTask) + } } } } 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 330299a688e..8b8967c35d4 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 @@ -9,8 +9,8 @@ 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.KotlinTarget import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinBinaryContainer -import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation import org.jetbrains.kotlin.gradle.targets.js.dsl.BuildVariantKind import org.jetbrains.kotlin.gradle.targets.js.dsl.BuildVariantKind.DEVELOPMENT import org.jetbrains.kotlin.gradle.targets.js.dsl.BuildVariantKind.PRODUCTION @@ -21,7 +21,7 @@ import javax.inject.Inject open class KotlinJsBinaryContainer @Inject constructor( - val target: KotlinBinaryContainer, + val target: KotlinBinaryContainer, backingContainer: DomainObjectSet ) : DomainObjectSet by backingContainer { val project: Project @@ -29,46 +29,28 @@ constructor( private val binaryNames = mutableSetOf() - private val defaultCompilation: KotlinJsCompilation + private val defaultCompilation: KotlinJsIrCompilation get() = target.compilations.getByName(KotlinCompilation.MAIN_COMPILATION_NAME) - private val defaultTestCompilation: KotlinJsCompilation - get() = target.compilations.getByName(KotlinCompilation.TEST_COMPILATION_NAME) - fun executable( - compilation: KotlinJsCompilation = defaultCompilation - ) = createBinaries( - compilation = compilation, + compilation: KotlinJsIrCompilation = defaultCompilation + ) = compilation.binaries.executable() + + internal fun executable() = createBinaries( jsBinaryType = JsBinaryType.EXECUTABLE, create = ::Executable ) - internal fun testExecutable() = createBinaries( - compilation = defaultTestCompilation, - jsBinaryType = JsBinaryType.TEST, - create = ::TestExecutable - ) - - internal fun getBinaries( - compilation: KotlinJsCompilation - ): DomainObjectSet = - matching { it.compilation == compilation } - internal fun getBinary( - compilation: KotlinJsCompilation, buildVariantKind: BuildVariantKind ): JsBinary = - getBinaries( - compilation - ).matching { it.type == buildVariantKind } + matching { it.type == buildVariantKind } .single() - private fun createBinaries( - compilation: KotlinJsCompilation, buildVariantKinds: Collection = listOf(PRODUCTION, DEVELOPMENT), jsBinaryType: JsBinaryType, - create: (name: String, buildVariantKind: BuildVariantKind, compilation: KotlinJsCompilation) -> T + create: (target: KotlinTarget, name: String, buildVariantKind: BuildVariantKind) -> T ) { buildVariantKinds.forEach { buildVariantKind -> val name = generateBinaryName( @@ -80,7 +62,7 @@ constructor( "Cannot create binary $name: binary with such a name already exists" } - val binary = create(name, buildVariantKind, compilation) + val binary = create(target, name, buildVariantKind) add(binary) // Allow accessing binaries as properties of the container in Groovy DSL. if (this is ExtensionAware) { diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrCompilation.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrCompilation.kt index f707c041bf8..16617071a15 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrCompilation.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrCompilation.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.gradle.targets.js.ir import org.gradle.api.file.SourceDirectorySet +import org.gradle.util.WrapUtil import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet import org.jetbrains.kotlin.gradle.plugin.KotlinTarget import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation @@ -16,6 +17,13 @@ class KotlinJsIrCompilation( name: String ) : KotlinJsCompilation(target, name) { + internal val binaries: KotlinJsBinaryContainer = + target.project.objects.newInstance( + KotlinJsBinaryContainer::class.java, + this, + WrapUtil.toDomainObjectSet(JsBinary::class.java) + ) + internal val allSources: MutableSet = mutableSetOf() override fun addSourcesToCompileTask(sourceSet: KotlinSourceSet, addAsCommonSources: Lazy) { diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrSubTarget.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrSubTarget.kt index 8bab9c7cc35..d5fdedc9c53 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrSubTarget.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrSubTarget.kt @@ -36,21 +36,18 @@ abstract class KotlinJsIrSubTarget( final override lateinit var testRuns: NamedDomainObjectContainer private set - protected val binaries: KotlinJsBinaryContainer - get() = target.binaries - internal fun configure() { - target.binaries.testExecutable() - NpmResolverPlugin.apply(project) configureBuildVariants() configureTests() - binaries.all { binary -> - val npmProject = binary.compilation.npmProject - binary.linkTask.configure { - it.kotlinOptions.outputFile = npmProject.dir.resolve(npmProject.main).canonicalPath + target.compilations.all { + val npmProject = it.npmProject + it.binaries.all { binary -> + binary.linkTask.configure { + it.kotlinOptions.outputFile = npmProject.dir.resolve(npmProject.main).canonicalPath + } } } } @@ -79,6 +76,7 @@ abstract class KotlinJsIrSubTarget( protected open fun configureTestRunDefaults(testRun: KotlinJsPlatformTestRun) { target.compilations.matching { it.name == KotlinCompilation.TEST_COMPILATION_NAME }.all { compilation -> + compilation.binaries.executable() configureTestsRun(testRun, compilation) } } @@ -95,8 +93,7 @@ abstract class KotlinJsIrSubTarget( testJs.group = LifecycleBasePlugin.VERIFICATION_GROUP testJs.description = testTaskDescription - val testExecutableTask = binaries.getBinary( - compilation, + val testExecutableTask = compilation.binaries.getBinary( BuildVariantKind.DEVELOPMENT ).linkTask 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 a1d8d8c1a14..c8beb2aeb4d 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,9 +8,9 @@ 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.plugin.AbstractKotlinTargetConfigurator.Companion.runTaskNameSuffix import org.jetbrains.kotlin.gradle.plugin.KotlinJsCompilerType +import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation.Companion.MAIN_COMPILATION_NAME import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType import org.jetbrains.kotlin.gradle.plugin.KotlinTargetWithTests import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinBinaryContainer @@ -48,23 +48,11 @@ 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).apply { - matching { it is Executable }.all { - whenBrowserConfigured { - (this as KotlinJsIrSubTarget).produceExecutable() - } - - whenNodejsConfigured { - (this as KotlinJsIrSubTarget).produceExecutable() - } - } - } - ) + override val binaries: KotlinJsBinaryContainer + get() = compilations.withType(KotlinJsIrCompilation::class.java) + .named(MAIN_COMPILATION_NAME) + .map { it.binaries } + .get() private val runTaskName get() = lowerCamelCaseName(disambiguationClassifier, runTaskNameSuffix) val runTask: Task diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinNodeJsIr.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinNodeJsIr.kt index f84589327be..5182e0564cc 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinNodeJsIr.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinNodeJsIr.kt @@ -31,7 +31,7 @@ open class KotlinNodeJsIr @Inject constructor(target: KotlinJsIrTarget) : override fun configureRun( compilation: KotlinJsIrCompilation ) { - val developmentExecutable = binaries.getBinary(compilation, BuildVariantKind.DEVELOPMENT) + val developmentExecutable = compilation.binaries.getBinary(BuildVariantKind.DEVELOPMENT) val runTaskHolder = NodeJsExec.create(compilation, disambiguateCamelCased(RUN_TASK_NAME)) { inputFileProperty.set(developmentExecutable.linkTask.map { it.outputFileProperty.get() }) @@ -42,7 +42,7 @@ open class KotlinNodeJsIr @Inject constructor(target: KotlinJsIrTarget) : override fun configureBuild( compilation: KotlinJsIrCompilation ) { - val productionExecutable = binaries.getBinary(compilation, BuildVariantKind.PRODUCTION) + val productionExecutable = compilation.binaries.getBinary(BuildVariantKind.PRODUCTION) val assembleTask = project.tasks.getByName(LifecycleBasePlugin.ASSEMBLE_TASK_NAME) assembleTask.dependsOn(productionExecutable.linkTask)