diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinTargetConfigurator.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinTargetConfigurator.kt index e2483a6d486..1840432acdd 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinTargetConfigurator.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinTargetConfigurator.kt @@ -18,6 +18,7 @@ import org.gradle.api.file.FileCollection import org.gradle.api.internal.artifacts.ArtifactAttributes import org.gradle.api.internal.plugins.DslObject import org.gradle.api.plugins.BasePlugin +import org.gradle.api.plugins.ExtensionAware import org.gradle.api.plugins.JavaBasePlugin import org.gradle.api.tasks.Delete import org.gradle.api.tasks.bundling.Jar @@ -410,14 +411,13 @@ internal interface KotlinTargetWithTestsConfigurator, "override the $testRunsPropertyName property with a var." ) + val testRunsContainer = project.container(testRunClass) { testRunName -> createTestRun(testRunName, target) } + @Suppress("UNCHECKED_CAST") (mutableProperty as KMutableProperty1, NamedDomainObjectContainer>) - .set( - target, - project.container(testRunClass) { testRunName -> - createTestRun(testRunName, target) - } - ) + .set(target, testRunsContainer) + + (target as ExtensionAware).extensions.add(target::testRuns.name, testRunsContainer) } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinMetadataTarget.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinMetadataTarget.kt index a909772fd48..cb93f861a9b 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinMetadataTarget.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinMetadataTarget.kt @@ -17,10 +17,12 @@ import org.jetbrains.kotlin.gradle.plugin.sources.sourceSetDependencyConfigurati import org.jetbrains.kotlin.gradle.targets.metadata.KotlinMetadataTargetConfigurator import org.jetbrains.kotlin.gradle.targets.metadata.isKotlinGranularMetadataEnabled import org.jetbrains.kotlin.gradle.utils.isGradleVersionAtLeast +import javax.inject.Inject internal const val COMMON_MAIN_ELEMENTS_CONFIGURATION_NAME = "commonMainMetadataElements" -open class KotlinMetadataTarget(project: Project) : KotlinOnlyTarget(project, KotlinPlatformType.common) { +open class KotlinMetadataTarget @Inject constructor(project: Project) : + KotlinOnlyTarget(project, KotlinPlatformType.common) { override val kotlinComponents: Set by lazy { if (!project.isKotlinGranularMetadataEnabled) super.kotlinComponents diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsTarget.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsTarget.kt index aa371623086..d08f63992a5 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsTarget.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsTarget.kt @@ -21,8 +21,9 @@ import org.jetbrains.kotlin.gradle.tasks.locateTask import org.jetbrains.kotlin.gradle.testing.internal.KotlinTestReport import org.jetbrains.kotlin.gradle.testing.testTaskName import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName +import javax.inject.Inject -class KotlinJsTarget(project: Project, platformType: KotlinPlatformType) : +open class KotlinJsTarget @Inject constructor(project: Project, platformType: KotlinPlatformType) : KotlinOnlyTarget(project, platformType), KotlinTargetWithTests, KotlinJsTargetDsl @@ -41,7 +42,7 @@ class KotlinJsTarget(project: Project, platformType: KotlinPlatformType) : } private val browserLazyDelegate = lazy { - KotlinBrowserJs(this).also { + project.objects.newInstance(KotlinBrowserJs::class.java, this).also { it.configure() browserConfiguredHandlers.forEach { handler -> handler(it) } browserConfiguredHandlers.clear() @@ -59,7 +60,7 @@ class KotlinJsTarget(project: Project, platformType: KotlinPlatformType) : } private val nodejsLazyDelegate = lazy { - KotlinNodeJs(this).also { + project.objects.newInstance(KotlinNodeJs::class.java, this).also { it.configure() nodejsConfiguredHandlers.forEach { handler -> handler(it) } nodejsConfiguredHandlers.clear() diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsTargetPreset.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsTargetPreset.kt index 18d28a7f121..dc3197b9db9 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsTargetPreset.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsTargetPreset.kt @@ -23,7 +23,9 @@ open class KotlinJsTargetPreset( override val platformType: KotlinPlatformType get() = KotlinPlatformType.js - override fun instantiateTarget() = KotlinJsTarget(project, platformType) + override fun instantiateTarget(): KotlinJsTarget { + return project.objects.newInstance(KotlinJsTarget::class.java, project, platformType) + } override fun createKotlinTargetConfigurator() = KotlinJsTargetConfigurator(kotlinPluginVersion) diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/subtargets/KotlinBrowserJs.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/subtargets/KotlinBrowserJs.kt index 805d4b1aed9..e9060ae1955 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/subtargets/KotlinBrowserJs.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/subtargets/KotlinBrowserJs.kt @@ -14,8 +14,9 @@ import org.jetbrains.kotlin.gradle.targets.js.testing.KotlinJsTest import org.jetbrains.kotlin.gradle.targets.js.webpack.KotlinWebpack import org.jetbrains.kotlin.gradle.targets.js.webpack.KotlinWebpackConfig import org.jetbrains.kotlin.gradle.tasks.createOrRegisterTask +import javax.inject.Inject -class KotlinBrowserJs(target: KotlinJsTarget) : +open class KotlinBrowserJs @Inject constructor(target: KotlinJsTarget) : KotlinJsSubTarget(target, "browser"), KotlinJsBrowserDsl { diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/subtargets/KotlinJsSubTarget.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/subtargets/KotlinJsSubTarget.kt index e43f8085833..85ed476d972 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/subtargets/KotlinJsSubTarget.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/subtargets/KotlinJsSubTarget.kt @@ -7,6 +7,7 @@ package org.jetbrains.kotlin.gradle.targets.js.subtargets import org.gradle.api.NamedDomainObjectContainer import org.gradle.api.tasks.TaskProvider +import org.gradle.api.plugins.ExtensionAware import org.gradle.language.base.plugins.LifecycleBasePlugin import org.jetbrains.kotlin.gradle.plugin.* import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation @@ -34,8 +35,8 @@ abstract class KotlinJsSubTarget( val runTaskName = disambiguateCamelCased("run") val testTaskName = disambiguateCamelCased("test") - override val testRuns: NamedDomainObjectContainer = - project.container(KotlinJsPlatformTestRun::class.java) { name -> KotlinJsPlatformTestRun(name, this) } + final override lateinit var testRuns: NamedDomainObjectContainer + private set fun configure() { NpmResolverPlugin.apply(project) @@ -53,6 +54,10 @@ abstract class KotlinJsSubTarget( lowerCamelCaseName(target.disambiguationClassifier, disambiguationClassifier, name) private fun configureTests() { + testRuns = project.container(KotlinJsPlatformTestRun::class.java) { name -> KotlinJsPlatformTestRun(name, this) }.also { + (this as ExtensionAware).extensions.add(this::testRuns.name, it) + } + testRuns.all { configureTestRunDefaults(it) } testRuns.create(KotlinTargetWithTests.DEFAULT_TEST_RUN_NAME) } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/subtargets/KotlinNodeJs.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/subtargets/KotlinNodeJs.kt index 828888e5f44..2cfff75b1da 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/subtargets/KotlinNodeJs.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/subtargets/KotlinNodeJs.kt @@ -10,8 +10,9 @@ import org.jetbrains.kotlin.gradle.targets.js.KotlinJsTarget import org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinJsNodeDsl import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsExec import org.jetbrains.kotlin.gradle.targets.js.testing.KotlinJsTest +import javax.inject.Inject -class KotlinNodeJs(target: KotlinJsTarget) : +open class KotlinNodeJs @Inject constructor(target: KotlinJsTarget) : KotlinJsSubTarget(target, "node"), KotlinJsNodeDsl { diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/jvm/KotlinJvmTarget.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/jvm/KotlinJvmTarget.kt index 386d6cb1468..764d2e3182a 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/jvm/KotlinJvmTarget.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/jvm/KotlinJvmTarget.kt @@ -21,8 +21,9 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJvmCompilation import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinOnlyTarget import org.jetbrains.kotlin.gradle.utils.addExtendsFromRelation import java.util.concurrent.Callable +import javax.inject.Inject -class KotlinJvmTarget( +open class KotlinJvmTarget @Inject constructor( project: Project ) : KotlinOnlyTarget(project, KotlinPlatformType.jvm), KotlinTargetWithTests { diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/jvm/KotlinJvmTargetPreset.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/jvm/KotlinJvmTargetPreset.kt index ac0d27267c5..e330d3afa8c 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/jvm/KotlinJvmTargetPreset.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/jvm/KotlinJvmTargetPreset.kt @@ -18,7 +18,9 @@ class KotlinJvmTargetPreset( project, kotlinPluginVersion ) { - override fun instantiateTarget(): KotlinJvmTarget = KotlinJvmTarget(project) + override fun instantiateTarget(): KotlinJvmTarget { + return project.objects.newInstance(KotlinJvmTarget::class.java, project) + } override fun getName(): String = PRESET_NAME diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/metadata/KotlinMetadataTargetPreset.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/metadata/KotlinMetadataTargetPreset.kt index 9bdf65bfaa6..04e06db002d 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/metadata/KotlinMetadataTargetPreset.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/metadata/KotlinMetadataTargetPreset.kt @@ -37,7 +37,9 @@ class KotlinMetadataTargetPreset( override fun createKotlinTargetConfigurator(): KotlinOnlyTargetConfigurator = KotlinMetadataTargetConfigurator(kotlinPluginVersion) - override fun instantiateTarget(): KotlinMetadataTarget = KotlinMetadataTarget(project) + override fun instantiateTarget(): KotlinMetadataTarget { + return project.objects.newInstance(KotlinMetadataTarget::class.java, project) + } override fun createTarget(name: String): KotlinMetadataTarget = super.createTarget(name).apply { diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeTarget.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeTarget.kt index 5b0481147d3..7b18ecb899e 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeTarget.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeTarget.kt @@ -19,8 +19,9 @@ import org.jetbrains.kotlin.gradle.targets.native.KotlinNativeBinaryTestRun import org.jetbrains.kotlin.gradle.targets.native.NativeBinaryTestRunSource import org.jetbrains.kotlin.gradle.utils.isGradleVersionAtLeast import org.jetbrains.kotlin.konan.target.KonanTarget +import javax.inject.Inject -open class KotlinNativeTarget( +open class KotlinNativeTarget @Inject constructor( project: Project, val konanTarget: KonanTarget ) : KotlinOnlyTarget(project, KotlinPlatformType.native) { @@ -64,7 +65,7 @@ open class KotlinNativeTarget( } } -open class KotlinNativeTargetWithTests( +open class KotlinNativeTargetWithTests @Inject constructor( project: Project, konanTarget: KonanTarget ) : KotlinNativeTarget(project, konanTarget), KotlinTargetWithTests { diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeTargetPreset.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeTargetPreset.kt index 107983bed8e..a408326954d 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeTargetPreset.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeTargetPreset.kt @@ -124,7 +124,9 @@ open class KotlinNativeTargetPreset(name: String, project: Project, konanTarget: override fun createTargetConfigurator(): KotlinTargetConfigurator = KotlinNativeTargetConfigurator(kotlinPluginVersion) - override fun instantiateTarget(name: String): KotlinNativeTarget = KotlinNativeTarget(project, konanTarget) + override fun instantiateTarget(name: String): KotlinNativeTarget { + return project.objects.newInstance(KotlinNativeTarget::class.java, project, konanTarget) + } } open class KotlinNativeTargetWithTestsPreset(name: String, project: Project, konanTarget: KonanTarget, kotlinPluginVersion: String) : @@ -133,7 +135,9 @@ open class KotlinNativeTargetWithTestsPreset(name: String, project: Project, kon override fun createTargetConfigurator(): KotlinTargetConfigurator = KotlinNativeTargetWithTestsConfigurator(kotlinPluginVersion) - override fun instantiateTarget(name: String): KotlinNativeTargetWithTests = KotlinNativeTargetWithTests(project, konanTarget) + override fun instantiateTarget(name: String): KotlinNativeTargetWithTests { + return project.objects.newInstance(KotlinNativeTargetWithTests::class.java, project, konanTarget) + } } internal val KonanTarget.isCurrentHost: Boolean