From 5d664aac9232eb7845ab0b8df038911814890b46 Mon Sep 17 00:00:00 2001 From: Pavel Kirpichenkov Date: Tue, 28 Feb 2023 21:40:17 +0200 Subject: [PATCH] [MPP] Disable KGP import for the standalone kotlin-js Gradle plugin KTIJ-24745 --- .../gradle/plugin/PropertiesProvider.kt | 5 + .../gradle/targets/js/KotlinJsPlugin.kt | 2 + .../kotlin/gradle/utils/disableKgpImport.kt | 13 ++ ...uginKgpDependencyResolutionPropertyTest.kt | 124 ++++++++++++++++++ 4 files changed, 144 insertions(+) create mode 100644 libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/utils/disableKgpImport.kt create mode 100644 libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/regressionTests/JsPluginKgpDependencyResolutionPropertyTest.kt diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/PropertiesProvider.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/PropertiesProvider.kt index ffb73380b3b..79e13decec5 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/PropertiesProvider.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/PropertiesProvider.kt @@ -31,6 +31,7 @@ import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.PropertyNames.KOTLI import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.PropertyNames.KOTLIN_MPP_HIERARCHICAL_STRUCTURE_BY_DEFAULT import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.PropertyNames.KOTLIN_MPP_HIERARCHICAL_STRUCTURE_SUPPORT import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.PropertyNames.KOTLIN_MPP_DEPRECATED_PROPERTIES_NO_WARN +import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.PropertyNames.KOTLIN_MPP_IMPORT_ENABLE_KGP_DEPENDENCY_RESOLUTION import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.PropertyNames.KOTLIN_MPP_IMPORT_ENABLE_SLOW_SOURCES_JAR_RESOLVER import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.PropertyNames.KOTLIN_NATIVE_DEPENDENCY_PROPAGATION import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.PropertyNames.KOTLIN_NATIVE_USE_XCODE_MESSAGE_STYLE @@ -410,6 +411,9 @@ internal class PropertiesProvider private constructor(private val project: Proje val enableIntransitiveMetadataConfiguration: Boolean get() = booleanProperty(KOTLIN_MPP_ENABLE_INTRANSITIVE_METADATA_CONFIGURATION) ?: false + val enableKgpDependencyResolution: Boolean? + get() = booleanProperty(KOTLIN_MPP_IMPORT_ENABLE_KGP_DEPENDENCY_RESOLUTION) + val enableSlowIdeSourcesJarResolver: Boolean get() = booleanProperty(KOTLIN_MPP_IMPORT_ENABLE_SLOW_SOURCES_JAR_RESOLVER) ?: true @@ -591,6 +595,7 @@ internal class PropertiesProvider private constructor(private val project: Proje const val KOTLIN_MPP_ANDROID_SOURCE_SET_LAYOUT_VERSION = "kotlin.mpp.androidSourceSetLayoutVersion" const val KOTLIN_MPP_ANDROID_SOURCE_SET_LAYOUT_VERSION_1_NO_WARN = "${KOTLIN_MPP_ANDROID_SOURCE_SET_LAYOUT_VERSION}1.nowarn" const val KOTLIN_MPP_ANDROID_SOURCE_SET_LAYOUT_ANDROID_STYLE_NO_WARN = "kotlin.mpp.androidSourceSetLayoutV2AndroidStyleDirs.nowarn" + const val KOTLIN_MPP_IMPORT_ENABLE_KGP_DEPENDENCY_RESOLUTION = "kotlin.mpp.import.enableKgpDependencyResolution" const val KOTLIN_MPP_IMPORT_ENABLE_SLOW_SOURCES_JAR_RESOLVER = "kotlin.mpp.import.enableSlowSourcesJarResolver" const val KOTLIN_MPP_ENABLE_INTRANSITIVE_METADATA_CONFIGURATION = "kotlin.mpp.enableIntransitiveMetadataConfiguration" const val KOTLIN_NATIVE_DEPENDENCY_PROPAGATION = "kotlin.native.enableDependencyPropagation" diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsPlugin.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsPlugin.kt index 200a405a65a..b0599c3c561 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsPlugin.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsPlugin.kt @@ -33,6 +33,8 @@ open class KotlinJsPlugin( checkGradleCompatibility() + project.enableKgpDependencyResolution(isEnabled = false) + val kotlinExtension = project.kotlinExtension as KotlinJsProjectExtension customizeKotlinDependencies(project) diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/utils/disableKgpImport.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/utils/disableKgpImport.kt new file mode 100644 index 00000000000..7315c730b68 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/utils/disableKgpImport.kt @@ -0,0 +1,13 @@ +/* + * Copyright 2010-2023 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.utils + +import org.gradle.api.Project +import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.PropertyNames.KOTLIN_MPP_IMPORT_ENABLE_KGP_DEPENDENCY_RESOLUTION + +internal fun Project.enableKgpDependencyResolution(isEnabled: Boolean) { + extensions.extraProperties.set(KOTLIN_MPP_IMPORT_ENABLE_KGP_DEPENDENCY_RESOLUTION, "$isEnabled") // IJ property parser expects a String +} diff --git a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/regressionTests/JsPluginKgpDependencyResolutionPropertyTest.kt b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/regressionTests/JsPluginKgpDependencyResolutionPropertyTest.kt new file mode 100644 index 00000000000..6b58d26496e --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/regressionTests/JsPluginKgpDependencyResolutionPropertyTest.kt @@ -0,0 +1,124 @@ +/* + * Copyright 2010-2023 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.regressionTests + +import org.jetbrains.kotlin.gradle.dsl.KotlinJsProjectExtension +import org.jetbrains.kotlin.gradle.dsl.kotlinExtension +import org.jetbrains.kotlin.gradle.plugin.KotlinJsCompilerType +import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.PropertyNames.KOTLIN_MPP_IMPORT_ENABLE_KGP_DEPENDENCY_RESOLUTION +import org.jetbrains.kotlin.gradle.util.applyMultiplatformPlugin +import org.jetbrains.kotlin.gradle.util.buildProject +import org.junit.Test +import kotlin.test.assertEquals + +class JsPluginKgpDependencyResolutionPropertyTest { + @Test + fun `test project with js plugin has kgp dependency resolution disabled`() { + val project = buildProject { + plugins.apply("org.jetbrains.kotlin.js") + } + + val kotlin = project.kotlinExtension as KotlinJsProjectExtension + kotlin.js(KotlinJsCompilerType.IR) + + project.evaluate() + + assertEquals("false", project.findProperty(KOTLIN_MPP_IMPORT_ENABLE_KGP_DEPENDENCY_RESOLUTION)) + } + + @Test + fun `test kgp dependency resolution state in a nested js project with a top-level mpp project`() { + val project = buildProject { + applyMultiplatformPlugin() + } + + val subproject = buildProject({ withParent(project) }) { + plugins.apply("org.jetbrains.kotlin.js") + } + + project.evaluate() + + assertEquals(null, project.findProperty(KOTLIN_MPP_IMPORT_ENABLE_KGP_DEPENDENCY_RESOLUTION)) + assertEquals("false", subproject.findProperty(KOTLIN_MPP_IMPORT_ENABLE_KGP_DEPENDENCY_RESOLUTION)) + } + + @Test + fun `test kgp import state in a nested js project with a top-level mpp project and enabled kgp dependency resolution`() { + val project = buildProject { + applyMultiplatformPlugin() + extensions.extraProperties.set(KOTLIN_MPP_IMPORT_ENABLE_KGP_DEPENDENCY_RESOLUTION, "true") + } + + val subproject = buildProject({ withParent(project) }) { + plugins.apply("org.jetbrains.kotlin.js") + } + + project.evaluate() + + assertEquals("true", project.findProperty(KOTLIN_MPP_IMPORT_ENABLE_KGP_DEPENDENCY_RESOLUTION)) + assertEquals("false", subproject.findProperty(KOTLIN_MPP_IMPORT_ENABLE_KGP_DEPENDENCY_RESOLUTION)) + } + + @Test + fun `test kgp dependency resolution state in a nested mpp project with a top-level js project`() { + val project = buildProject { + plugins.apply("org.jetbrains.kotlin.js") + } + + val subproject = buildProject({ withParent(project) }) { + applyMultiplatformPlugin() + } + + (project.kotlinExtension as KotlinJsProjectExtension).js(KotlinJsCompilerType.IR) + + project.evaluate() + + assertEquals("false", project.findProperty(KOTLIN_MPP_IMPORT_ENABLE_KGP_DEPENDENCY_RESOLUTION)) + // Requires a workaround, one has to set the property explicitly for the MPP project nested under the JS project. + // The standalone JS plugin is only going to be supported for a small period of time from now. + assertEquals("false", subproject.findProperty(KOTLIN_MPP_IMPORT_ENABLE_KGP_DEPENDENCY_RESOLUTION)) + } + + @Test + fun `test kgp dependency resolution state in a nested mpp project with a top-level js project and enabled kgp import`() { + val project = buildProject { + plugins.apply("org.jetbrains.kotlin.js") + } + + val subproject = buildProject({ withParent(project) }) { + applyMultiplatformPlugin() + extensions.extraProperties.set(KOTLIN_MPP_IMPORT_ENABLE_KGP_DEPENDENCY_RESOLUTION, "true") + } + + (project.kotlinExtension as KotlinJsProjectExtension).js(KotlinJsCompilerType.IR) + + project.evaluate() + + assertEquals("false", project.findProperty(KOTLIN_MPP_IMPORT_ENABLE_KGP_DEPENDENCY_RESOLUTION)) + assertEquals("true", subproject.findProperty(KOTLIN_MPP_IMPORT_ENABLE_KGP_DEPENDENCY_RESOLUTION)) + } + + @Test + fun `test kgp dependency resolution state in an mpp project alongside a js project`() { + val project = buildProject { + } + + val mppSubproject = buildProject({ withParent(project) }) { + applyMultiplatformPlugin() + } + + val jsSubproject = buildProject({ withParent(project) }) { + plugins.apply("org.jetbrains.kotlin.js") + } + + (jsSubproject.kotlinExtension as KotlinJsProjectExtension).js(KotlinJsCompilerType.IR) + + project.evaluate() + + assertEquals(null, mppSubproject.findProperty(KOTLIN_MPP_IMPORT_ENABLE_KGP_DEPENDENCY_RESOLUTION)) + assertEquals("false", jsSubproject.findProperty(KOTLIN_MPP_IMPORT_ENABLE_KGP_DEPENDENCY_RESOLUTION)) + } +}