[Gradle] Implement and re-use resolvableMetadataConfiguration for Source Sets

^KT-55289 Verification Pending
This commit is contained in:
Sebastian Sellmair
2022-12-07 10:02:30 +01:00
committed by Space Team
parent 764a57f126
commit ec9956041a
9 changed files with 71 additions and 64 deletions
@@ -12,12 +12,12 @@ import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet
import org.jetbrains.kotlin.gradle.plugin.ide.IdeDependencyResolver import org.jetbrains.kotlin.gradle.plugin.ide.IdeDependencyResolver
import org.jetbrains.kotlin.gradle.plugin.ide.IdeaKotlinBinaryCoordinates import org.jetbrains.kotlin.gradle.plugin.ide.IdeaKotlinBinaryCoordinates
import org.jetbrains.kotlin.gradle.plugin.mpp.MetadataDependencyResolution import org.jetbrains.kotlin.gradle.plugin.mpp.MetadataDependencyResolution
import org.jetbrains.kotlin.gradle.plugin.mpp.resolvableMetadataConfigurationForSourceSets import org.jetbrains.kotlin.gradle.plugin.mpp.resolvableMetadataConfiguration
import org.jetbrains.kotlin.gradle.plugin.sources.project import org.jetbrains.kotlin.gradle.plugin.sources.internal
object IdeOriginalMetadataDependencyResolver : IdeDependencyResolver { object IdeOriginalMetadataDependencyResolver : IdeDependencyResolver {
override fun resolve(sourceSet: KotlinSourceSet): Set<IdeaKotlinDependency> { override fun resolve(sourceSet: KotlinSourceSet): Set<IdeaKotlinDependency> {
val metadataDependenciesConfiguration = resolvableMetadataConfigurationForSourceSets(sourceSet.project, listOf(sourceSet)) val metadataDependenciesConfiguration = sourceSet.internal.resolvableMetadataConfiguration
val keptOriginalDependencyResolutionIds = sourceSet.resolveMetadata<MetadataDependencyResolution.KeepOriginalDependency>() val keptOriginalDependencyResolutionIds = sourceSet.resolveMetadata<MetadataDependencyResolution.KeepOriginalDependency>()
.map { it.dependency.id }.toSet() .map { it.dependency.id }.toSet()
@@ -6,7 +6,6 @@
package org.jetbrains.kotlin.gradle.plugin.ide.dependencyResolvers package org.jetbrains.kotlin.gradle.plugin.ide.dependencyResolvers
import org.gradle.api.artifacts.ArtifactView import org.gradle.api.artifacts.ArtifactView
import org.gradle.api.artifacts.Configuration
import org.gradle.api.artifacts.component.LibraryBinaryIdentifier import org.gradle.api.artifacts.component.LibraryBinaryIdentifier
import org.gradle.api.artifacts.component.ModuleComponentIdentifier import org.gradle.api.artifacts.component.ModuleComponentIdentifier
import org.gradle.api.artifacts.component.ModuleComponentSelector import org.gradle.api.artifacts.component.ModuleComponentSelector
@@ -28,9 +27,11 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinMetadataCompilation
import org.jetbrains.kotlin.gradle.plugin.mpp.internal import org.jetbrains.kotlin.gradle.plugin.mpp.internal
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.GradleKpmFragment import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.GradleKpmFragment
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.GradleKpmVariant import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.GradleKpmVariant
import org.jetbrains.kotlin.gradle.plugin.sources.* import org.jetbrains.kotlin.gradle.plugin.mpp.resolvableMetadataConfiguration
import org.jetbrains.kotlin.gradle.targets.metadata.ALL_COMPILE_METADATA_CONFIGURATION_NAME import org.jetbrains.kotlin.gradle.plugin.sources.DefaultKotlinSourceSet
import org.jetbrains.kotlin.tooling.core.extrasReadWriteProperty import org.jetbrains.kotlin.gradle.plugin.sources.InternalKotlinSourceSet
import org.jetbrains.kotlin.gradle.plugin.sources.internal
import org.jetbrains.kotlin.gradle.plugin.sources.project
import org.jetbrains.kotlin.tooling.core.mutableExtrasOf import org.jetbrains.kotlin.tooling.core.mutableExtrasOf
internal class IdePlatformDependencyResolver( internal class IdePlatformDependencyResolver(
@@ -157,34 +158,11 @@ internal class IdePlatformDependencyResolver(
private fun ArtifactResolutionStrategy.PlatformLikeSourceSet.createArtifactView(sourceSet: InternalKotlinSourceSet): ArtifactView? { private fun ArtifactResolutionStrategy.PlatformLikeSourceSet.createArtifactView(sourceSet: InternalKotlinSourceSet): ArtifactView? {
if (sourceSet !is DefaultKotlinSourceSet) return null if (sourceSet !is DefaultKotlinSourceSet) return null
val project = sourceSet.project
val platformLikeCompileDependenciesConfiguration = sourceSet.platformLikeCompileDependenciesConfiguration ?: run { val platformLikeCompileDependenciesConfiguration = project.configurations.detachedConfiguration()
/* Create new 'platform like compileDependencies configuration */ platformLikeCompileDependenciesConfiguration.attributes.setupPlatformResolutionAttributes(sourceSet)
val configuration = sourceSet.project.configurations.detachedConfiguration() platformLikeCompileDependenciesConfiguration.dependencies.addAll(sourceSet.resolvableMetadataConfiguration.allDependencies)
configuration.attributes.setupPlatformResolutionAttributes(sourceSet)
((sourceSet.getAdditionalVisibleSourceSets() + sourceSet).withDependsOnClosure).forEach { visibleSourceSet ->
configuration.dependencies.addAll(
sourceSet.project.configurations.getByName(visibleSourceSet.apiConfigurationName).allDependencies
)
configuration.dependencies.addAll(
sourceSet.project.configurations.getByName(visibleSourceSet.implementationConfigurationName).allDependencies
)
configuration.dependencies.addAll(
sourceSet.project.configurations.getByName(visibleSourceSet.compileOnlyConfigurationName).allDependencies
)
}
/* Ensure consistent dependency resolution result within the whole module */
configuration.shouldResolveConsistentlyWith(
sourceSet.project.configurations.getByName(ALL_COMPILE_METADATA_CONFIGURATION_NAME)
)
sourceSet.platformLikeCompileDependenciesConfiguration = configuration
configuration
}
return platformLikeCompileDependenciesConfiguration.incoming.artifactView { view -> return platformLikeCompileDependenciesConfiguration.incoming.artifactView { view ->
view.isLenient = true view.isLenient = true
@@ -194,9 +172,5 @@ internal class IdePlatformDependencyResolver(
private companion object { private companion object {
val logger: Logger = Logging.getLogger(IdePlatformDependencyResolver::class.java) val logger: Logger = Logging.getLogger(IdePlatformDependencyResolver::class.java)
/* This special 'platform like compileDependency configurations' can be attached to the SourceSet and re-used */
var InternalKotlinSourceSet.platformLikeCompileDependenciesConfiguration: Configuration?
by extrasReadWriteProperty("platformLikeCompileDependenciesConfiguration")
} }
} }
@@ -17,13 +17,14 @@ import org.jetbrains.kotlin.gradle.idea.tcs.IdeaKotlinResolvedBinaryDependency
import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet
import org.jetbrains.kotlin.gradle.plugin.ide.IdeDependencyResolver import org.jetbrains.kotlin.gradle.plugin.ide.IdeDependencyResolver
import org.jetbrains.kotlin.gradle.plugin.ide.IdeaKotlinBinaryCoordinates import org.jetbrains.kotlin.gradle.plugin.ide.IdeaKotlinBinaryCoordinates
import org.jetbrains.kotlin.gradle.plugin.mpp.resolvableMetadataConfigurationForSourceSets import org.jetbrains.kotlin.gradle.plugin.mpp.resolvableMetadataConfiguration
import org.jetbrains.kotlin.gradle.plugin.sources.internal
import org.jetbrains.kotlin.gradle.plugin.sources.project import org.jetbrains.kotlin.gradle.plugin.sources.project
internal object IdeSlowSourcesAndDocumentationResolver : IdeDependencyResolver { internal object IdeSlowSourcesAndDocumentationResolver : IdeDependencyResolver {
override fun resolve(sourceSet: KotlinSourceSet): Set<IdeaKotlinDependency> { override fun resolve(sourceSet: KotlinSourceSet): Set<IdeaKotlinDependency> {
val project = sourceSet.project val project = sourceSet.project
val configuration = resolvableMetadataConfigurationForSourceSets(sourceSet.project, listOf(sourceSet)) val configuration = sourceSet.internal.resolvableMetadataConfiguration
val resolutionResult = project.dependencies.createArtifactResolutionQuery() val resolutionResult = project.dependencies.createArtifactResolutionQuery()
.forComponents(configuration.incoming.resolutionResult.allComponents.map { it.id }) .forComponents(configuration.incoming.resolutionResult.allComponents.map { it.id })
.withArtifacts(JvmLibrary::class.java, SourcesArtifact::class.java, JavadocArtifact::class.java) .withArtifacts(JvmLibrary::class.java, SourcesArtifact::class.java, JavadocArtifact::class.java)
@@ -307,13 +307,6 @@ internal fun ResolvedComponentResult.toProjectOrNull(currentProject: Project): P
} }
} }
internal fun resolvableMetadataConfigurationForSourceSets(
project: Project,
sourceSets: Iterable<KotlinSourceSet>,
): Configuration = resolvableMetadataConfigurationForDependencies(
project,
sourceSets.flatMapTo(mutableListOf()) { requestedDependencies(project, it, KotlinDependencyScope.compileScopes) }
)
/** If a source set is not a published source set, its dependencies are not included in [allSourceSetsConfiguration]. /** If a source set is not a published source set, its dependencies are not included in [allSourceSetsConfiguration].
* In that case, to resolve the dependencies of the source set in a way that is consistent with the published source sets, * In that case, to resolve the dependencies of the source set in a way that is consistent with the published source sets,
@@ -17,7 +17,7 @@ open class GradleKpmComponentResultCachingResolver {
private val cachedResultsByRequestingModule = mutableMapOf<GradleKpmModule, Map<KpmModuleIdentifier, ResolvedComponentResult>>() private val cachedResultsByRequestingModule = mutableMapOf<GradleKpmModule, Map<KpmModuleIdentifier, ResolvedComponentResult>>()
protected open fun configurationToResolve(requestingModule: GradleKpmModule): Configuration = protected open fun configurationToResolve(requestingModule: GradleKpmModule): Configuration =
configurationToResolveMetadataDependencies(requestingModule.project, requestingModule) configurationToResolveMetadataDependencies(requestingModule)
protected open fun resolveDependencies(module: GradleKpmModule): Map<KpmModuleIdentifier, ResolvedComponentResult> { protected open fun resolveDependencies(module: GradleKpmModule): Map<KpmModuleIdentifier, ResolvedComponentResult> {
val allComponents = configurationToResolve(module).incoming.resolutionResult.allComponents val allComponents = configurationToResolve(module).incoming.resolutionResult.allComponents
@@ -5,35 +5,24 @@
package org.jetbrains.kotlin.gradle.plugin.mpp.pm20 package org.jetbrains.kotlin.gradle.plugin.mpp.pm20
import org.gradle.api.Project
import org.gradle.api.artifacts.Configuration import org.gradle.api.artifacts.Configuration
import org.gradle.api.artifacts.result.ResolvedComponentResult import org.gradle.api.artifacts.result.ResolvedComponentResult
import org.gradle.api.artifacts.result.ResolvedDependencyResult import org.gradle.api.artifacts.result.ResolvedDependencyResult
import org.jetbrains.kotlin.gradle.dsl.kotlinExtension
import org.jetbrains.kotlin.gradle.dsl.pm20ExtensionOrNull
import org.jetbrains.kotlin.gradle.plugin.mpp.resolvableMetadataConfigurationForSourceSets
import org.jetbrains.kotlin.project.model.* import org.jetbrains.kotlin.project.model.*
internal fun resolvableMetadataConfiguration( internal fun resolvableMetadataConfiguration(
module: GradleKpmModule module: GradleKpmModule
) = module.project.configurations.getByName(module.resolvableMetadataConfigurationName) ) = module.project.configurations.getByName(module.resolvableMetadataConfigurationName)
internal fun configurationToResolveMetadataDependencies(project: Project, requestingModule: KpmModule): Configuration = internal fun configurationToResolveMetadataDependencies(requestingModule: KpmModule): Configuration =
when { resolvableMetadataConfiguration(requestingModule as GradleKpmModule)
project.pm20ExtensionOrNull != null -> resolvableMetadataConfiguration(requestingModule as GradleKpmModule)
else -> resolvableMetadataConfigurationForSourceSets(
project,
project.kotlinExtension.sourceSets, // take dependencies from all source sets; TODO introduce consistency scopes?
)
}
class GradleKpmDependencyGraphResolver( class GradleKpmDependencyGraphResolver(
private val moduleResolver: KpmModuleDependencyResolver private val moduleResolver: KpmModuleDependencyResolver
) : KpmDependencyGraphResolver { ) : KpmDependencyGraphResolver {
private fun configurationToResolve(requestingModule: GradleKpmModule): Configuration = private fun configurationToResolve(requestingModule: GradleKpmModule): Configuration =
configurationToResolveMetadataDependencies(requestingModule.project, requestingModule) configurationToResolveMetadataDependencies(requestingModule)
override fun resolveDependencyGraph(requestingModule: KpmModule): KpmDependencyGraphResolution { override fun resolveDependencyGraph(requestingModule: KpmModule): KpmDependencyGraphResolution {
if (requestingModule !is GradleKpmModule) if (requestingModule !is GradleKpmModule)
@@ -35,7 +35,7 @@ internal class GradleKpmFragmentGranularMetadataResolver(
private val dependencyGraphResolver = GradleKpmDependencyGraphResolver(moduleResolver) private val dependencyGraphResolver = GradleKpmDependencyGraphResolver(moduleResolver)
private fun doResolveMetadataDependencies(): Iterable<MetadataDependencyResolution> { private fun doResolveMetadataDependencies(): Iterable<MetadataDependencyResolution> {
val configurationToResolve = configurationToResolveMetadataDependencies(project, requestingFragment.containingModule) val configurationToResolve = configurationToResolveMetadataDependencies(requestingFragment.containingModule)
val resolvedComponentsByModuleId = val resolvedComponentsByModuleId =
configurationToResolve.incoming.resolutionResult.allComponents.associateBy { it.toSingleKpmModuleIdentifier() } configurationToResolve.incoming.resolutionResult.allComponents.associateBy { it.toSingleKpmModuleIdentifier() }
val resolvedDependenciesByModuleId = val resolvedDependenciesByModuleId =
@@ -42,7 +42,7 @@ class GradleKpmModuleDependencyResolver(
project, project,
component, component,
// TODO: consistent choice of configurations across multiple resolvers? // TODO: consistent choice of configurations across multiple resolvers?
configurationToResolveMetadataDependencies(requestingModule.project, requestingModule), configurationToResolveMetadataDependencies(requestingModule),
moduleDependency.moduleIdentifier moduleDependency.moduleIdentifier
) ?: return null ) ?: return null
val result = projectStructureMetadataModuleBuilder.getModule(component, metadata) val result = projectStructureMetadataModuleBuilder.getModule(component, metadata)
@@ -0,0 +1,50 @@
/*
* Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.gradle.plugin.mpp
import org.gradle.api.artifacts.Configuration
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.copyAttributes
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.markResolvable
import org.jetbrains.kotlin.gradle.plugin.sources.*
import org.jetbrains.kotlin.gradle.targets.metadata.ALL_COMPILE_METADATA_CONFIGURATION_NAME
import org.jetbrains.kotlin.tooling.core.extrasLazyProperty
/**
* Represents a 'resolvable' configuration containing all dependencies in compile scope.
* These dependencies are set up to resolve Kotlin Metadata (without transformation) and will resolve
* consistently across the whole project.
*
* Creating this configuration will resolve dependency scope configurations on the given SourceSet.
*/
internal val InternalKotlinSourceSet.resolvableMetadataConfiguration: Configuration by extrasLazyProperty(
"resolvableMetadataConfiguration"
) {
/* Create new 'platform like compileDependencies configuration */
val configuration = project.configurations.maybeCreate(disambiguateName("resolvable$METADATA_CONFIGURATION_NAME_SUFFIX"))
configuration.markResolvable()
((getVisibleSourceSetsFromAssociateCompilations(this) + this).withDependsOnClosure).forEach { visibleSourceSet ->
configuration.dependencies.addAll(
project.configurations.getByName(visibleSourceSet.apiConfigurationName).incoming.dependencies
)
configuration.dependencies.addAll(
project.configurations.getByName(visibleSourceSet.implementationConfigurationName).incoming.dependencies
)
configuration.dependencies.addAll(
project.configurations.getByName(visibleSourceSet.compileOnlyConfigurationName).incoming.dependencies
)
}
val allCompileMetadataConfiguration = project.configurations.getByName(ALL_COMPILE_METADATA_CONFIGURATION_NAME)
/* Ensure consistent dependency resolution result within the whole module */
configuration.shouldResolveConsistentlyWith(allCompileMetadataConfiguration)
copyAttributes(allCompileMetadataConfiguration.attributes, configuration.attributes)
configuration
}