diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/Kotlin2JsGradlePluginIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/Kotlin2JsGradlePluginIT.kt index 1baa7ce9694..147f2f52c7f 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/Kotlin2JsGradlePluginIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/Kotlin2JsGradlePluginIT.kt @@ -349,4 +349,36 @@ class Kotlin2JsGradlePluginIT : BaseGradleIT() { assertNotContains(USING_JS_INCREMENTAL_COMPILATION_MESSAGE) } } + + @Test + fun testNewKotlinJsPlugin() = with(Project("kotlin-js-plugin-project", GradleVersionRequired.AtLeast("4.10.2"))) { + setupWorkingDir() + gradleBuildScript().modify(::transformBuildScriptWithPluginsDsl) + gradleSettingsScript().modify(::transformBuildScriptWithPluginsDsl) + + build("publish", "runDceKotlin", "test", "runDceBenchmarkKotlin") { + assertSuccessful() + + assertTasksExecuted( + ":compileKotlin", ":compileTestKotlin", ":compileBenchmarkKotlin", + ":runDceKotlin", ":runDceBenchmarkKotlin" + ) + + val moduleDir = "build/repo/com/example/kotlin-js-plugin/1.0/" + + val publishedJar = fileInWorkingDir(moduleDir + "kotlin-js-plugin-1.0.jar") + ZipFile(publishedJar).use { zip -> + val entries = zip.entries().asSequence().map { it.name } + assertTrue { "kotlin-js-plugin.js" in entries } + } + + val publishedPom = fileInWorkingDir(moduleDir + "kotlin-js-plugin-1.0.pom") + val kotlinVersion = defaultBuildOptions().kotlinVersion + val pomText = publishedPom.readText().replace(Regex("\\s+"), "") + assertTrue { "kotlinx-html-js0.6.10compile" in pomText } + assertTrue { "kotlin-stdlib-js$kotlinVersionruntime" in pomText } + + assertFileExists(moduleDir + "kotlin-js-plugin-1.0-sources.jar") + } + } } diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-plugin-project/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-plugin-project/build.gradle.kts new file mode 100644 index 00000000000..34cca234c8b --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-plugin-project/build.gradle.kts @@ -0,0 +1,47 @@ +plugins { + kotlin("js").version("") + id("kotlin-dce-js") + `maven-publish` +} + +group = "com.example" +version = "1.0" + +repositories { + mavenLocal() + jcenter() +} + +kotlin.sourceSets { + main { + dependencies { + api("org.jetbrains.kotlinx:kotlinx-html-js:0.6.10") + implementation(kotlin("stdlib-js")) + } + } + test { + dependencies { + implementation(kotlin("test-js")) + } + } +} + +kotlin.target.compilations.create("benchmark") { + defaultSourceSet.dependencies { + val main by kotlin.target.compilations + implementation(main.compileDependencyFiles + main.output.classesDirs) + runtimeOnly(main.runtimeDependencyFiles) + } +} + +publishing { + publications { + create("default", MavenPublication::class.java) { + from(kotlin.target.components.single()) + artifact(tasks.getByName("kotlinSourcesJar")) + } + } + repositories { + maven("$buildDir/repo") + } +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-plugin-project/settings.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-plugin-project/settings.gradle.kts new file mode 100644 index 00000000000..b6cdbb8e386 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-plugin-project/settings.gradle.kts @@ -0,0 +1,15 @@ +pluginManagement { + resolutionStrategy { + eachPlugin{ + when (requested.id.id) { + "kotlin-dce-js" -> useModule("org.jetbrains.kotlin:kotlin-gradle-plugin:") + } + } + } + repositories { + mavenLocal() + gradlePluginPortal() + } +} + +rootProject.name = "kotlin-js-plugin" \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-plugin-project/src/benchmark/kotlin/MainBenchmark.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-plugin-project/src/benchmark/kotlin/MainBenchmark.kt new file mode 100644 index 00000000000..7a9df1cdb51 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-plugin-project/src/benchmark/kotlin/MainBenchmark.kt @@ -0,0 +1,9 @@ +package com.example + +class MainBenchmark { + fun runBenchmark() { + main() + hello() + console.log("ran at the speed of light") + } +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-plugin-project/src/main/kotlin/Main.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-plugin-project/src/main/kotlin/Main.kt new file mode 100644 index 00000000000..7c18f20be13 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-plugin-project/src/main/kotlin/Main.kt @@ -0,0 +1,15 @@ +package com.example + +import kotlinx.html.dom.create +import kotlinx.html.js.div +import kotlinx.html.p +import kotlin.browser.document + +fun hello() = "hello" + +fun main() { + document.create.div { + p { hello() } + } + console.log(hello()) +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-plugin-project/src/test/kotlin/MainTest.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-plugin-project/src/test/kotlin/MainTest.kt new file mode 100644 index 00000000000..f6c873754cb --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-plugin-project/src/test/kotlin/MainTest.kt @@ -0,0 +1,11 @@ +package com.example + +import kotlin.test.Test +import kotlin.test.assertEquals + +class MainTest { + @Test + fun testHello() { + assertEquals("hello", hello()) + } +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin/build.gradle.kts index 771c10f52bb..1d2086abacb 100644 --- a/libraries/tools/kotlin-gradle-plugin/build.gradle.kts +++ b/libraries/tools/kotlin-gradle-plugin/build.gradle.kts @@ -128,6 +128,11 @@ pluginBundle { id = "org.jetbrains.kotlin.jvm", display = "Kotlin JVM plugin" ) + create( + name = "kotlinJsPlugin", + id = "org.jetbrains.kotlin.js", + display = "Kotlin JS plugin" + ) create( name = "kotlinMultiplatformPlugin", id = "org.jetbrains.kotlin.multiplatform", diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinProjectExtension.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinProjectExtension.kt index e15ea20e597..69bbe76e342 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinProjectExtension.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinProjectExtension.kt @@ -22,6 +22,8 @@ import org.gradle.api.internal.plugins.DslObject import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet import org.jetbrains.kotlin.gradle.plugin.KotlinTarget import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinAndroidTarget +import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation +import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinOnlyTarget import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinWithJavaTarget import kotlin.reflect.KClass @@ -72,6 +74,17 @@ open class Kotlin2JsProjectExtension : KotlinSingleJavaTargetExtension() { internal set } +open class KotlinJsProjectExtension : KotlinSingleTargetExtension() { + override lateinit var target: KotlinOnlyTarget + + @Deprecated( + "Needed for IDE import using the MPP import mechanism", + level = DeprecationLevel.HIDDEN + ) + fun getTargets() = + target.project.container(KotlinTarget::class.java).apply { add(target) } +} + open class KotlinCommonProjectExtension : KotlinSingleJavaTargetExtension() { override lateinit var target: KotlinWithJavaTarget internal set diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinJsDcePlugin.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinJsDcePlugin.kt index e680f07a9bd..e3cb6c9b976 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinJsDcePlugin.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinJsDcePlugin.kt @@ -19,10 +19,10 @@ package org.jetbrains.kotlin.gradle.plugin import org.gradle.api.Plugin import org.gradle.api.Project import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension -import org.jetbrains.kotlin.gradle.dsl.KotlinSingleJavaTargetExtension +import org.jetbrains.kotlin.gradle.dsl.KotlinSingleTargetExtension import org.jetbrains.kotlin.gradle.dsl.kotlinExtension -import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinWithJavaTarget import org.jetbrains.kotlin.gradle.dsl.multiplatformExtensionOrNull +import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinWithJavaTarget import org.jetbrains.kotlin.gradle.tasks.Kotlin2JsCompile import org.jetbrains.kotlin.gradle.tasks.KotlinJsDce import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName @@ -30,14 +30,17 @@ import java.io.File class KotlinJsDcePlugin : Plugin { override fun apply(project: Project) { - val kotlinExtension = project.multiplatformExtensionOrNull ?: run { - project.pluginManager.apply(Kotlin2JsPluginWrapper::class.java) - project.kotlinExtension as KotlinSingleJavaTargetExtension - } + val kotlinExtension = + project.multiplatformExtensionOrNull + ?: project.extensions.getByName("kotlin") as? KotlinSingleTargetExtension + ?: run { + project.pluginManager.apply(Kotlin2JsPluginWrapper::class.java) + project.kotlinExtension as KotlinSingleTargetExtension + } fun forEachJsTarget(action: (KotlinTarget) -> Unit) { when (kotlinExtension) { - is KotlinSingleJavaTargetExtension -> action(kotlinExtension.target) + is KotlinSingleTargetExtension -> action(kotlinExtension.target) is KotlinMultiplatformExtension -> kotlinExtension.targets .matching { it.platformType == KotlinPlatformType.js } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPluginWrapper.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPluginWrapper.kt index 3c624aa8a1a..9a231c5efe3 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPluginWrapper.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPluginWrapper.kt @@ -23,13 +23,13 @@ import org.gradle.api.internal.FeaturePreviews import org.gradle.api.internal.file.FileResolver import org.gradle.api.logging.Logger import org.gradle.api.logging.Logging -import org.gradle.internal.reflect.Instantiator import org.gradle.tooling.provider.model.ToolingModelBuilderRegistry import org.jetbrains.kotlin.gradle.dsl.* import org.jetbrains.kotlin.gradle.logging.kotlinDebug import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinMultiplatformPlugin import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinUsages import org.jetbrains.kotlin.gradle.plugin.sources.DefaultKotlinSourceSetFactory +import org.jetbrains.kotlin.gradle.targets.js.KotlinJsPlugin import org.jetbrains.kotlin.gradle.tasks.KOTLIN_COMPILER_EMBEDDABLE import org.jetbrains.kotlin.gradle.tasks.KOTLIN_MODULE_GROUP import org.jetbrains.kotlin.gradle.utils.checkGradleCompatibility @@ -139,15 +139,24 @@ open class Kotlin2JsPluginWrapper @Inject constructor( get() = Kotlin2JsProjectExtension::class } +open class KotlinJsPluginWrapper @Inject constructor( + fileResolver: FileResolver +) : KotlinBasePluginWrapper(fileResolver) { + override fun getPlugin(project: Project, kotlinGradleBuildServices: KotlinGradleBuildServices): Plugin = + KotlinJsPlugin(kotlinPluginVersion) + + override val projectExtensionClass: KClass + get() = KotlinJsProjectExtension::class +} + open class KotlinMultiplatformPluginWrapper @Inject constructor( fileResolver: FileResolver, - private val instantiator: Instantiator, private val featurePreviews: FeaturePreviews ) : KotlinBasePluginWrapper(fileResolver) { override fun getPlugin(project: Project, kotlinGradleBuildServices: KotlinGradleBuildServices): Plugin = KotlinMultiplatformPlugin( - fileResolver, - instantiator, kotlinPluginVersion, featurePreviews + kotlinPluginVersion, + featurePreviews ) override val projectExtensionClass: KClass 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 c8a348873b5..5b91d1416ff 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 @@ -7,37 +7,25 @@ package org.jetbrains.kotlin.gradle.plugin import org.gradle.api.Project import org.gradle.api.Task -import org.gradle.api.artifacts.* +import org.gradle.api.artifacts.Configuration +import org.gradle.api.artifacts.Dependency +import org.gradle.api.artifacts.PublishArtifact import org.gradle.api.artifacts.type.ArtifactTypeDefinition import org.gradle.api.attributes.Usage import org.gradle.api.attributes.Usage.USAGE_ATTRIBUTE import org.gradle.api.file.FileCollection import org.gradle.api.internal.artifacts.ArtifactAttributes -import org.gradle.api.internal.artifacts.publish.DefaultPublishArtifact -import org.gradle.api.internal.plugins.DefaultArtifactPublicationSet import org.gradle.api.internal.plugins.DslObject import org.gradle.api.plugins.BasePlugin import org.gradle.api.plugins.JavaBasePlugin -import org.gradle.api.tasks.Copy import org.gradle.api.tasks.Delete -import org.gradle.api.tasks.Exec import org.gradle.api.tasks.bundling.Jar import org.gradle.api.tasks.testing.Test import org.gradle.language.base.plugins.LifecycleBasePlugin import org.gradle.language.jvm.tasks.ProcessResources -import org.jetbrains.kotlin.cli.common.arguments.CommonCompilerArguments -import org.jetbrains.kotlin.gradle.dsl.KotlinNativeBinaryContainer import org.jetbrains.kotlin.gradle.dsl.kotlinExtension -import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation.Companion.MAIN_COMPILATION_NAME -import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation.Companion.TEST_COMPILATION_NAME import org.jetbrains.kotlin.gradle.plugin.mpp.* -import org.jetbrains.kotlin.gradle.tasks.AbstractKotlinNativeCompile -import org.jetbrains.kotlin.gradle.tasks.CInteropProcess -import org.jetbrains.kotlin.gradle.tasks.KotlinNativeCompile -import org.jetbrains.kotlin.gradle.tasks.KotlinNativeLink import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName -import java.io.File -import java.util.* import java.util.concurrent.Callable abstract class AbstractKotlinTargetConfigurator( diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinMultiplatformPlugin.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinMultiplatformPlugin.kt index b4b35220923..eb56d5ccef4 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinMultiplatformPlugin.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinMultiplatformPlugin.kt @@ -11,7 +11,6 @@ import org.gradle.api.Project import org.gradle.api.attributes.Attribute import org.gradle.api.attributes.AttributeContainer import org.gradle.api.internal.FeaturePreviews -import org.gradle.api.internal.file.FileResolver import org.gradle.api.internal.plugins.DslObject import org.gradle.api.plugins.JavaBasePlugin import org.gradle.api.publish.PublicationContainer @@ -20,7 +19,6 @@ import org.gradle.api.publish.maven.MavenPublication import org.gradle.api.publish.maven.internal.publication.MavenPublicationInternal import org.gradle.api.publish.maven.tasks.AbstractPublishToMaven import org.gradle.api.tasks.compile.AbstractCompile -import org.gradle.internal.reflect.Instantiator import org.gradle.jvm.tasks.Jar import org.gradle.util.ConfigureUtil import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension @@ -36,8 +34,6 @@ import org.jetbrains.kotlin.konan.target.HostManager import org.jetbrains.kotlin.konan.target.presetName class KotlinMultiplatformPlugin( - private val fileResolver: FileResolver, - private val instantiator: Instantiator, private val kotlinPluginVersion: String, private val featurePreviews: FeaturePreviews // TODO get rid of this internal API usage once we don't need it ) : Plugin { @@ -83,7 +79,7 @@ class KotlinMultiplatformPlugin( // set up metadata publishing targetsFromPreset.fromPreset( - KotlinMetadataTargetPreset(project, instantiator, fileResolver, kotlinPluginVersion), + KotlinMetadataTargetPreset(project, kotlinPluginVersion), METADATA_TARGET_NAME ) configurePublishingWithMavenPublish(project) @@ -135,8 +131,8 @@ class KotlinMultiplatformPlugin( fun setupDefaultPresets(project: Project) { with(project.multiplatformExtension.presets) { - add(KotlinJvmTargetPreset(project, instantiator, fileResolver, kotlinPluginVersion)) - add(KotlinJsTargetPreset(project, instantiator, fileResolver, kotlinPluginVersion)) + add(KotlinJvmTargetPreset(project, kotlinPluginVersion)) + add(KotlinJsTargetPreset(project, kotlinPluginVersion)) add(KotlinAndroidTargetPreset(project, kotlinPluginVersion)) add(KotlinJvmWithJavaTargetPreset(project, kotlinPluginVersion)) HostManager().targets.forEach { _, target -> diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/kotlinTargetPresets.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/kotlinTargetPresets.kt index ece5062e51d..57c0d7ea47e 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/kotlinTargetPresets.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/kotlinTargetPresets.kt @@ -6,24 +6,23 @@ package org.jetbrains.kotlin.gradle.plugin.mpp import org.gradle.api.Project -import org.gradle.api.internal.file.FileResolver -import org.gradle.internal.reflect.Instantiator import org.jetbrains.kotlin.gradle.plugin.* abstract class KotlinOnlyTargetPreset>( protected val project: Project, - private val instantiator: Instantiator, - private val fileResolver: FileResolver, protected val kotlinPluginVersion: String ) : KotlinTargetPreset> { protected open fun createKotlinTargetConfigurator(): KotlinTargetConfigurator = KotlinTargetConfigurator(createDefaultSourceSets = true, createTestCompilation = true) + protected open fun provideTargetDisambiguationClassifier(target: KotlinOnlyTarget): String? = + target.targetName + override fun createTarget(name: String): KotlinOnlyTarget { val result = KotlinOnlyTarget(project, platformType).apply { targetName = name - disambiguationClassifier = name + disambiguationClassifier = provideTargetDisambiguationClassifier(this@apply) preset = this@KotlinOnlyTargetPreset val compilationFactory = createCompilationFactory(this) diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsPlugin.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsPlugin.kt new file mode 100644 index 00000000000..8e5820683fa --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsPlugin.kt @@ -0,0 +1,38 @@ +/* + * Copyright 2010-2019 JetBrains s.r.o. 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 + +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.api.plugins.JavaBasePlugin +import org.jetbrains.kotlin.gradle.dsl.KotlinJsProjectExtension +import org.jetbrains.kotlin.gradle.dsl.kotlinExtension +import org.jetbrains.kotlin.gradle.plugin.configureDefaultVersionsResolutionStrategy +import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsSingleTargetPreset +import org.jetbrains.kotlin.gradle.utils.checkGradleCompatibility + +open class KotlinJsPlugin( + private val kotlinPluginVersion: String +) : Plugin { + + override fun apply(project: Project) { + // TODO get rid of this plugin, too? Use the 'base' plugin instead? + // in fact, the attributes schema of the Java base plugin may be required to consume non-MPP Kotlin/JS libs, + // so investigation is needed + project.plugins.apply(JavaBasePlugin::class.java) + + checkGradleCompatibility() + + val kotlinExtension = project.kotlinExtension as KotlinJsProjectExtension + configureDefaultVersionsResolutionStrategy(project, kotlinPluginVersion) + + val target = KotlinJsSingleTargetPreset(project, kotlinPluginVersion).createTarget("kotlin") + + kotlinExtension.target = target + + project.components.addAll(target.components) + } +} \ No newline at end of file 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 be3617741ea..4975f2561e7 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 @@ -7,22 +7,16 @@ package org.jetbrains.kotlin.gradle.plugin.mpp import org.gradle.api.Project -import org.gradle.api.internal.file.FileResolver -import org.gradle.internal.reflect.Instantiator import org.jetbrains.kotlin.gradle.plugin.Kotlin2JsSourceSetProcessor import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSetProcessor import org.jetbrains.kotlin.gradle.tasks.KotlinTasksProvider -class KotlinJsTargetPreset( +open class KotlinJsTargetPreset( project: Project, - instantiator: Instantiator, - fileResolver: FileResolver, kotlinPluginVersion: String ) : KotlinOnlyTargetPreset( project, - instantiator, - fileResolver, kotlinPluginVersion ) { override fun getName(): String = PRESET_NAME @@ -42,3 +36,13 @@ class KotlinJsTargetPreset( const val PRESET_NAME = "js" } } + +class KotlinJsSingleTargetPreset( + project: Project, + kotlinPluginVersion: String +) : + KotlinJsTargetPreset(project, kotlinPluginVersion) { + + // In a Kotlin/JS single-platform project, we don't need any disambiguation suffixes or prefixes in the names: + override fun provideTargetDisambiguationClassifier(target: KotlinOnlyTarget): String? = null +} \ No newline at end of file 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 bb39310e96c..c683ed89771 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 @@ -7,8 +7,6 @@ package org.jetbrains.kotlin.gradle.plugin.mpp import org.gradle.api.Project -import org.gradle.api.internal.file.FileResolver -import org.gradle.internal.reflect.Instantiator import org.jetbrains.kotlin.gradle.plugin.Kotlin2JvmSourceSetProcessor import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSetProcessor @@ -16,13 +14,9 @@ import org.jetbrains.kotlin.gradle.tasks.KotlinTasksProvider class KotlinJvmTargetPreset( project: Project, - instantiator: Instantiator, - fileResolver: FileResolver, kotlinPluginVersion: String ) : KotlinOnlyTargetPreset( project, - instantiator, - fileResolver, kotlinPluginVersion ) { 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 3dc7d189f24..7cdb751ed0f 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 @@ -7,8 +7,6 @@ package org.jetbrains.kotlin.gradle.plugin.mpp import org.gradle.api.Project -import org.gradle.api.internal.file.FileResolver -import org.gradle.internal.reflect.Instantiator import org.jetbrains.kotlin.gradle.dsl.KotlinCompile import org.jetbrains.kotlin.gradle.dsl.kotlinExtension import org.jetbrains.kotlin.gradle.plugin.* @@ -17,13 +15,9 @@ import org.jetbrains.kotlin.gradle.tasks.KotlinTasksProvider class KotlinMetadataTargetPreset( project: Project, - instantiator: Instantiator, - fileResolver: FileResolver, kotlinPluginVersion: String ) : KotlinOnlyTargetPreset( project, - instantiator, - fileResolver, kotlinPluginVersion ) { override fun getName(): String = PRESET_NAME diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/resources/META-INF/gradle-plugins/org.jetbrains.kotlin.js.properties b/libraries/tools/kotlin-gradle-plugin/src/main/resources/META-INF/gradle-plugins/org.jetbrains.kotlin.js.properties new file mode 100644 index 00000000000..661fbbe0005 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/main/resources/META-INF/gradle-plugins/org.jetbrains.kotlin.js.properties @@ -0,0 +1 @@ +implementation-class=org.jetbrains.kotlin.gradle.plugin.KotlinJsPluginWrapper \ No newline at end of file