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