[Gradle] resolvableMetadataConfiguration: Use named configuration and extendsFrom

^KT-55289 Verification Pending
This commit is contained in:
Sebastian Sellmair
2022-12-07 14:19:53 +01:00
committed by Space Team
parent f0ac427f46
commit a438c12bf5
2 changed files with 38 additions and 19 deletions
@@ -121,9 +121,7 @@ internal class GranularMetadataTransformation(
kotlinSourceSet.internal.resolvableMetadataConfiguration.incoming.dependencies
}
internal val configurationToResolve: Configuration by lazy {
kotlinSourceSet.internal.resolvableMetadataConfiguration
}
internal val configurationToResolve: Configuration = kotlinSourceSet.internal.resolvableMetadataConfiguration
private fun doTransform(): Iterable<MetadataDependencyResolution> {
val result = mutableListOf<MetadataDependencyResolution>()
@@ -5,42 +5,57 @@
package org.jetbrains.kotlin.gradle.plugin.mpp
import org.gradle.api.Project
import org.gradle.api.artifacts.Configuration
import org.gradle.api.provider.Provider
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.InternalKotlinSourceSet
import org.jetbrains.kotlin.gradle.plugin.sources.METADATA_CONFIGURATION_NAME_SUFFIX
import org.jetbrains.kotlin.gradle.plugin.sources.disambiguateName
import org.jetbrains.kotlin.gradle.plugin.sources.getVisibleSourceSetsFromAssociateCompilations
import org.jetbrains.kotlin.gradle.plugin.sources.withDependsOnClosure
import org.jetbrains.kotlin.gradle.targets.metadata.ALL_COMPILE_METADATA_CONFIGURATION_NAME
import org.jetbrains.kotlin.gradle.utils.listProperty
import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName
import org.jetbrains.kotlin.tooling.core.extrasLazyProperty
/**
* @see resolvableMetadataConfiguration
*/
internal val InternalKotlinSourceSet.resolvableMetadataConfigurationName: String
get() = disambiguateName(lowerCamelCaseName("resolvable", METADATA_CONFIGURATION_NAME_SUFFIX))
/**
* 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"
) {
val configuration = project.configurations.detachedConfiguration()
assert(resolvableMetadataConfigurationName !in project.configurations.names)
val configuration = project.configurations.maybeCreate(resolvableMetadataConfigurationName)
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
)
withDependsOnClosure.forAll { sourceSet ->
configuration.extendsFrom(project.configurations.getByName(sourceSet.apiConfigurationName))
configuration.extendsFrom(project.configurations.getByName(sourceSet.implementationConfigurationName))
configuration.extendsFrom(project.configurations.getByName(sourceSet.compileOnlyConfigurationName))
}
/**
* Adding dependencies from associate compilations using a listProvider, since we would like to defer
* the call to 'getVisibleSourceSetsFromAssociateCompilations' as much as possible (changes to the model might significantly
* change the result of this visible source sets)
*/
configuration.dependencies.addAllLater(project.listProvider {
getVisibleSourceSetsFromAssociateCompilations(this).flatMap { sourceSet ->
project.configurations.getByName(sourceSet.apiConfigurationName).allDependencies +
project.configurations.getByName(sourceSet.implementationConfigurationName).allDependencies +
project.configurations.getByName(sourceSet.compileOnlyConfigurationName).allDependencies
}
})
val allCompileMetadataConfiguration = project.configurations.getByName(ALL_COMPILE_METADATA_CONFIGURATION_NAME)
/* Ensure consistent dependency resolution result within the whole module */
@@ -49,3 +64,9 @@ internal val InternalKotlinSourceSet.resolvableMetadataConfiguration: Configurat
configuration
}
private inline fun <reified T> Project.listProvider(noinline provider: () -> List<T>): Provider<List<T>> {
return project.objects.listProperty<T>().apply {
set(project.provider(provider))
}
}