From 25dbfb10b82f7d236c418493b5f1054a865444de Mon Sep 17 00:00:00 2001 From: Anton Lakotka Date: Wed, 18 Jan 2023 10:46:40 +0100 Subject: [PATCH] [Gradle] Replace legacy ProjectMetadataProviderImpl with new version New version relies on information about metadata compilation outputs of common source sets. That is known before ProjectMetadataProvider is created. This makes such implementation easier to use with Configuration Cache, since getSourceSetCompiledMetadata doesn't use Project. ^KT-49933 --- .../mpp/GranularMetadataTransformation.kt | 2 +- .../plugin/mpp/ProjectMetadataProviderImpl.kt | 48 ++----------------- ...adleKpmFragmentGranularMetadataResolver.kt | 5 +- 3 files changed, 5 insertions(+), 50 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 3fe6b87e806..0c129f7b43b 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 @@ -284,7 +284,7 @@ internal class GranularMetadataTransformation( val visibleSourceSetsExcludingDependsOn = allVisibleSourceSets.filterTo(mutableSetOf()) { it !in sourceSetsVisibleInParents } val metadataProvider = when (mppDependencyMetadataExtractor) { - is ProjectMppDependencyProjectStructureMetadataExtractor -> PreExtractedProjectMetadataProvider( + is ProjectMppDependencyProjectStructureMetadataExtractor -> ProjectMetadataProvider( sourceSetMetadataOutputs = params.projectData[mppDependencyMetadataExtractor.projectPath]?.sourceSetMetadataOutputs?.get() ?: error("Unexpected project path '${mppDependencyMetadataExtractor.projectPath}'") ) diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/ProjectMetadataProviderImpl.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/ProjectMetadataProviderImpl.kt index a8447fa453f..1bb9f22b400 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/ProjectMetadataProviderImpl.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/ProjectMetadataProviderImpl.kt @@ -10,55 +10,15 @@ import org.gradle.api.file.FileCollection import org.jetbrains.kotlin.gradle.dsl.* import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet import org.jetbrains.kotlin.gradle.plugin.mpp.MetadataDependencyResolution.ChooseVisibleSourceSets.MetadataProvider.ProjectMetadataProvider -import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.metadataCompilationRegistryByModuleId import org.jetbrains.kotlin.gradle.targets.native.internal.* -import org.jetbrains.kotlin.gradle.utils.withType import org.jetbrains.kotlin.project.model.KpmModuleIdentifier private typealias SourceSetName = String internal fun ProjectMetadataProvider( - dependencyProject: Project, - moduleIdentifier: KpmModuleIdentifier + sourceSetMetadataOutputs: Map ): ProjectMetadataProvider { - return ProjectMetadataProviderImpl(dependencyProject, moduleIdentifier) -} - -private class ProjectMetadataProviderImpl( - private val dependencyProject: Project, - private val moduleIdentifier: KpmModuleIdentifier -) : ProjectMetadataProvider() { - override fun getSourceSetCompiledMetadata(sourceSetName: String): FileCollection { - val projectExtension = dependencyProject.topLevelExtensionOrNull - return when { - dependencyProject.pm20ExtensionOrNull != null -> { - val moduleId = moduleIdentifier - val module = dependencyProject.pm20Extension.modules.single { it.moduleIdentifier == moduleId } - val metadataCompilationRegistry = dependencyProject.metadataCompilationRegistryByModuleId.getValue(moduleId) - metadataCompilationRegistry.getForFragmentOrNull(module.fragments.getByName(sourceSetName))?.output?.classesDirs - ?: dependencyProject.files() - } - projectExtension is KotlinMultiplatformExtension -> - projectExtension.targets.getByName(KotlinMultiplatformPlugin.METADATA_TARGET_NAME).compilations - .firstOrNull { it.name == sourceSetName } - ?.output?.classesDirs ?: dependencyProject.files() - else -> error("unexpected top-level Kotlin extension $projectExtension") - } - } - - override fun getSourceSetCInteropMetadata(sourceSetName: String, consumer: MetadataConsumer): FileCollection { - val multiplatformExtension = dependencyProject.topLevelExtension as? KotlinMultiplatformExtension - ?: return dependencyProject.files() - - val commonizeCInteropTask = when (consumer) { - MetadataConsumer.Ide -> dependencyProject.copyCommonizeCInteropForIdeTask ?: return dependencyProject.files() - MetadataConsumer.Cli -> dependencyProject.commonizeCInteropTask ?: return dependencyProject.files() - } - - val sourceSet = multiplatformExtension.sourceSets.findByName(sourceSetName) ?: return dependencyProject.files() - val dependent = CInteropCommonizerDependent.from(sourceSet) ?: return dependencyProject.files() - return commonizeCInteropTask.get().commonizedOutputLibraries(dependent) - } + return ProjectMetadataProviderImpl(sourceSetMetadataOutputs) } internal class SourceSetMetadataOutputs( @@ -71,12 +31,10 @@ internal class SourceSetMetadataOutputs( ) } -internal class PreExtractedProjectMetadataProvider( +private class ProjectMetadataProviderImpl( private val sourceSetMetadataOutputs: Map ): ProjectMetadataProvider() { - constructor(project: Project): this(project.collectSourceSetMetadataOutputs()) - override fun getSourceSetCompiledMetadata(sourceSetName: String): FileCollection = sourceSetMetadataOutputs[sourceSetName]?.metadata ?: error("Unexpected source set '$sourceSetName'") 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 d3ed4637efd..f1a518fa845 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 @@ -103,10 +103,7 @@ internal class GradleKpmFragmentGranularMetadataResolver( val metadataProvider = when (projectStructureMetadataExtractor) { - is ProjectMppDependencyProjectStructureMetadataExtractor -> ProjectMetadataProvider( - dependencyProject = project.project(projectStructureMetadataExtractor.projectPath), - moduleIdentifier = projectStructureMetadataExtractor.moduleIdentifier - ) + is ProjectMppDependencyProjectStructureMetadataExtractor -> TODO("Implement ProjectStructureMetadata for KPM") is JarMppDependencyProjectStructureMetadataExtractor -> ArtifactMetadataProvider( CompositeMetadataArtifactImpl(