From 69bb85f71f00f2c8ba3819cb813a12f30c7a4a39 Mon Sep 17 00:00:00 2001 From: Pavel Kirpichenkov Date: Fri, 22 Apr 2022 13:54:16 +0300 Subject: [PATCH] [MPP] Disambiguate compilation and source set configurations Add 'compilation' postfix to configuration names of compilations. This is necessary to distinguish them from source set ones. Without the change, default source sets of test compilations and the test compilations themselves have the same name. For instance, jvmTestImplementation was interpreted as a configuration for a source set jvmTest and a compilation with the same name. This leads to incorrect configuration hierarchies and unexpected dependencies in them. KT-35916 KT-49877 --- .../gradle/VariantAwareDependenciesMppIT.kt | 8 +-- .../new-mpp-js-dce/mainProject/build.gradle | 6 +- .../gradle/plugin/mpp/CompilationDetails.kt | 2 + .../kotlin/gradle/ConfigurationsTest.kt | 68 ++++++++++++++++++- 4 files changed, 75 insertions(+), 9 deletions(-) diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/VariantAwareDependenciesMppIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/VariantAwareDependenciesMppIT.kt index 3e502fb3d86..563389edd2f 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/VariantAwareDependenciesMppIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/VariantAwareDependenciesMppIT.kt @@ -163,10 +163,10 @@ class VariantAwareDependenciesMppIT : BaseGradleIT() { gradleBuildScript().appendText( "\n" + """ dependencies { - jvm6Implementation project(':${innerJvmProject.projectName}') - jvm6TestRuntimeOnly project(':${innerJvmProject.projectName}') - nodeJsImplementation project(':${innerJsProject.projectName}') - nodeJsTestRuntimeOnly project(':${innerJsProject.projectName}') + jvm6CompilationImplementation project(':${innerJvmProject.projectName}') + jvm6TestCompilationRuntimeOnly project(':${innerJvmProject.projectName}') + nodeJsCompilationImplementation project(':${innerJsProject.projectName}') + nodeJsTestCompilationRuntimeOnly project(':${innerJsProject.projectName}') } """.trimIndent() ) diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-js-dce/mainProject/build.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-js-dce/mainProject/build.gradle index 08c6f3b7990..117de65adf7 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-js-dce/mainProject/build.gradle +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-js-dce/mainProject/build.gradle @@ -20,9 +20,9 @@ kotlin.targets.fromPreset(kotlin.presets.js, 'browser') { } dependencies { - browserImplementation project(":libraryProject") - browserImplementation "org.jetbrains.kotlin:kotlin-stdlib-js" - browserImplementation "org.mozilla:rhino:1.7.7.1" + browserCompilationImplementation project(":libraryProject") + browserCompilationImplementation "org.jetbrains.kotlin:kotlin-stdlib-js" + browserCompilationImplementation "org.mozilla:rhino:1.7.7.1" } tasks.named('compileKotlinBrowser') { diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/CompilationDetails.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/CompilationDetails.kt index 90e9e3cda86..e5573dd18c3 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/CompilationDetails.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/CompilationDetails.kt @@ -96,6 +96,7 @@ open class DefaultCompilationDetails( lowerCamelCaseName( target.disambiguationClassifier, compilationPurpose.takeIf { it != KotlinCompilation.MAIN_COMPILATION_NAME }, + "compilation", ) ) @@ -592,6 +593,7 @@ internal open class JsCompilationDetails( return lowerCamelCaseName( disambiguationClassifierInPlatform, compilationPurpose.takeIf { it != KotlinCompilation.MAIN_COMPILATION_NAME }, + "compilation", simpleName ) } diff --git a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/ConfigurationsTest.kt b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/ConfigurationsTest.kt index a637dddacb0..6d4542b9199 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/ConfigurationsTest.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/ConfigurationsTest.kt @@ -10,12 +10,14 @@ package org.jetbrains.kotlin.gradle import org.gradle.api.attributes.Category import org.gradle.api.attributes.Usage import org.gradle.kotlin.dsl.withType +import org.jetbrains.kotlin.gradle.dsl.kotlinExtension import org.jetbrains.kotlin.gradle.mpp.buildProjectWithMPP import org.jetbrains.kotlin.gradle.mpp.kotlin import org.jetbrains.kotlin.gradle.plugin.KotlinJsCompilerType import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinUsages +import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.targets import org.jetbrains.kotlin.gradle.targets.js.KotlinJsCompilerAttribute import org.jetbrains.kotlin.gradle.targets.js.KotlinJsTarget import org.jetbrains.kotlin.gradle.targets.js.dsl.ExperimentalWasmDsl @@ -145,10 +147,72 @@ class ConfigurationsTest : MultiplatformExtensionTest() { } } } - with(project.evaluate()) { - assertContainsDependencies("jsApi", "test:compilation-dependency", "test:source-set-dependency") + + project.evaluate() + + with(project) { + assertContainsDependencies("jsCompilationApi", "test:compilation-dependency", "test:source-set-dependency") assertContainsDependencies("jsMainApi", "test:source-set-dependency") assertNotContainsDependencies("jsMainApi", "test:compilation-dependency") } } + + @Test + fun `test compilation and source set configurations don't clash`() { + val project = buildProjectWithMPP { + kotlin { + jvm() + js(BOTH) + linuxX64("linux") + } + } + + project.evaluate() + + project.kotlinExtension.targets.flatMap { it.compilations }.forEach { compilation -> + val compilationSourceSets = compilation.allKotlinSourceSets + val compilationConfigurationNames = compilation.relatedConfigurationNames + val sourceSetConfigurationNames = compilationSourceSets.flatMapTo(mutableSetOf()) { it.relatedConfigurationNames } + + assert(compilationConfigurationNames.none { it in sourceSetConfigurationNames }) { + """A name clash between source set and compilation configurations detected for the following configurations: + |${compilationConfigurationNames.filter { it in sourceSetConfigurationNames }.joinToString()} + """.trimMargin() + } + } + } + + @Test + fun `test scoped sourceSet's configurations don't extend other configurations`() { + val project = buildProjectWithMPP { + kotlin { + jvm() + js(BOTH) + linuxX64("linux") + } + } + + project.evaluate() + + for (sourceSet in project.kotlinExtension.sourceSets) { + val configurationNames = listOf( + sourceSet.implementationConfigurationName, + sourceSet.apiConfigurationName, + sourceSet.compileOnlyConfigurationName, + sourceSet.runtimeOnlyConfigurationName, + ) + + for (name in configurationNames) { + val extendsFrom = project.configurations.getByName(name).extendsFrom + assert(extendsFrom.isEmpty()) { + "Configuration $name is not expected to be extending anything, but it extends: ${ + extendsFrom.joinToString( + prefix = "[", + postfix = "]" + ) { it.name } + }" + } + } + } + } } \ No newline at end of file