[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
This commit is contained in:
Anton Lakotka
2023-01-18 10:46:40 +01:00
committed by Space Team
parent 44f2394d94
commit 25dbfb10b8
3 changed files with 5 additions and 50 deletions
@@ -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}'")
)
@@ -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<SourceSetName, SourceSetMetadataOutputs>
): 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<SourceSetName, SourceSetMetadataOutputs>
): ProjectMetadataProvider() {
constructor(project: Project): this(project.collectSourceSetMetadataOutputs())
override fun getSourceSetCompiledMetadata(sourceSetName: String): FileCollection =
sourceSetMetadataOutputs[sourceSetName]?.metadata ?: error("Unexpected source set '$sourceSetName'")
@@ -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(