[Gradle] Replace provider by lazy in ProjectData

This commit is contained in:
Anton Lakotka
2023-02-08 11:08:24 +01:00
committed by Space Team
parent 0bee621b21
commit 5ec153822a
@@ -12,7 +12,6 @@ import org.gradle.api.artifacts.result.ResolvedDependencyResult
import org.gradle.api.attributes.AttributeContainer import org.gradle.api.attributes.AttributeContainer
import org.gradle.api.file.FileCollection import org.gradle.api.file.FileCollection
import org.gradle.api.logging.Logging import org.gradle.api.logging.Logging
import org.gradle.api.provider.Provider
import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension
import org.jetbrains.kotlin.gradle.dsl.multiplatformExtension import org.jetbrains.kotlin.gradle.dsl.multiplatformExtension
import org.jetbrains.kotlin.gradle.dsl.multiplatformExtensionOrNull import org.jetbrains.kotlin.gradle.dsl.multiplatformExtensionOrNull
@@ -116,13 +115,16 @@ internal class GranularMetadataTransformation(
) )
} }
data class ProjectData( class ProjectData(
val path: String, val path: String,
val sourceSetMetadataOutputs: Provider<Map<String, SourceSetMetadataOutputs>>, sourceSetMetadataOutputsProvider: () -> Map<String, SourceSetMetadataOutputs>,
val projectStructureMetadata: Provider<KotlinProjectStructureMetadata?>, moduleIdProvider: () -> ModuleDependencyIdentifier
val moduleId: Provider<ModuleDependencyIdentifier> ) {
) val sourceSetMetadataOutputs by lazy(sourceSetMetadataOutputsProvider)
val moduleId by lazy(moduleIdProvider)
override fun toString(): String = "ProjectData[path='$path']"
}
val metadataDependencyResolutions: Iterable<MetadataDependencyResolution> by lazy { doTransform() } val metadataDependencyResolutions: Iterable<MetadataDependencyResolution> by lazy { doTransform() }
@@ -268,7 +270,7 @@ internal class GranularMetadataTransformation(
val metadataProvider = when (mppDependencyMetadataExtractor) { val metadataProvider = when (mppDependencyMetadataExtractor) {
is ProjectMppDependencyProjectStructureMetadataExtractor -> ProjectMetadataProvider( is ProjectMppDependencyProjectStructureMetadataExtractor -> ProjectMetadataProvider(
sourceSetMetadataOutputs = params.projectData[mppDependencyMetadataExtractor.projectPath]?.sourceSetMetadataOutputs?.get() sourceSetMetadataOutputs = params.projectData[mppDependencyMetadataExtractor.projectPath]?.sourceSetMetadataOutputs
?: error("Unexpected project path '${mppDependencyMetadataExtractor.projectPath}'") ?: error("Unexpected project path '${mppDependencyMetadataExtractor.projectPath}'")
) )
@@ -302,7 +304,7 @@ internal class GranularMetadataTransformation(
is ModuleComponentIdentifier -> ModuleDependencyIdentifier(componentId.group, componentId.module) is ModuleComponentIdentifier -> ModuleDependencyIdentifier(componentId.group, componentId.module)
is ProjectComponentIdentifier -> { is ProjectComponentIdentifier -> {
if (componentId.build.isCurrentBuild) { if (componentId.build.isCurrentBuild) {
params.projectData[componentId.projectPath]?.moduleId?.get() params.projectData[componentId.projectPath]?.moduleId
?: error("Cant find project Module ID by ${componentId.projectPath}") ?: error("Cant find project Module ID by ${componentId.projectPath}")
} else { } else {
ModuleDependencyIdentifier( ModuleDependencyIdentifier(
@@ -327,16 +329,16 @@ internal val ResolvedComponentResult.currentBuildProjectIdOrNull
} }
} }
private val Project.allProjectsData: Map<String, GranularMetadataTransformation.ProjectData> get() = extraProperties private val Project.allProjectsData: Map<String, GranularMetadataTransformation.ProjectData> get() = rootProject
.extraProperties
.getOrPut("all${GranularMetadataTransformation.ProjectData::class.java.simpleName}") { collectAllProjectsData() } .getOrPut("all${GranularMetadataTransformation.ProjectData::class.java.simpleName}") { collectAllProjectsData() }
private fun Project.collectAllProjectsData(): Map<String, GranularMetadataTransformation.ProjectData> { private fun Project.collectAllProjectsData(): Map<String, GranularMetadataTransformation.ProjectData> {
return rootProject.allprojects.associateBy { it.path }.mapValues { (path, subProject) -> return rootProject.allprojects.associateBy { it.path }.mapValues { (path, subProject) ->
GranularMetadataTransformation.ProjectData( GranularMetadataTransformation.ProjectData(
path = path, path = path,
sourceSetMetadataOutputs = provider { subProject.collectSourceSetMetadataOutputs() }, sourceSetMetadataOutputsProvider = { subProject.collectSourceSetMetadataOutputs() },
projectStructureMetadata = provider { subProject.multiplatformExtensionOrNull?.kotlinProjectStructureMetadata }, moduleIdProvider = { ModuleIds.idOfRootModule(subProject) }
moduleId = provider { ModuleIds.idOfRootModule(subProject) }
) )
} }
} }