[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:
committed by
Space Team
parent
44f2394d94
commit
25dbfb10b8
+1
-1
@@ -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}'")
|
||||
)
|
||||
|
||||
+3
-45
@@ -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'")
|
||||
|
||||
|
||||
+1
-4
@@ -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(
|
||||
|
||||
Reference in New Issue
Block a user