From db6c6c736a4727580aa3ca41ad0721d5c75197c5 Mon Sep 17 00:00:00 2001 From: Anton Lakotka Date: Mon, 30 Jan 2023 19:45:41 +0100 Subject: [PATCH] [Gradle] Cache data that collected from all projects in rootProject --- .../plugin/mpp/GranularMetadataTransformation.kt | 7 ++++++- ...dencyProjectStructureMetadataExtractorFactory.kt | 3 ++- .../plugin/mpp/SourceSetVisibilityProvider.kt | 13 ++++++++++--- 3 files changed, 18 insertions(+), 5 deletions(-) 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 38116f227f2..0974aa8291d 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 @@ -18,9 +18,11 @@ import org.jetbrains.kotlin.gradle.dsl.multiplatformExtension import org.jetbrains.kotlin.gradle.dsl.multiplatformExtensionOrNull import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet +import org.jetbrains.kotlin.gradle.plugin.extraProperties import org.jetbrains.kotlin.gradle.plugin.mpp.MetadataDependencyResolution.ChooseVisibleSourceSets.MetadataProvider.ArtifactMetadataProvider import org.jetbrains.kotlin.gradle.plugin.sources.internal import org.jetbrains.kotlin.gradle.utils.LazyResolvedConfiguration +import org.jetbrains.kotlin.gradle.utils.getOrPut import java.util.* internal sealed class MetadataDependencyResolution( @@ -109,7 +111,7 @@ internal class GranularMetadataTransformation( resolvedMetadataConfiguration = LazyResolvedConfiguration(kotlinSourceSet.internal.resolvableMetadataConfiguration), sourceSetVisibilityProvider = SourceSetVisibilityProvider(project), projectStructureMetadataExtractorFactory = project.kotlinMppDependencyProjectStructureMetadataExtractorFactory, - projectData = project.collectAllProjectsData(), + projectData = project.allProjectsData, platformCompilationSourceSets = project.multiplatformExtension.platformCompilationSourceSets ) } @@ -325,6 +327,9 @@ internal val ResolvedComponentResult.currentBuildProjectIdOrNull } } +private val Project.allProjectsData: Map get() = extraProperties + .getOrPut("all${GranularMetadataTransformation.ProjectData::class.java.simpleName}") { collectAllProjectsData() } + private fun Project.collectAllProjectsData(): Map { return rootProject.allprojects.associateBy { it.path }.mapValues { (path, subProject) -> GranularMetadataTransformation.ProjectData( 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 0ed2a1ae261..707a4219811 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 @@ -10,6 +10,7 @@ import org.gradle.api.artifacts.component.ProjectComponentIdentifier import org.gradle.api.artifacts.result.ResolvedArtifactResult import org.jetbrains.kotlin.gradle.plugin.extraProperties import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.toSingleKpmModuleIdentifier +import org.jetbrains.kotlin.gradle.utils.compositeBuildRootProject import org.jetbrains.kotlin.gradle.utils.getOrPut internal val Project.kotlinMppDependencyProjectStructureMetadataExtractorFactory: MppDependencyProjectStructureMetadataExtractorFactory @@ -56,7 +57,7 @@ private constructor( companion object { private val extensionName = MppDependencyProjectStructureMetadataExtractorFactory::class.java.simpleName fun getOrCreate(project: Project): MppDependencyProjectStructureMetadataExtractorFactory = - project.extraProperties.getOrPut(extensionName) { + project.compositeBuildRootProject.extraProperties.getOrPut(extensionName) { MppDependencyProjectStructureMetadataExtractorFactory( lazy { GlobalProjectStructureMetadataStorage.getProjectStructureMetadataProvidersFromAllGradleBuilds(project) }, collectAllProjectStructureMetadataInCurrentBuild(project) 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 df0138d1eb5..6f79fb05e80 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 @@ -10,8 +10,11 @@ import org.gradle.api.artifacts.result.ResolvedDependencyResult import org.jetbrains.kotlin.gradle.dsl.multiplatformExtensionOrNull import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType +import org.jetbrains.kotlin.gradle.plugin.extraProperties +import org.jetbrains.kotlin.gradle.plugin.mpp.SourceSetVisibilityProvider.PlatformCompilationData import org.jetbrains.kotlin.gradle.utils.LazyResolvedConfiguration import org.jetbrains.kotlin.gradle.utils.dependencyArtifactsOrNull +import org.jetbrains.kotlin.gradle.utils.getOrPut import java.io.File private typealias KotlinSourceSetName = String @@ -29,7 +32,11 @@ internal data class SourceSetVisibilityResult( val hostSpecificMetadataArtifactBySourceSet: Map ) -private fun Project.collectAllPlatformCompilationData(): List { +private val Project.allPlatformCompilationData: List + get() = extraProperties + .getOrPut("all${PlatformCompilationData::class.java.simpleName}") { collectAllPlatformCompilationData() } + +private fun Project.collectAllPlatformCompilationData(): List { val multiplatformExtension = multiplatformExtensionOrNull ?: return emptyList() return multiplatformExtension .targets @@ -37,7 +44,7 @@ private fun Project.collectAllPlatformCompilationData(): List target.compilations.map { it.toPlatformCompilationData() } } } -private fun KotlinCompilation<*>.toPlatformCompilationData() = SourceSetVisibilityProvider.PlatformCompilationData( +private fun KotlinCompilation<*>.toPlatformCompilationData() = PlatformCompilationData( allSourceSets = allKotlinSourceSets.map { it.name }.toSet(), resolvedDependenciesConfiguration = LazyResolvedConfiguration(internal.configurations.compileDependencyConfiguration), hostSpecificMetadataConfiguration = internal @@ -50,7 +57,7 @@ internal class SourceSetVisibilityProvider( private val platformCompilations: List, ) { constructor(project: Project) : this( - platformCompilations = project.collectAllPlatformCompilationData() + platformCompilations = project.allPlatformCompilationData ) class PlatformCompilationData(