[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
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<IdeaKotlinDependency>) {
val project = sourceSet.project
val metadataTarget = project.multiplatformExtensionOrNull?.metadataTarget
val binaryDependenciesByCoordinates = dependencies
.filterIsInstance<IdeaKotlinResolvedBinaryDependency>()
.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 ->
@@ -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)
@@ -23,6 +23,9 @@ internal interface InternalKotlinSourceSet : KotlinSourceSet {
val dependsOnClosure: ObservableSet<KotlinSourceSet>
val withDependsOnClosure: ObservableSet<KotlinSourceSet>
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<*>> {
@@ -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 =
@@ -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