From d28659fdbe4ad52b0b7215851a7de96241103a75 Mon Sep 17 00:00:00 2001 From: Anton Lakotka Date: Mon, 5 Dec 2022 10:48:07 +0100 Subject: [PATCH] [Gradle] Merge scoped dependency transformations to one: compile scope There is no need on fine-grained metadata dependencies transformation per scope. Because it is only needed for compilation. ^KT-55230 Fixed --- .../plugin/ide/dependencyResolvers/utils.kt | 10 ++----- .../plugin/sources/DefaultKotlinSourceSet.kt | 30 ++++++++++++------- .../KotlinMetadataTargetConfigurator.kt | 26 ++++++++-------- .../CInteropMetadataDependencyClasspath.kt | 3 +- ...ropMetadataDependencyTransformationTask.kt | 13 ++++---- 5 files changed, 44 insertions(+), 38 deletions(-) diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/dependencyResolvers/utils.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/dependencyResolvers/utils.kt index ee1df1eb474..d8861e0176c 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/dependencyResolvers/utils.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/dependencyResolvers/utils.kt @@ -8,14 +8,8 @@ package org.jetbrains.kotlin.gradle.plugin.ide.dependencyResolvers import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet import org.jetbrains.kotlin.gradle.plugin.mpp.MetadataDependencyResolution import org.jetbrains.kotlin.gradle.plugin.sources.DefaultKotlinSourceSet -import org.jetbrains.kotlin.gradle.plugin.sources.KotlinDependencyScope -import org.jetbrains.kotlin.gradle.plugin.sources.KotlinDependencyScope.* -internal inline fun KotlinSourceSet.resolveMetadata( - scopes: Set = setOf(API_SCOPE, IMPLEMENTATION_SCOPE, COMPILE_ONLY_SCOPE) -): List { +internal inline fun KotlinSourceSet.resolveMetadata(): List { if (this !is DefaultKotlinSourceSet) return emptyList() - return scopes - .flatMap { scope -> dependencyTransformations[scope]?.metadataDependencyResolutions?.toList().orEmpty() } - .filterIsInstance() + return compileDependenciesTransformation.metadataDependencyResolutions.filterIsInstance() } 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 2a4ffbdf7eb..d6c9678d1c2 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 @@ -118,7 +118,20 @@ abstract class DefaultKotlinSourceSet @Inject constructor( explicitlyAddedCustomSourceFilesExtensions.addAll(extensions) } - internal val dependencyTransformations: MutableMap = mutableMapOf() + private var _compileDependenciesTransformation: GranularMetadataTransformation? = null + + internal fun setCompileDependenciesTransformation(value: GranularMetadataTransformation) { + _compileDependenciesTransformation = value + } + + /** + * Returns [GranularMetadataTransformation] for all requested compile dependencies + * scopes: API, IMPLEMENTATION, COMPILE_ONLY; See [KotlinDependencyScope.compileScopes] + */ + internal val compileDependenciesTransformation: GranularMetadataTransformation + get() = _compileDependenciesTransformation + ?: error("Accessing Compile Dependencies Transformations is not yet initialised; " + + "Check when setCompileDependenciesTransformation is called") private val _requiresVisibilityOf = mutableSetOf() @@ -142,22 +155,17 @@ abstract class DefaultKotlinSourceSet @Inject constructor( val useFilesForSourceSets: Map> ) - @Suppress("unused") // Used in IDE import + @Suppress("unused", "UNUSED_PARAMETER") // Used in IDE import, [configurationName] is kept for backward compatibility fun getDependenciesTransformation(configurationName: String): Iterable { - val scope = KotlinDependencyScope.compileScopes.find { - project.sourceSetMetadataConfigurationByScope(this, it)?.name == configurationName - } ?: return emptyList() - - return getDependenciesTransformation(scope) + return getDependenciesTransformation() } fun getAdditionalVisibleSourceSets(): List = getVisibleSourceSetsFromAssociateCompilations(this) - internal fun getDependenciesTransformation(scope: KotlinDependencyScope): Iterable { + private fun getDependenciesTransformation(): Iterable { val metadataDependencyResolutionByModule = - dependencyTransformations[scope]?.metadataDependencyResolutions - ?.associateBy { ModuleIds.fromComponent(project, it.dependency) } - ?: emptyMap() + compileDependenciesTransformation.metadataDependencyResolutions + .associateBy { ModuleIds.fromComponent(project, it.dependency) } return metadataDependencyResolutionByModule.mapNotNull { (groupAndName, resolution) -> val (group, name) = groupAndName diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/metadata/KotlinMetadataTargetConfigurator.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/metadata/KotlinMetadataTargetConfigurator.kt index e7995a195c4..b765a9d425d 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/metadata/KotlinMetadataTargetConfigurator.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/metadata/KotlinMetadataTargetConfigurator.kt @@ -359,20 +359,22 @@ class KotlinMetadataTargetConfigurator : sourceSet: KotlinSourceSet, isSourceSetPublished: Boolean ) { - KotlinDependencyScope.compileScopes.forEach { scope -> - val granularMetadataTransformation = GranularMetadataTransformation( - project, - sourceSet, - listOf(scope), - lazy { - dependsOnClosureWithInterCompilationDependencies(sourceSet).filterIsInstance() - .map { checkNotNull(it.dependencyTransformations[scope]) } - } - ) + val dependencyScopesToTransform = KotlinDependencyScope.compileScopes - if (sourceSet is DefaultKotlinSourceSet) - sourceSet.dependencyTransformations[scope] = granularMetadataTransformation + val granularMetadataTransformation = GranularMetadataTransformation( + project = project, + kotlinSourceSet = sourceSet, + sourceSetRequestedScopes = dependencyScopesToTransform, + parentTransformations = lazy { + dependsOnClosureWithInterCompilationDependencies(sourceSet).filterIsInstance() + .map { it.compileDependenciesTransformation } + } + ) + if (sourceSet is DefaultKotlinSourceSet) + sourceSet.setCompileDependenciesTransformation(granularMetadataTransformation) + + dependencyScopesToTransform.forEach { scope -> val sourceSetDependencyConfigurationByScope = project.configurations.sourceSetDependencyConfigurationByScope(sourceSet, scope) if (isSourceSetPublished) { diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/CInteropMetadataDependencyClasspath.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/CInteropMetadataDependencyClasspath.kt index 204d84495ae..ad4d818b5b4 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/CInteropMetadataDependencyClasspath.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/CInteropMetadataDependencyClasspath.kt @@ -50,7 +50,8 @@ private fun Project.createCInteropMetadataDependencyClasspathFromProjectDependen forIde: Boolean ): FileCollection { return filesProvider { - sourceSet.dependencyTransformations.values.flatMap { it.metadataDependencyResolutions } + sourceSet.compileDependenciesTransformation + .metadataDependencyResolutions .filterIsInstance() .flatMap { chooseVisibleSourceSets -> /* We only want to access resolutions that provide metadata from dependency projects */ diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/CInteropMetadataDependencyTransformationTask.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/CInteropMetadataDependencyTransformationTask.kt index e206f11cb7a..2c58d1fccfd 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/CInteropMetadataDependencyTransformationTask.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/CInteropMetadataDependencyTransformationTask.kt @@ -24,7 +24,6 @@ import org.jetbrains.kotlin.gradle.plugin.sources.DefaultKotlinSourceSet import org.jetbrains.kotlin.gradle.tasks.dependsOn import org.jetbrains.kotlin.gradle.tasks.locateOrRegisterTask import org.jetbrains.kotlin.gradle.tasks.withType -import org.jetbrains.kotlin.gradle.utils.filesProvider import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName import org.jetbrains.kotlin.gradle.utils.notCompatibleWithConfigurationCacheCompat import org.jetbrains.kotlin.gradle.utils.outputFilesProvider @@ -180,14 +179,16 @@ internal open class CInteropMetadataDependencyTransformationTask @Inject constru @Suppress("unused") @get:Classpath - protected val inputArtifactFiles: FileCollection = project.filesProvider { - sourceSet.dependencyTransformations.values.map { it.configurationToResolve.withoutProjectDependencies() } - } + protected val inputArtifactFiles: FileCollection get() = sourceSet + .compileDependenciesTransformation + .configurationToResolve + .withoutProjectDependencies() @get:Internal protected val chooseVisibleSourceSets - get() = sourceSet.dependencyTransformations.values - .flatMap { it.metadataDependencyResolutions } + get() = sourceSet + .compileDependenciesTransformation + .metadataDependencyResolutions .filterIsInstance() @Suppress("unused")