From 069061308298b9e100997f8a7632febfa718c283 Mon Sep 17 00:00:00 2001 From: Anton Lakotka Date: Mon, 12 Dec 2022 09:11:09 +0100 Subject: [PATCH] [Gradle] Don't use whole Project in MetadataDependencyResolution's Instead, derive Project info from Resolved Component. --- ...deJvmAndAndroidSourceDependencyResolver.kt | 5 ++- ...leMultiplatformSourceDependencyResolver.kt | 5 ++- .../mpp/GranularMetadataTransformation.kt | 43 +++++++++---------- .../MetadataDependencyTransformationTask.kt | 5 +-- .../plugin/mpp/SourceSetVisibilityProvider.kt | 4 +- ...adleKpmFragmentGranularMetadataResolver.kt | 6 +-- .../plugin/sources/DefaultKotlinSourceSet.kt | 4 +- .../KotlinMetadataTargetConfigurator.kt | 6 +-- 8 files changed, 38 insertions(+), 40 deletions(-) diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/dependencyResolvers/IdeJvmAndAndroidSourceDependencyResolver.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/dependencyResolvers/IdeJvmAndAndroidSourceDependencyResolver.kt index db6d97824d2..0ba31ed54c6 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/dependencyResolvers/IdeJvmAndAndroidSourceDependencyResolver.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/dependencyResolvers/IdeJvmAndAndroidSourceDependencyResolver.kt @@ -18,10 +18,12 @@ import org.jetbrains.kotlin.gradle.plugin.ide.IdeaKotlinSourceCoordinates import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJvmAndroidCompilation import org.jetbrains.kotlin.gradle.plugin.mpp.MetadataDependencyResolution import org.jetbrains.kotlin.gradle.plugin.mpp.isMain +import org.jetbrains.kotlin.gradle.plugin.mpp.projectDependency import org.jetbrains.kotlin.gradle.plugin.sources.DefaultKotlinSourceSet import org.jetbrains.kotlin.gradle.plugin.sources.android.AndroidVariantType import org.jetbrains.kotlin.gradle.plugin.sources.android.type import org.jetbrains.kotlin.gradle.plugin.sources.internal +import org.jetbrains.kotlin.gradle.plugin.sources.project internal object IdeJvmAndAndroidSourceDependencyResolver : IdeDependencyResolver { override fun resolve(sourceSet: KotlinSourceSet): Set { @@ -29,7 +31,8 @@ internal object IdeJvmAndAndroidSourceDependencyResolver : IdeDependencyResolver if (sourceSet !is DefaultKotlinSourceSet) return emptySet() return sourceSet.resolveMetadata() .flatMap { chooseVisibleSourceSets -> - val projectDependency = chooseVisibleSourceSets.projectDependency ?: return@flatMap emptyList() + val projectDependency = chooseVisibleSourceSets.projectDependency(sourceSet.project) + ?: return@flatMap emptyList() val kotlin = projectDependency.multiplatformExtensionOrNull ?: return@flatMap emptyList() kotlin.sourceSets .filter { sourceSet -> isJvmAndAndroidMain(sourceSet) } diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/dependencyResolvers/IdeVisibleMultiplatformSourceDependencyResolver.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/dependencyResolvers/IdeVisibleMultiplatformSourceDependencyResolver.kt index 8ed0c919c02..51a1b621541 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/dependencyResolvers/IdeVisibleMultiplatformSourceDependencyResolver.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/dependencyResolvers/IdeVisibleMultiplatformSourceDependencyResolver.kt @@ -13,6 +13,7 @@ import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet import org.jetbrains.kotlin.gradle.plugin.ide.IdeDependencyResolver import org.jetbrains.kotlin.gradle.plugin.ide.IdeaKotlinProjectCoordinates import org.jetbrains.kotlin.gradle.plugin.mpp.MetadataDependencyResolution +import org.jetbrains.kotlin.gradle.plugin.mpp.projectIdOrNull import org.jetbrains.kotlin.gradle.plugin.sources.DefaultKotlinSourceSet internal object IdeVisibleMultiplatformSourceDependencyResolver : IdeDependencyResolver { @@ -24,9 +25,9 @@ internal object IdeVisibleMultiplatformSourceDependencyResolver : IdeDependencyR } private fun resolveSourceDependencies( - resolution: MetadataDependencyResolution.ChooseVisibleSourceSets + resolution: MetadataDependencyResolution.ChooseVisibleSourceSets, ): Iterable { - val projectComponentIdentifier = resolution.dependency.id as? ProjectComponentIdentifier ?: return emptyList() + val projectComponentIdentifier = resolution.dependency.projectIdOrNull ?: return emptyList() return resolution.allVisibleSourceSetNames.map { visibleSourceSetName -> IdeaKotlinSourceDependency( type = IdeaKotlinSourceDependency.Type.Regular, diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/GranularMetadataTransformation.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/GranularMetadataTransformation.kt index d9fbcb2e3fa..2e935c46953 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/GranularMetadataTransformation.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/GranularMetadataTransformation.kt @@ -21,10 +21,7 @@ import org.jetbrains.kotlin.gradle.plugin.sources.internal import java.util.* internal sealed class MetadataDependencyResolution( - @field:Transient // can't be used with Gradle Instant Execution, but fortunately not needed when deserialized val dependency: ResolvedComponentResult, - @field:Transient - val projectDependency: Project? ) { /** Evaluate and store the value, as the [dependency] will be lost during Gradle instant execution */ // val originalArtifactFiles: List = dependency.dependents.flatMap { it.allModuleArtifacts } .map { it.file } @@ -39,19 +36,16 @@ internal sealed class MetadataDependencyResolution( } class KeepOriginalDependency( - dependency: ResolvedComponentResult, - projectDependency: Project? - ) : MetadataDependencyResolution(dependency, projectDependency) + dependency: ResolvedComponentResult + ) : MetadataDependencyResolution(dependency) sealed class Exclude( - dependency: ResolvedComponentResult, - projectDependency: Project? - ) : MetadataDependencyResolution(dependency, projectDependency) { + dependency: ResolvedComponentResult + ) : MetadataDependencyResolution(dependency) { class Unrequested( - dependency: ResolvedComponentResult, - projectDependency: Project? - ) : Exclude(dependency, projectDependency) + dependency: ResolvedComponentResult + ) : Exclude(dependency) /** * Resolution for metadata dependencies of leaf platform source sets. @@ -62,18 +56,17 @@ internal sealed class MetadataDependencyResolution( class PublishedPlatformSourceSetDependency( dependency: ResolvedComponentResult, val visibleTransitiveDependencies: Set, - ) : Exclude(dependency, null) + ) : Exclude(dependency) } class ChooseVisibleSourceSets internal constructor( dependency: ResolvedComponentResult, - projectDependency: Project?, val projectStructureMetadata: KotlinProjectStructureMetadata, val allVisibleSourceSetNames: Set, val visibleSourceSetNamesExcludingDependsOn: Set, val visibleTransitiveDependencies: Set, internal val metadataProvider: MetadataProvider - ) : MetadataDependencyResolution(dependency, projectDependency) { + ) : MetadataDependencyResolution(dependency) { internal sealed class MetadataProvider { class ArtifactMetadataProvider(private val compositeMetadataArtifact: CompositeMetadataArtifact) : @@ -181,9 +174,6 @@ internal class GranularMetadataTransformation( result.add( MetadataDependencyResolution.Exclude.Unrequested( resolvedDependency.selected, - (resolvedDependency.selected.id as? ProjectComponentIdentifier) - ?.takeIf { it.build.isCurrentBuild() } - ?.let { project.project(it.projectPath) } ) ) } @@ -219,14 +209,14 @@ internal class GranularMetadataTransformation( val resolvedToProject: Project? = module.toProjectOrNull(project) val projectStructureMetadata = mppDependencyMetadataExtractor?.getProjectStructureMetadata() - ?: return MetadataDependencyResolution.KeepOriginalDependency(module, resolvedToProject) + ?: return MetadataDependencyResolution.KeepOriginalDependency(module) val sourceSetVisibility = SourceSetVisibilityProvider(project).getVisibleSourceSets( kotlinSourceSet, if (projectStructureMetadata.isPublishedAsRoot) module else parent, module, projectStructureMetadata, - resolvedToProject + resolvedToProject != null ) val allVisibleSourceSets = sourceSetVisibility.visibleSourceSetNames @@ -275,7 +265,6 @@ internal class GranularMetadataTransformation( return MetadataDependencyResolution.ChooseVisibleSourceSets( dependency = module, - projectDependency = resolvedToProject, projectStructureMetadata = projectStructureMetadata, allVisibleSourceSetNames = allVisibleSourceSets, visibleSourceSetNamesExcludingDependsOn = visibleSourceSetsExcludingDependsOn, @@ -285,14 +274,22 @@ internal class GranularMetadataTransformation( } } -internal fun ResolvedComponentResult.toProjectOrNull(currentProject: Project): Project? { +internal val ResolvedComponentResult.projectIdOrNull get(): ProjectComponentIdentifier? { val identifier = id return when { - identifier is ProjectComponentIdentifier && identifier.build.isCurrentBuild -> currentProject.project(identifier.projectPath) + identifier is ProjectComponentIdentifier && identifier.build.isCurrentBuild -> identifier else -> null } } +internal fun MetadataDependencyResolution.projectDependency(currentProject: Project): Project? = + dependency.toProjectOrNull(currentProject) + +internal fun ResolvedComponentResult.toProjectOrNull(currentProject: Project): Project? { + val projectId = projectIdOrNull ?: return null + return currentProject.project(projectId.projectPath) +} + private val KotlinMultiplatformExtension.platformCompilationSourceSets: Set get() = targets.filterNot { it is KotlinMetadataTarget } .flatMap { target -> target.compilations } diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/MetadataDependencyTransformationTask.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/MetadataDependencyTransformationTask.kt index 87018d0bb3b..3e0edebdb8e 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/MetadataDependencyTransformationTask.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/MetadataDependencyTransformationTask.kt @@ -48,6 +48,7 @@ open class MetadataDependencyTransformationTask project.kotlinTransformedMetadataLibraryDirectoryForBuild(kotlinSourceSet.name) } + // TODO: Repalce with sourceSet metadata @Suppress("unused") // Gradle input @get:IgnoreEmptyDirectories @get:NormalizeLineEndings @@ -83,9 +84,7 @@ open class MetadataDependencyTransformationTask } } - @get:Internal - @delegate:Transient - internal val transformation: GranularMetadataTransformation by lazy { + private val transformation: GranularMetadataTransformation by lazy { GranularMetadataTransformation( project, kotlinSourceSet, diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/SourceSetVisibilityProvider.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/SourceSetVisibilityProvider.kt index e6b99390443..c7121035c35 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/SourceSetVisibilityProvider.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/SourceSetVisibilityProvider.kt @@ -52,7 +52,7 @@ internal class SourceSetVisibilityProvider( resolvedRootMppDependency: ResolvedComponentResult?, resolvedMetadataDependency: ResolvedComponentResult, dependencyProjectStructureMetadata: KotlinProjectStructureMetadata, - resolvedToOtherProject: Project? + resolvedToOtherProject: Boolean ): SourceSetVisibilityResult { val compilations = visibleFrom.internal.compilations @@ -83,7 +83,7 @@ internal class SourceSetVisibilityProvider( .values.let { if (it.isEmpty()) emptySet() else it.reduce { acc, item -> acc intersect item } } val hostSpecificArtifactBySourceSet: Map = - if (resolvedToOtherProject != null) { + if (resolvedToOtherProject) { /** * When a dependency resolves to a project, we don't need any artifacts from it, we can * instead use the compilation outputs directly: diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/GradleKpmFragmentGranularMetadataResolver.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/GradleKpmFragmentGranularMetadataResolver.kt index d82d512e1a9..ca5018d37e7 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/GradleKpmFragmentGranularMetadataResolver.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/GradleKpmFragmentGranularMetadataResolver.kt @@ -74,10 +74,9 @@ internal class GradleKpmFragmentGranularMetadataResolver( fragmentResolutionQueue.addAll(visibleTransitiveDependencies.filter { it !in visited }) val resolvedComponentResult = dependencyNode.selectedComponent - val isResolvedAsProject = resolvedComponentResult.toProjectOrNull(project) val result = when (dependencyModule) { is GradleKpmExternalPlainModule -> { - MetadataDependencyResolution.KeepOriginalDependency(resolvedComponentResult, isResolvedAsProject) + MetadataDependencyResolution.KeepOriginalDependency(resolvedComponentResult) } else -> run { @@ -124,7 +123,6 @@ internal class GradleKpmFragmentGranularMetadataResolver( MetadataDependencyResolution.ChooseVisibleSourceSets( dependency = metadataSourceComponent, - projectDependency = isResolvedAsProject, projectStructureMetadata = projectStructureMetadata, allVisibleSourceSetNames = visibleFragmentNames, visibleSourceSetNamesExcludingDependsOn = visibleFragmentNamesExcludingVisibleByParents, @@ -140,7 +138,7 @@ internal class GradleKpmFragmentGranularMetadataResolver( // FIXME this code is based on whole components; use module IDs with classifiers instead val resultSourceComponents = results.mapTo(mutableSetOf()) { it.dependency } resolvedComponentsByModuleId.values.minus(resultSourceComponents).forEach { - results.add(MetadataDependencyResolution.Exclude.Unrequested(it, it.toProjectOrNull(project))) + results.add(MetadataDependencyResolution.Exclude.Unrequested(it)) } return results 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 c427f6d4ffc..849d26494ed 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 @@ -46,7 +46,7 @@ abstract class DefaultKotlinSourceSet @Inject constructor( get() = disambiguateName(RUNTIME_ONLY) override val metadataLibrariesConfigurationName: String - get() = disambiguateName(lowerCamelCaseName("compile", METADATA_CONFIGURATION_NAME_SUFFIX)) + get() = disambiguateName(METADATA_CONFIGURATION_NAME_SUFFIX) @Deprecated("KT-55312") override val apiMetadataConfigurationName: String @@ -166,7 +166,7 @@ abstract class DefaultKotlinSourceSet @Inject constructor( return metadataDependencyResolutionByModule.mapNotNull { (groupAndName, resolution) -> val (group, name) = groupAndName - val projectPath = resolution.projectDependency?.path + val projectPath = resolution.dependency.projectIdOrNull?.projectPath when (resolution) { // No metadata transformation leads to original dependency being used during import is MetadataDependencyResolution.KeepOriginalDependency -> null 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 dbaca0d33dc..9217876b281 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 @@ -345,7 +345,7 @@ class KotlinMetadataTargetConfigurator : } compilation.compileDependencyFiles += createMetadataDependencyTransformationClasspath( - project.configurations.getByName(compilation.defaultSourceSet.metadataLibrariesConfigurationName), + project.configurations.getByName(sourceSet.metadataLibrariesConfigurationName), compilation ) @@ -411,7 +411,7 @@ class KotlinMetadataTargetConfigurator : .partition { it is MetadataDependencyResolution.Exclude } unrequested.forEach { - val (group, name) = it.projectDependency?.run { + val (group, name) = it.projectDependency(project)?.run { /** Note: the project dependency notation here should be exactly this, group:name, * not from [ModuleIds.fromProjectPathDependency], as `exclude` checks it against the project's group:name */ ModuleDependencyIdentifier(group.toString(), name) @@ -419,7 +419,7 @@ class KotlinMetadataTargetConfigurator : configuration.exclude(mapOf("group" to group, "module" to name)) } - requested.filter { it.projectDependency == null }.forEach { + requested.filter { it.dependency.projectIdOrNull == null }.forEach { val (group, name) = ModuleIds.fromComponent(project, it.dependency) val notation = listOfNotNull(group.orEmpty(), name, it.dependency.moduleVersion?.version).joinToString(":") configuration.resolutionStrategy.force(notation)