From b967e11511c33f81b8e4400cc4692be8fab5e2a3 Mon Sep 17 00:00:00 2001 From: Ilya Goncharov Date: Tue, 18 Feb 2020 12:10:19 +0300 Subject: [PATCH] [Gradle, JS] Configure compiler type with single platform plugin --- .../gradle/dsl/KotlinProjectExtension.kt | 24 ++++-------- .../gradle/plugin/KotlinPluginWrapper.kt | 30 ++------------- .../kotlin/gradle/plugin/KotlinProperties.kt | 8 ---- .../plugin/mpp/KotlinMultiplatformPlugin.kt | 12 +++--- .../gradle/targets/js/KotlinJsPlugin.kt | 24 +++--------- .../gradle/targets/js/KotlinJsTarget.kt | 2 +- .../gradle/targets/js/KotlinJsTargetPreset.kt | 13 +++---- .../targets/js/dsl/KotlinJsTargetDsl.kt | 2 + .../gradle/targets/js/ir/KotlinJsIrPlugin.kt | 37 ------------------- .../gradle/targets/js/ir/KotlinJsIrTarget.kt | 2 +- .../targets/js/ir/KotlinJsIrTargetPreset.kt | 10 ++--- 11 files changed, 39 insertions(+), 125 deletions(-) delete mode 100644 libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrPlugin.kt 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 f4517423cf6..20475a9ac9d 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 @@ -31,7 +31,6 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsSingleTargetPreset import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinWithJavaTarget import org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinJsTargetDsl import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrSingleTargetPreset -import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrTarget import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName import org.jetbrains.kotlin.konan.target.CompilerOutputKind import kotlin.reflect.KClass @@ -56,7 +55,7 @@ internal val Project.multiplatformExtensionOrNull: KotlinMultiplatformExtension? internal val Project.multiplatformExtension: KotlinMultiplatformExtension get() = extensions.getByName(KOTLIN_PROJECT_EXTENSION_NAME) as KotlinMultiplatformExtension -open class KotlinProjectExtension: KotlinSourceSetContainer { +open class KotlinProjectExtension : KotlinSourceSetContainer { val experimental: ExperimentalExtension get() = DslObject(this).extensions.getByType(ExperimentalExtension::class.java) @@ -103,12 +102,18 @@ open class KotlinJsProjectExtension : KotlinSingleTargetExtension() { compiler: JsCompilerType = legacy, body: KotlinJsTargetDsl.() -> Unit ) { - val target = when (compiler) { + val target: KotlinJsTargetDsl = when (compiler) { legacy -> legacyPreset + .also { it.irPreset = null } .createTarget("js") ir -> irPreset + .also { it.mixedMode = false } .createTarget("js") both -> legacyPreset + .also { + irPreset.mixedMode = true + it.irPreset = irPreset + } .createTarget( lowerCamelCaseName( "js", @@ -139,19 +144,6 @@ open class KotlinJsProjectExtension : KotlinSingleTargetExtension() { target.project.container(KotlinTarget::class.java).apply { add(target) } } -open class KotlinJsIrProjectExtension : KotlinSingleTargetExtension() { - override lateinit var target: KotlinJsIrTarget - - open fun js(body: KotlinJsIrTarget.() -> Unit) = target.run(body) - - @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/KotlinPluginWrapper.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPluginWrapper.kt index 0eb7fca2c1c..89ceb6de401 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 @@ -26,14 +26,12 @@ import org.gradle.api.logging.Logging 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.JsCompilerType 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.plugin.statistics.KotlinBuildStatsService import org.jetbrains.kotlin.gradle.targets.js.KotlinJsPlugin import org.jetbrains.kotlin.gradle.targets.js.KotlinJsTarget -import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrPlugin import org.jetbrains.kotlin.gradle.targets.js.npm.addNpmDependencyExtension import org.jetbrains.kotlin.gradle.tasks.KOTLIN_COMPILER_EMBEDDABLE import org.jetbrains.kotlin.gradle.tasks.KOTLIN_KLIB_COMMONIZER_EMBEDDABLE @@ -79,8 +77,6 @@ abstract class KotlinBasePluginWrapper( kotlinGradleBuildServices.detectKotlinPluginLoadedInMultipleProjects(project, kotlinPluginVersion) - defineExtension(project) - project.createKotlinExtension(projectExtensionClass).apply { fun kotlinSourceSetContainer(factory: NamedDomainObjectFactory) = project.container(KotlinSourceSet::class.java, factory) @@ -112,9 +108,6 @@ abstract class KotlinBasePluginWrapper( project: Project, kotlinGradleBuildServices: KotlinGradleBuildServices ): Plugin - - protected open fun defineExtension(project: Project) { - } } open class KotlinPluginWrapper @Inject constructor( @@ -164,26 +157,11 @@ open class Kotlin2JsPluginWrapper @Inject constructor( open class KotlinJsPluginWrapper @Inject constructor( fileResolver: FileResolver ) : KotlinBasePluginWrapper(fileResolver) { - override fun getPlugin(project: Project, kotlinGradleBuildServices: KotlinGradleBuildServices): Plugin { - val propertiesProvider = PropertiesProvider(project) + override fun getPlugin(project: Project, kotlinGradleBuildServices: KotlinGradleBuildServices): Plugin = + KotlinJsPlugin(kotlinPluginVersion) - return when (propertiesProvider.jsCompiler) { - JsCompilerType.ir -> KotlinJsIrPlugin(kotlinPluginVersion) - JsCompilerType.legacy -> KotlinJsPlugin(kotlinPluginVersion, false) - JsCompilerType.both -> KotlinJsPlugin(kotlinPluginVersion, true) - } - } - - override lateinit var projectExtensionClass: KClass - - override fun defineExtension(project: Project) { - val propertiesProvider = PropertiesProvider(project) - - projectExtensionClass = when (propertiesProvider.jsCompiler) { - JsCompilerType.ir -> KotlinJsIrProjectExtension::class - JsCompilerType.legacy, JsCompilerType.both -> KotlinJsProjectExtension::class - } - } + override val projectExtensionClass: KClass + get() = KotlinJsProjectExtension::class override fun createTestRegistry(project: Project) = KotlinTestsRegistry(project, "test") } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinProperties.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinProperties.kt index 79ad74e1321..466c7ae99c0 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinProperties.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinProperties.kt @@ -19,8 +19,6 @@ package org.jetbrains.kotlin.gradle.plugin import org.gradle.api.Project import org.jetbrains.kotlin.gradle.dsl.Coroutines import org.jetbrains.kotlin.gradle.dsl.NativeCacheKind -import org.jetbrains.kotlin.gradle.plugin.JsCompilerType -import org.jetbrains.kotlin.gradle.plugin.JsCompilerType.Companion.jsCompilerProperty import org.jetbrains.kotlin.gradle.targets.native.DisabledNativeTargetsReporter import org.jetbrains.kotlin.gradle.tasks.AbstractKotlinCompile import org.jetbrains.kotlin.gradle.tasks.Kotlin2JsCompile @@ -170,12 +168,6 @@ internal class PropertiesProvider private constructor(private val project: Proje val jsDiscoverTypes: Boolean? get() = booleanProperty("kotlin.js.experimental.discoverTypes") - /** - * Use Kotlin/JS backend mode - */ - val jsCompiler: JsCompilerType - get() = property(jsCompilerProperty)?.let { JsCompilerType.byArgument(it) } ?: JsCompilerType.legacy - private fun propertyWithDeprecatedVariant(propName: String, deprecatedPropName: String): String? { val deprecatedProperty = property(deprecatedPropName) if (deprecatedProperty != null) { 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 08240e42a04..f042086b874 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 @@ -155,14 +155,16 @@ class KotlinMultiplatformPlugin( fun setupDefaultPresets(project: Project) { with(project.multiplatformExtension.presets) { add(KotlinJvmTargetPreset(project, kotlinPluginVersion)) - add(KotlinJsTargetPreset(project, kotlinPluginVersion, null)) - add(KotlinJsIrTargetPreset(project, kotlinPluginVersion, false)) + add(KotlinJsTargetPreset(project, kotlinPluginVersion).apply { irPreset = null }) + add(KotlinJsIrTargetPreset(project, kotlinPluginVersion).apply { mixedMode = false }) add( KotlinJsTargetPreset( project, - kotlinPluginVersion, - KotlinJsIrTargetPreset(project, kotlinPluginVersion, true) - ) + kotlinPluginVersion + ).apply { + irPreset = KotlinJsIrTargetPreset(project, kotlinPluginVersion) + .apply { mixedMode = true } + } ) add(KotlinAndroidTargetPreset(project, kotlinPluginVersion)) add(KotlinJvmWithJavaTargetPreset(project, kotlinPluginVersion)) 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 index 278ae6094c4..c493d3d2d65 100644 --- 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 @@ -10,16 +10,13 @@ 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.JsCompilerType import org.jetbrains.kotlin.gradle.plugin.configureDefaultVersionsResolutionStrategy import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsSingleTargetPreset import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrSingleTargetPreset import org.jetbrains.kotlin.gradle.utils.checkGradleCompatibility -import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName open class KotlinJsPlugin( - private val kotlinPluginVersion: String, - private val mixedMode: Boolean + private val kotlinPluginVersion: String ) : Plugin { override fun apply(project: Project) { @@ -33,20 +30,9 @@ open class KotlinJsPlugin( val kotlinExtension = project.kotlinExtension as KotlinJsProjectExtension configureDefaultVersionsResolutionStrategy(project, kotlinPluginVersion) - val irPreset = if (mixedMode) - KotlinJsIrSingleTargetPreset(project, kotlinPluginVersion, mixedMode) - else null - - val target = KotlinJsSingleTargetPreset(project, kotlinPluginVersion, irPreset) - .createTarget( - lowerCamelCaseName( - "js", - irPreset?.let { JsCompilerType.legacy.name } - ) - ) - - kotlinExtension.target = target - - project.components.addAll(target.components) + kotlinExtension.apply { + irPreset = KotlinJsIrSingleTargetPreset(project, kotlinPluginVersion) + legacyPreset = KotlinJsSingleTargetPreset(project, kotlinPluginVersion) + } } } \ No newline at end of file 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 bef7b6f5f81..e6fb770233c 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 @@ -182,7 +182,7 @@ constructor( } } - fun useCommonJs() { + override fun useCommonJs() { compilations.all { it.compileKotlinTask.kotlinOptions { moduleKind = "commonjs" 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 0b0737c524f..5f50fbc26ff 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 @@ -14,18 +14,19 @@ import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType import org.jetbrains.kotlin.gradle.plugin.removeCapitalizedJsCompilerSuffix import org.jetbrains.kotlin.gradle.targets.js.KotlinJsTarget import org.jetbrains.kotlin.gradle.targets.js.KotlinJsTargetConfigurator -import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrSingleTargetPreset import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrTargetPreset import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName open class KotlinJsTargetPreset( project: Project, - kotlinPluginVersion: String, - val irPreset: KotlinJsIrTargetPreset? + kotlinPluginVersion: String ) : KotlinOnlyTargetPreset( project, kotlinPluginVersion ) { + var irPreset: KotlinJsIrTargetPreset? = null + internal set + override val platformType: KotlinPlatformType get() = KotlinPlatformType.js @@ -63,12 +64,10 @@ open class KotlinJsTargetPreset( class KotlinJsSingleTargetPreset( project: Project, - kotlinPluginVersion: String, - irPreset: KotlinJsIrSingleTargetPreset? + kotlinPluginVersion: String ) : KotlinJsTargetPreset( project, - kotlinPluginVersion, - irPreset + kotlinPluginVersion ) { // In a Kotlin/JS single-platform project, we don't need any disambiguation suffixes or prefixes in the names: diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/dsl/KotlinJsTargetDsl.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/dsl/KotlinJsTargetDsl.kt index 00403e6523b..ee07e8f29e7 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/dsl/KotlinJsTargetDsl.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/dsl/KotlinJsTargetDsl.kt @@ -52,6 +52,8 @@ interface KotlinJsTargetDsl : KotlinTarget { fun produceExecutable() + fun useCommonJs() + val testRuns: NamedDomainObjectContainer // Need to compatibility when users use KotlinJsCompilation specific in build script diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrPlugin.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrPlugin.kt deleted file mode 100644 index 8e6eccff227..00000000000 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrPlugin.kt +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright 2010-2019 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.Plugin -import org.gradle.api.Project -import org.gradle.api.plugins.JavaBasePlugin -import org.jetbrains.kotlin.gradle.dsl.KotlinJsIrProjectExtension -import org.jetbrains.kotlin.gradle.dsl.kotlinExtension -import org.jetbrains.kotlin.gradle.plugin.configureDefaultVersionsResolutionStrategy -import org.jetbrains.kotlin.gradle.utils.checkGradleCompatibility - -open class KotlinJsIrPlugin( - 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 KotlinJsIrProjectExtension - configureDefaultVersionsResolutionStrategy(project, kotlinPluginVersion) - - val target = KotlinJsIrSingleTargetPreset(project, kotlinPluginVersion, false).createTarget("js") - - 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/ir/KotlinJsIrTarget.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrTarget.kt index 8af7d3e95a9..9b4aa721275 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 @@ -128,7 +128,7 @@ constructor( } } - fun useCommonJs() { + override fun useCommonJs() { compilations.all { it.compileKotlinTask.configureCommonJsOptions() diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrTargetPreset.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrTargetPreset.kt index 805b4e79834..70b017e833c 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrTargetPreset.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrTargetPreset.kt @@ -16,12 +16,13 @@ import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName open class KotlinJsIrTargetPreset( project: Project, - kotlinPluginVersion: String, - private val mixedMode: Boolean + kotlinPluginVersion: String ) : KotlinOnlyTargetPreset( project, kotlinPluginVersion ) { + internal var mixedMode: Boolean? = null + override val platformType: KotlinPlatformType get() = KotlinPlatformType.js @@ -50,10 +51,9 @@ open class KotlinJsIrTargetPreset( class KotlinJsIrSingleTargetPreset( project: Project, - kotlinPluginVersion: String, - mixedMode: Boolean + kotlinPluginVersion: String ) : - KotlinJsIrTargetPreset(project, kotlinPluginVersion, mixedMode) { + KotlinJsIrTargetPreset(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