From c979e4e7be88c61828c45e3f982522dc13293102 Mon Sep 17 00:00:00 2001 From: Anton Lakotka Date: Mon, 4 Dec 2023 12:24:41 +0100 Subject: [PATCH] [Gradle] Add dependencySourcesConfigurationName to DefaultKotlinSourceSet Move logic that creates configuration to resolve Dependency Sources to SourceSet factory from IDE resolver. Because when it is created during IDE import it will be reported as a warning. Since all configurations and tasks must be created before IDE import starts. ^KT-63226 Verification Pending --- .../IdeSourcesVariantsResolver.kt | 37 ++----------------- .../plugin/sources/DefaultKotlinSourceSet.kt | 6 ++- .../plugin/sources/InternalKotlinSourceSet.kt | 3 ++ .../plugin/sources/KotlinSourceSetFactory.kt | 32 ++++++++++++++++ .../regressionTests/ConfigurationsTest.kt | 3 +- 5 files changed, 45 insertions(+), 36 deletions(-) diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/dependencyResolvers/IdeSourcesVariantsResolver.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/dependencyResolvers/IdeSourcesVariantsResolver.kt index a886ab34491..4d89cb28836 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/dependencyResolvers/IdeSourcesVariantsResolver.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/dependencyResolvers/IdeSourcesVariantsResolver.kt @@ -5,59 +5,28 @@ package org.jetbrains.kotlin.gradle.plugin.ide.dependencyResolvers -import org.gradle.api.artifacts.Configuration import org.gradle.api.artifacts.component.ModuleComponentIdentifier import org.gradle.api.artifacts.result.ResolvedVariantResult -import org.jetbrains.kotlin.gradle.dsl.metadataTarget -import org.jetbrains.kotlin.gradle.dsl.multiplatformExtensionOrNull import org.jetbrains.kotlin.gradle.idea.tcs.* import org.jetbrains.kotlin.gradle.idea.tcs.extras.sourcesClasspath -import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet -import org.jetbrains.kotlin.gradle.plugin.KotlinTarget import org.jetbrains.kotlin.gradle.plugin.ide.IdeAdditionalArtifactResolver import org.jetbrains.kotlin.gradle.plugin.ide.IdeaKotlinBinaryCapability -import org.jetbrains.kotlin.gradle.plugin.mpp.configureSourcesPublicationAttributes -import org.jetbrains.kotlin.gradle.plugin.mpp.internal -import org.jetbrains.kotlin.gradle.plugin.mpp.resolvableMetadataConfiguration -import org.jetbrains.kotlin.gradle.plugin.sources.disambiguateName import org.jetbrains.kotlin.gradle.plugin.sources.internal -import org.jetbrains.kotlin.gradle.utils.createResolvable -import org.jetbrains.kotlin.gradle.utils.detachedResolvable internal object IdeSourcesVariantsResolver : IdeAdditionalArtifactResolver { override fun resolve(sourceSet: KotlinSourceSet, dependencies: Set) { val project = sourceSet.project - val metadataTarget = project.multiplatformExtensionOrNull?.metadataTarget val binaryDependenciesByCoordinates = dependencies .filterIsInstance() .filter { dependency -> dependency.isKotlinCompileBinaryType } .groupBy { Coordinates(it.coordinates) } - val platformCompilation = sourceSet.internal - .compilations - .singleOrNull { it.platformType != KotlinPlatformType.common } + val dependencySourceConfiguration = project.configurations + .findByName(sourceSet.internal.dependencySourcesConfigurationName) ?: return - - // Shared source sets and platform source sets has different configurations for compile dependencies - val configuration: Configuration - val target: KotlinTarget - if (platformCompilation == null) { - target = metadataTarget ?: return // source set configured incorrectly, can't resolve artifact for that - configuration = sourceSet.internal.resolvableMetadataConfiguration - } else { - target = platformCompilation.target - configuration = platformCompilation.internal.configurations.compileDependencyConfiguration - } - - val sourcesConfig = project.configurations.detachedResolvable() - sourcesConfig.apply { - configureSourcesPublicationAttributes(target) - extendsFrom(configuration) - } - - sourcesConfig.incoming.artifactView { it.isLenient = true }.artifacts.forEach { artifactDependency -> + dependencySourceConfiguration.incoming.artifactView { it.isLenient = true }.artifacts.forEach { artifactDependency -> val coordinates = Coordinates(artifactDependency.variant) val binaryDependencies = binaryDependenciesByCoordinates[coordinates] ?: return@forEach binaryDependencies.forEach { dependency -> diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/sources/DefaultKotlinSourceSet.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/sources/DefaultKotlinSourceSet.kt index 9f731e8060b..d67458b6d65 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/sources/DefaultKotlinSourceSet.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/sources/DefaultKotlinSourceSet.kt @@ -11,9 +11,9 @@ import org.gradle.api.Action import org.gradle.api.Project import org.gradle.api.file.SourceDirectorySet import org.jetbrains.kotlin.build.DEFAULT_KOTLIN_SOURCE_FILES_EXTENSIONS +import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension import org.jetbrains.kotlin.gradle.plugin.* -import org.jetbrains.kotlin.gradle.plugin.launchInStage import org.jetbrains.kotlin.gradle.plugin.mpp.* import org.jetbrains.kotlin.gradle.utils.* import org.jetbrains.kotlin.tooling.core.MutableExtras @@ -43,6 +43,10 @@ abstract class DefaultKotlinSourceSet @Inject constructor( override val runtimeOnlyConfigurationName: String get() = disambiguateName(RUNTIME_ONLY) + @ExperimentalKotlinGradlePluginApi + override val dependencySourcesConfigurationName: String + get() = disambiguateName("dependencySources") + @Deprecated("KT-55312") override val apiMetadataConfigurationName: String get() = lowerCamelCaseName(apiConfigurationName, METADATA_CONFIGURATION_NAME_SUFFIX) diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/sources/InternalKotlinSourceSet.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/sources/InternalKotlinSourceSet.kt index 571cfcf6097..f031a50e962 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/sources/InternalKotlinSourceSet.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/sources/InternalKotlinSourceSet.kt @@ -23,6 +23,9 @@ internal interface InternalKotlinSourceSet : KotlinSourceSet { val dependsOnClosure: ObservableSet val withDependsOnClosure: ObservableSet val compilations: MutableObservableSet> + + /** Configuration that resolves into sources variants of all Source Set dependencies */ + val dependencySourcesConfigurationName: String } internal suspend fun InternalKotlinSourceSet.awaitPlatformCompilations(): Set> { diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/sources/KotlinSourceSetFactory.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/sources/KotlinSourceSetFactory.kt index 1bd1aaba735..7c55c23de62 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/sources/KotlinSourceSetFactory.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/sources/KotlinSourceSetFactory.kt @@ -7,11 +7,18 @@ package org.jetbrains.kotlin.gradle.plugin.sources import org.gradle.api.NamedDomainObjectFactory import org.gradle.api.Project +import org.gradle.api.artifacts.Configuration import org.gradle.api.attributes.Category import org.gradle.api.attributes.Usage +import org.jetbrains.kotlin.gradle.dsl.metadataTarget +import org.jetbrains.kotlin.gradle.dsl.multiplatformExtensionOrNull import org.jetbrains.kotlin.gradle.plugin.* import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinUsages +import org.jetbrains.kotlin.gradle.plugin.mpp.configureSourcesPublicationAttributes +import org.jetbrains.kotlin.gradle.plugin.mpp.internal +import org.jetbrains.kotlin.gradle.plugin.mpp.resolvableMetadataConfiguration import org.jetbrains.kotlin.gradle.targets.metadata.isKotlinGranularMetadataEnabled +import org.jetbrains.kotlin.gradle.utils.createResolvable import org.jetbrains.kotlin.gradle.utils.maybeCreateDependencyScope import org.jetbrains.kotlin.gradle.utils.maybeCreateResolvable import java.io.File @@ -102,6 +109,31 @@ internal class DefaultKotlinSourceSetFactory( } } } + + setupDependencySourcesConfiguration(sourceSet) + } + + private fun setupDependencySourcesConfiguration(sourceSet: DefaultKotlinSourceSet) { + project.launch { + val platformCompilation = sourceSet.awaitPlatformCompilations().singleOrNull() + + // Shared source sets and platform source sets has different configurations for compile dependencies + val configuration: Configuration + val target: KotlinTarget + if (platformCompilation == null) { + target = project.multiplatformExtensionOrNull?.metadataTarget ?: return@launch // source set configured incorrectly, can't resolve artifact for that + configuration = sourceSet.internal.resolvableMetadataConfiguration + } else { + target = platformCompilation.target + configuration = platformCompilation.internal.configurations.compileDependencyConfiguration + } + + val sourcesConfig = project.configurations.createResolvable(sourceSet.dependencySourcesConfigurationName) + sourcesConfig.apply { + configureSourcesPublicationAttributes(target) + extendsFrom(configuration) + } + } } override fun doCreateSourceSet(name: String): DefaultKotlinSourceSet = diff --git a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/regressionTests/ConfigurationsTest.kt b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/regressionTests/ConfigurationsTest.kt index 2c837aea3b3..08cdf6593cc 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/regressionTests/ConfigurationsTest.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/regressionTests/ConfigurationsTest.kt @@ -25,11 +25,11 @@ 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.NativeBuildType -import org.jetbrains.kotlin.gradle.utils.targets import org.jetbrains.kotlin.gradle.targets.js.KotlinJsCompilerAttribute import org.jetbrains.kotlin.gradle.targets.js.dsl.ExperimentalWasmDsl import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrTarget import org.jetbrains.kotlin.gradle.util.* +import org.jetbrains.kotlin.gradle.utils.targets import org.jetbrains.kotlin.gradle.utils.toMap import java.util.* import kotlin.test.* @@ -144,6 +144,7 @@ class ConfigurationsTest : MultiplatformExtensionTest() { project.evaluate() project.configurations + .filter { it.isCanBeConsumed } .filter { configuration -> configuration.attributes.contains(KotlinPlatformType.attribute) || configuration.attributes.getAttribute(Usage.USAGE_ATTRIBUTE)?.name in KotlinUsages.values