[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
This commit is contained in:
Anton Lakotka
2023-12-04 12:24:41 +01:00
committed by Space Team
parent 1d4bca56b1
commit c979e4e7be
5 changed files with 45 additions and 36 deletions
@@ -5,59 +5,28 @@
package org.jetbrains.kotlin.gradle.plugin.ide.dependencyResolvers 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.component.ModuleComponentIdentifier
import org.gradle.api.artifacts.result.ResolvedVariantResult 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.*
import org.jetbrains.kotlin.gradle.idea.tcs.extras.sourcesClasspath 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.KotlinSourceSet
import org.jetbrains.kotlin.gradle.plugin.KotlinTarget
import org.jetbrains.kotlin.gradle.plugin.ide.IdeAdditionalArtifactResolver import org.jetbrains.kotlin.gradle.plugin.ide.IdeAdditionalArtifactResolver
import org.jetbrains.kotlin.gradle.plugin.ide.IdeaKotlinBinaryCapability 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.plugin.sources.internal
import org.jetbrains.kotlin.gradle.utils.createResolvable
import org.jetbrains.kotlin.gradle.utils.detachedResolvable
internal object IdeSourcesVariantsResolver : IdeAdditionalArtifactResolver { internal object IdeSourcesVariantsResolver : IdeAdditionalArtifactResolver {
override fun resolve(sourceSet: KotlinSourceSet, dependencies: Set<IdeaKotlinDependency>) { override fun resolve(sourceSet: KotlinSourceSet, dependencies: Set<IdeaKotlinDependency>) {
val project = sourceSet.project val project = sourceSet.project
val metadataTarget = project.multiplatformExtensionOrNull?.metadataTarget
val binaryDependenciesByCoordinates = dependencies val binaryDependenciesByCoordinates = dependencies
.filterIsInstance<IdeaKotlinResolvedBinaryDependency>() .filterIsInstance<IdeaKotlinResolvedBinaryDependency>()
.filter { dependency -> dependency.isKotlinCompileBinaryType } .filter { dependency -> dependency.isKotlinCompileBinaryType }
.groupBy { Coordinates(it.coordinates) } .groupBy { Coordinates(it.coordinates) }
val platformCompilation = sourceSet.internal val dependencySourceConfiguration = project.configurations
.compilations .findByName(sourceSet.internal.dependencySourcesConfigurationName) ?: return
.singleOrNull { it.platformType != KotlinPlatformType.common }
dependencySourceConfiguration.incoming.artifactView { it.isLenient = true }.artifacts.forEach { artifactDependency ->
// 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 ->
val coordinates = Coordinates(artifactDependency.variant) val coordinates = Coordinates(artifactDependency.variant)
val binaryDependencies = binaryDependenciesByCoordinates[coordinates] ?: return@forEach val binaryDependencies = binaryDependenciesByCoordinates[coordinates] ?: return@forEach
binaryDependencies.forEach { dependency -> binaryDependencies.forEach { dependency ->
@@ -11,9 +11,9 @@ import org.gradle.api.Action
import org.gradle.api.Project import org.gradle.api.Project
import org.gradle.api.file.SourceDirectorySet import org.gradle.api.file.SourceDirectorySet
import org.jetbrains.kotlin.build.DEFAULT_KOTLIN_SOURCE_FILES_EXTENSIONS 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.dsl.KotlinMultiplatformExtension
import org.jetbrains.kotlin.gradle.plugin.* 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.plugin.mpp.*
import org.jetbrains.kotlin.gradle.utils.* import org.jetbrains.kotlin.gradle.utils.*
import org.jetbrains.kotlin.tooling.core.MutableExtras import org.jetbrains.kotlin.tooling.core.MutableExtras
@@ -43,6 +43,10 @@ abstract class DefaultKotlinSourceSet @Inject constructor(
override val runtimeOnlyConfigurationName: String override val runtimeOnlyConfigurationName: String
get() = disambiguateName(RUNTIME_ONLY) get() = disambiguateName(RUNTIME_ONLY)
@ExperimentalKotlinGradlePluginApi
override val dependencySourcesConfigurationName: String
get() = disambiguateName("dependencySources")
@Deprecated("KT-55312") @Deprecated("KT-55312")
override val apiMetadataConfigurationName: String override val apiMetadataConfigurationName: String
get() = lowerCamelCaseName(apiConfigurationName, METADATA_CONFIGURATION_NAME_SUFFIX) get() = lowerCamelCaseName(apiConfigurationName, METADATA_CONFIGURATION_NAME_SUFFIX)
@@ -23,6 +23,9 @@ internal interface InternalKotlinSourceSet : KotlinSourceSet {
val dependsOnClosure: ObservableSet<KotlinSourceSet> val dependsOnClosure: ObservableSet<KotlinSourceSet>
val withDependsOnClosure: ObservableSet<KotlinSourceSet> val withDependsOnClosure: ObservableSet<KotlinSourceSet>
val compilations: MutableObservableSet<KotlinCompilation<*>> val compilations: MutableObservableSet<KotlinCompilation<*>>
/** Configuration that resolves into sources variants of all Source Set dependencies */
val dependencySourcesConfigurationName: String
} }
internal suspend fun InternalKotlinSourceSet.awaitPlatformCompilations(): Set<KotlinCompilation<*>> { internal suspend fun InternalKotlinSourceSet.awaitPlatformCompilations(): Set<KotlinCompilation<*>> {
@@ -7,11 +7,18 @@ package org.jetbrains.kotlin.gradle.plugin.sources
import org.gradle.api.NamedDomainObjectFactory import org.gradle.api.NamedDomainObjectFactory
import org.gradle.api.Project import org.gradle.api.Project
import org.gradle.api.artifacts.Configuration
import org.gradle.api.attributes.Category import org.gradle.api.attributes.Category
import org.gradle.api.attributes.Usage 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.*
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinUsages 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.targets.metadata.isKotlinGranularMetadataEnabled
import org.jetbrains.kotlin.gradle.utils.createResolvable
import org.jetbrains.kotlin.gradle.utils.maybeCreateDependencyScope import org.jetbrains.kotlin.gradle.utils.maybeCreateDependencyScope
import org.jetbrains.kotlin.gradle.utils.maybeCreateResolvable import org.jetbrains.kotlin.gradle.utils.maybeCreateResolvable
import java.io.File 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 = override fun doCreateSourceSet(name: String): DefaultKotlinSourceSet =
@@ -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.KotlinNativeTarget
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinUsages import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinUsages
import org.jetbrains.kotlin.gradle.plugin.mpp.NativeBuildType 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.KotlinJsCompilerAttribute
import org.jetbrains.kotlin.gradle.targets.js.dsl.ExperimentalWasmDsl import org.jetbrains.kotlin.gradle.targets.js.dsl.ExperimentalWasmDsl
import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrTarget import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrTarget
import org.jetbrains.kotlin.gradle.util.* import org.jetbrains.kotlin.gradle.util.*
import org.jetbrains.kotlin.gradle.utils.targets
import org.jetbrains.kotlin.gradle.utils.toMap import org.jetbrains.kotlin.gradle.utils.toMap
import java.util.* import java.util.*
import kotlin.test.* import kotlin.test.*
@@ -144,6 +144,7 @@ class ConfigurationsTest : MultiplatformExtensionTest() {
project.evaluate() project.evaluate()
project.configurations project.configurations
.filter { it.isCanBeConsumed }
.filter { configuration -> .filter { configuration ->
configuration.attributes.contains(KotlinPlatformType.attribute) || configuration.attributes.contains(KotlinPlatformType.attribute) ||
configuration.attributes.getAttribute(Usage.USAGE_ATTRIBUTE)?.name in KotlinUsages.values configuration.attributes.getAttribute(Usage.USAGE_ATTRIBUTE)?.name in KotlinUsages.values