From 0acf923d6ae17fb729914f95263ca7afba9b30ff Mon Sep 17 00:00:00 2001 From: Sergey Igushkin Date: Mon, 15 Nov 2021 13:12:44 +0400 Subject: [PATCH] Rewrite the checks for the presence of KPM: adapt them to mapped models --- .../plugin/mpp/GradleProjectModuleBuilder.kt | 13 +++++------ .../mpp/KotlinProjectStructureMetadata.kt | 6 ++--- .../kotlin/gradle/plugin/mpp/ModuleIds.kt | 18 +++++++-------- ...ndencyProjectStructureMetadataExtractor.kt | 10 +++++---- .../plugin/mpp/ProjectMetadataProviderImpl.kt | 22 +++++++++++-------- .../mpp/pm20/DependencyGraphResolver.kt | 5 ++--- .../KotlinMetadataTargetConfigurator.kt | 6 ++--- 7 files changed, 41 insertions(+), 39 deletions(-) diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/GradleProjectModuleBuilder.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/GradleProjectModuleBuilder.kt index ed0785bbae4..7d9b0406c14 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/GradleProjectModuleBuilder.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/GradleProjectModuleBuilder.kt @@ -124,7 +124,7 @@ class GradleProjectModuleBuilder(private val addInferredSourceSetVisibilityAsExp private fun getModulesFromPm20Project(project: Project) = project.kpmModules.toList() fun buildModulesFromProject(project: Project): List { - 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 { diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinProjectStructureMetadata.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinProjectStructureMetadata.kt index 5b9e25ac5c7..f1f74bfc483 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinProjectStructureMetadata.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinProjectStructureMetadata.kt @@ -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 { diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/ModuleIds.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/ModuleIds.kt index 1ddf6c806ca..665aa193230 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/ModuleIds.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/ModuleIds.kt @@ -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( diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/MppDependencyProjectStructureMetadataExtractor.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/MppDependencyProjectStructureMetadataExtractor.kt index 46d324bad33..64994f7cab5 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/MppDependencyProjectStructureMetadataExtractor.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/MppDependencyProjectStructureMetadataExtractor.kt @@ -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) } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/ProjectMetadataProviderImpl.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/ProjectMetadataProviderImpl.kt index 22c529986dc..1f3725aafe2 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/ProjectMetadataProviderImpl.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/ProjectMetadataProviderImpl.kt @@ -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") } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/DependencyGraphResolver.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/DependencyGraphResolver.kt index dddf2b5bd6a..3055044dedb 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/DependencyGraphResolver.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/DependencyGraphResolver.kt @@ -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? diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/metadata/KotlinMetadataTargetConfigurator.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/metadata/KotlinMetadataTargetConfigurator.kt index ae88958f826..cdd8ab1a7ec 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/metadata/KotlinMetadataTargetConfigurator.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/metadata/KotlinMetadataTargetConfigurator.kt @@ -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