From 3a02090ff3cab1a16e7565eb000e1fd57a5b7667 Mon Sep 17 00:00:00 2001 From: Anton Lakotka Date: Thu, 19 Jan 2023 17:57:54 +0100 Subject: [PATCH] [Gradle] Collect project structure metadata for current build separately ^KT-49933 --- .../mpp/KotlinProjectStructureMetadata.kt | 2 +- ...rojectStructureMetadataExtractorFactory.kt | 33 ++++++++++++------- 2 files changed, 22 insertions(+), 13 deletions(-) diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinProjectStructureMetadata.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinProjectStructureMetadata.kt index d4f9bd9d046..091ac3409ac 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinProjectStructureMetadata.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinProjectStructureMetadata.kt @@ -420,7 +420,7 @@ internal object GlobalProjectStructureMetadataStorage { ) } - fun getAllProjectStructureMetadata(project: Project): Map> { + fun getProjectStructureMetadataProvidersFromAllGradleBuilds(project: Project): Map> { return project.compositeBuildRoot.extensions.extraProperties.properties .filterKeys { it.startsWith(propertyPrefix) } .entries diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/MppDependencyProjectStructureMetadataExtractorFactory.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/MppDependencyProjectStructureMetadataExtractorFactory.kt index 25bbc660ce1..839b2eb45fb 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/MppDependencyProjectStructureMetadataExtractorFactory.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/MppDependencyProjectStructureMetadataExtractorFactory.kt @@ -8,7 +8,6 @@ package org.jetbrains.kotlin.gradle.plugin.mpp import org.gradle.api.Project import org.gradle.api.artifacts.component.ProjectComponentIdentifier import org.gradle.api.artifacts.result.ResolvedArtifactResult -import org.gradle.api.provider.Provider import org.jetbrains.kotlin.gradle.dsl.multiplatformExtensionOrNull import org.jetbrains.kotlin.gradle.plugin.extraProperties import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.toSingleKpmModuleIdentifier @@ -24,7 +23,8 @@ internal data class ProjectPathWithBuildName( internal class MppDependencyProjectStructureMetadataExtractorFactory private constructor( - private val allProjectStructureMetadataProviders: Lazy>> + private val includedBuildsProjectStructureMetadataProviders: Lazy>>, + private val currentBuildProjectStructureMetadataProviders: Map> ) { fun create( metadataArtifact: ResolvedArtifactResult @@ -32,17 +32,20 @@ private constructor( val moduleId = metadataArtifact.variant.owner return if (moduleId is ProjectComponentIdentifier) { - val key = ProjectPathWithBuildName(moduleId.projectPath, moduleId.build.name) - val projectStructureMetadataProvider = allProjectStructureMetadataProviders.value[key] - ?: error("Project structure metadata not found for project $key") - if (moduleId.build.isCurrentBuild) { + val projectStructureMetadataProvider = currentBuildProjectStructureMetadataProviders[moduleId.projectPath] + ?: error("Project structure metadata not found for project '${moduleId.projectPath}'") + ProjectMppDependencyProjectStructureMetadataExtractor( moduleIdentifier = metadataArtifact.variant.toSingleKpmModuleIdentifier(), projectPath = moduleId.projectPath, projectStructureMetadataProvider = projectStructureMetadataProvider::value ) } else { + val key = ProjectPathWithBuildName(moduleId.projectPath, moduleId.build.name) + val projectStructureMetadataProvider = includedBuildsProjectStructureMetadataProviders.value[key] + ?: error("Project structure metadata not found for project $key") + IncludedBuildMppDependencyProjectStructureMetadataExtractor( componentId = moduleId, primaryArtifact = metadataArtifact.file, @@ -58,12 +61,18 @@ private constructor( private val extensionName = MppDependencyProjectStructureMetadataExtractorFactory::class.java.simpleName fun getOrCreate(project: Project): MppDependencyProjectStructureMetadataExtractorFactory = project.extraProperties.getOrPut(extensionName) { - val allProjectStructureMetadataProviders = lazy { - GlobalProjectStructureMetadataStorage - .getAllProjectStructureMetadata(project) - } - - MppDependencyProjectStructureMetadataExtractorFactory(allProjectStructureMetadataProviders) + MppDependencyProjectStructureMetadataExtractorFactory( + lazy { GlobalProjectStructureMetadataStorage.getProjectStructureMetadataProvidersFromAllGradleBuilds(project) }, + collectAllProjectStructureMetadataInCurrentBuild(project) + ) } + + private fun collectAllProjectStructureMetadataInCurrentBuild(project: Project): Map> { + return project + .rootProject + .allprojects + .associateBy { it.path } + .mapValues { (_, subProject) -> lazy { subProject.multiplatformExtensionOrNull?.kotlinProjectStructureMetadata } } + } } }