Rewrite the checks for the presence of KPM: adapt them to mapped models

This commit is contained in:
Sergey Igushkin
2021-11-15 13:12:44 +04:00
committed by Space
parent d495c5b604
commit 0acf923d6a
7 changed files with 41 additions and 39 deletions
@@ -124,7 +124,7 @@ class GradleProjectModuleBuilder(private val addInferredSourceSetVisibilityAsExp
private fun getModulesFromPm20Project(project: Project) = project.kpmModules.toList()
fun buildModulesFromProject(project: Project): List<KotlinModule> {
if (project.topLevelExtension is KotlinPm20ProjectExtension)
if (project.hasKpmModel)
return getModulesFromPm20Project(project)
val extension = project.multiplatformExtensionOrNull
@@ -313,8 +313,11 @@ class GradleModuleVariantResolver : ModuleVariantResolver {
}
private fun getCompileDependenciesConfigurationForVariant(project: Project, requestingVariant: KotlinModuleVariant): Configuration =
when (project.topLevelExtension) {
is KotlinMultiplatformExtension, is KotlinSingleTargetExtension -> {
when {
project.hasKpmModel -> {
(requestingVariant as KotlinGradleVariant).compileDependenciesConfiguration
}
else -> {
val targets =
project.multiplatformExtensionOrNull?.targets ?: listOf((project.kotlinExtension as KotlinSingleTargetExtension).target)
@@ -333,10 +336,6 @@ class GradleModuleVariantResolver : ModuleVariantResolver {
project.configurations.getByName(compilation.compileDependencyConfigurationName)
}
is KotlinPm20ProjectExtension -> {
(requestingVariant as KotlinGradleVariant).compileDependenciesConfiguration
}
else -> error("could not find the compile dependencies configuration for variant $requestingVariant")
}
companion object {
@@ -14,9 +14,8 @@ import org.gradle.api.tasks.Input
import org.gradle.api.tasks.Internal
import org.gradle.api.tasks.Nested
import org.jetbrains.kotlin.gradle.dsl.multiplatformExtensionOrNull
import org.jetbrains.kotlin.gradle.dsl.topLevelExtensionOrNull
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KotlinGradleModule
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KotlinPm20ProjectExtension
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.hasKpmModel
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.refinesClosure
import org.jetbrains.kotlin.gradle.plugin.sources.KotlinDependencyScope
import org.jetbrains.kotlin.gradle.plugin.sources.sourceSetDependencyConfigurationByScope
@@ -141,8 +140,7 @@ data class KotlinProjectStructureMetadata(
}
internal fun buildKotlinProjectStructureMetadata(project: Project): KotlinProjectStructureMetadata? {
val topLevelExtensionOrNull = project.topLevelExtensionOrNull
require(topLevelExtensionOrNull !is KotlinPm20ProjectExtension) { "this function only works with the stable plugin" }
require(!project.hasKpmModel) { "this function only works with the stable plugin" }
val sourceSetsWithMetadataCompilations =
project.multiplatformExtensionOrNull?.targets?.getByName(KotlinMultiplatformPlugin.METADATA_TARGET_NAME)?.compilations?.associate {
@@ -77,20 +77,20 @@ internal object ModuleIds {
check(moduleIdentifier.buildId == thisProject.currentBuildId().name)
val dependencyProject = thisProject.project(moduleIdentifier.projectId)
val topLevelExtension = dependencyProject.topLevelExtension
val getRootPublication: () -> MavenPublication? = when (topLevelExtension) {
is KotlinMultiplatformExtension -> {
{ topLevelExtension.rootSoftwareComponent.publicationDelegate }
val getRootPublication: () -> MavenPublication? = when {
dependencyProject.hasKpmModel -> {
{ dependencyProject.kpmModelContainer.rootPublication }
}
is KotlinPm20ProjectExtension -> {
{ topLevelExtension.rootPublication }
topLevelExtension is KotlinMultiplatformExtension -> {
{ topLevelExtension.rootSoftwareComponent.publicationDelegate }
}
else -> error("unexpected top-level extension $topLevelExtension")
}
val capabilities = when (topLevelExtension) {
is KotlinMultiplatformExtension -> emptyList()
is KotlinPm20ProjectExtension -> listOfNotNull(ComputedCapability.capabilityStringFromModule(
topLevelExtension.modules.single { it.moduleIdentifier == moduleIdentifier }
val capabilities = when {
dependencyProject.hasKpmModel -> listOfNotNull(ComputedCapability.capabilityStringFromModule(
dependencyProject.kpmModules.single { it.moduleIdentifier == moduleIdentifier }
))
topLevelExtension is KotlinMultiplatformExtension -> emptyList()
else -> error("unexpected top-level extension $topLevelExtension")
}
val coordinatesProvider = MavenPublicationCoordinatesProvider(
@@ -10,6 +10,8 @@ import org.gradle.api.artifacts.component.ProjectComponentIdentifier
import org.gradle.api.artifacts.result.ResolvedComponentResult
import org.jetbrains.kotlin.gradle.dsl.topLevelExtensionOrNull
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KotlinPm20ProjectExtension
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.hasKpmModel
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.kpmModules
import org.jetbrains.kotlin.project.model.KotlinModuleIdentifier
import java.io.File
import java.io.InputStream
@@ -28,11 +30,11 @@ internal class ProjectMppDependencyProjectStructureMetadataExtractor(
) : MppDependencyProjectStructureMetadataExtractor() {
override fun getProjectStructureMetadata(): KotlinProjectStructureMetadata? {
return when (val topLevelExtension = dependencyProject.topLevelExtensionOrNull) {
is KotlinPm20ProjectExtension -> buildProjectStructureMetadata(
topLevelExtension.modules.single { it.moduleIdentifier == moduleIdentifier }
return when {
dependencyProject.topLevelExtensionOrNull == null -> null
dependencyProject.hasKpmModel -> buildProjectStructureMetadata(
dependencyProject.kpmModules.single { it.moduleIdentifier == moduleIdentifier }
)
null -> null
else -> buildKotlinProjectStructureMetadata(dependencyProject)
}
}
@@ -9,8 +9,11 @@ import org.gradle.api.Project
import org.gradle.api.file.FileCollection
import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension
import org.jetbrains.kotlin.gradle.dsl.topLevelExtension
import org.jetbrains.kotlin.gradle.dsl.topLevelExtensionOrNull
import org.jetbrains.kotlin.gradle.plugin.mpp.MetadataDependencyResolution.ChooseVisibleSourceSets.MetadataProvider.ProjectMetadataProvider
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KotlinPm20ProjectExtension
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.hasKpmModel
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.kpmModules
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.metadataCompilationRegistryByModuleId
import org.jetbrains.kotlin.gradle.targets.native.internal.*
import org.jetbrains.kotlin.project.model.KotlinModuleIdentifier
@@ -26,17 +29,18 @@ private class ProjectMetadataProviderImpl(
private val moduleIdentifier: KotlinModuleIdentifier
) : ProjectMetadataProvider() {
override fun getSourceSetCompiledMetadata(sourceSetName: String): FileCollection {
return when (val projectExtension = dependencyProject.topLevelExtension) {
is KotlinMultiplatformExtension -> projectExtension.targets.getByName(KotlinMultiplatformPlugin.METADATA_TARGET_NAME).compilations
.firstOrNull { it.name == sourceSetName }
?.output?.classesDirs ?: dependencyProject.files()
is KotlinPm20ProjectExtension -> {
val projectExtension = dependencyProject.topLevelExtensionOrNull
return when {
dependencyProject.hasKpmModel -> {
val moduleId = moduleIdentifier
val module = projectExtension.modules.single { it.moduleIdentifier == moduleId }
val metadataCompilationRegistry = projectExtension.metadataCompilationRegistryByModuleId.getValue(moduleId)
val module = dependencyProject.kpmModules.single { it.moduleIdentifier == moduleId }
val metadataCompilationRegistry = dependencyProject.metadataCompilationRegistryByModuleId.getValue(moduleId)
metadataCompilationRegistry.byFragment(module.fragments.getByName(sourceSetName)).output.classesDirs
}
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")
}
}
@@ -10,7 +10,6 @@ import org.gradle.api.artifacts.Configuration
import org.gradle.api.artifacts.result.ResolvedComponentResult
import org.gradle.api.artifacts.result.ResolvedDependencyResult
import org.jetbrains.kotlin.gradle.dsl.kotlinExtension
import org.jetbrains.kotlin.gradle.dsl.topLevelExtension
import org.jetbrains.kotlin.gradle.plugin.mpp.resolvableMetadataConfiguration
import org.jetbrains.kotlin.gradle.plugin.sources.KotlinDependencyScope
import org.jetbrains.kotlin.project.model.*
@@ -20,8 +19,8 @@ internal fun resolvableMetadataConfiguration(
) = module.project.configurations.getByName(module.resolvableMetadataConfigurationName)
internal fun configurationToResolveMetadataDependencies(project: Project, requestingModule: KotlinModule): Configuration =
when (project.topLevelExtension) {
is KotlinPm20ProjectExtension -> resolvableMetadataConfiguration(requestingModule as KotlinGradleModule)
when {
project.hasKpmModel -> resolvableMetadataConfiguration(requestingModule as KotlinGradleModule)
else -> resolvableMetadataConfiguration(
project,
project.kotlinExtension.sourceSets, // take dependencies from all source sets; TODO introduce consistency scopes?
@@ -23,7 +23,7 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.*
import org.jetbrains.kotlin.gradle.plugin.mpp.CompilationSourceSetUtil.compilationsBySourceSets
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KotlinGradleModule
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KotlinNativeFragmentMetadataCompilationData
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KotlinPm20ProjectExtension
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.hasKpmModel
import org.jetbrains.kotlin.gradle.plugin.sources.*
import org.jetbrains.kotlin.gradle.plugin.statistics.KotlinBuildStatsService
import org.jetbrains.kotlin.gradle.targets.native.internal.*
@@ -38,14 +38,14 @@ internal const val ALL_COMPILE_METADATA_CONFIGURATION_NAME = "allSourceSetsCompi
internal const val ALL_RUNTIME_METADATA_CONFIGURATION_NAME = "allSourceSetsRuntimeDependenciesMetadata"
internal val Project.isKotlinGranularMetadataEnabled: Boolean
get() = project.topLevelExtension is KotlinPm20ProjectExtension || with(PropertiesProvider(rootProject)) {
get() = project.hasKpmModel || with(PropertiesProvider(rootProject)) {
mppHierarchicalStructureByDefault || // then we want to use KLIB granular compilation & artifacts even if it's just commonMain
hierarchicalStructureSupport ||
enableGranularSourceSetsMetadata == true
}
internal val Project.shouldCompileIntermediateSourceSetsToMetadata: Boolean
get() = project.topLevelExtension is KotlinPm20ProjectExtension || with(PropertiesProvider(rootProject)) {
get() = project.hasKpmModel || with(PropertiesProvider(rootProject)) {
when {
!hierarchicalStructureSupport && mppHierarchicalStructureByDefault -> false
else -> true