From 4e0485c52388a000b8a3bf9d999c4432610b1fca Mon Sep 17 00:00:00 2001 From: Sergey Igushkin Date: Wed, 10 Feb 2021 22:46:35 +0300 Subject: [PATCH] Expose compiled metadata for project deps, set capabilities on elements --- .../plugin/mpp/pm20/DependencyResolution.kt | 20 +++++---------- .../gradle/plugin/mpp/pm20/GradlePlugin.kt | 25 +++---------------- .../plugin/mpp/pm20/KotlinGradleModule.kt | 5 +++- .../mpp/pm20/abstractVariantFactories.kt | 9 +++++-- .../mpp/pm20/fragmentsMetadataCompilation.kt | 19 +++++++++++--- .../KotlinMetadataTargetConfigurator.kt | 3 ++- 6 files changed, 37 insertions(+), 44 deletions(-) diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/DependencyResolution.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/DependencyResolution.kt index 8f77b483460..bd310f3a392 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/DependencyResolution.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/DependencyResolution.kt @@ -206,19 +206,8 @@ class VariantDependencyDiscovery( private fun ModuleComponentIdentifier.toModuleIdentifier(classifier: String? = null): MavenModuleIdentifier = MavenModuleIdentifier(moduleIdentifier.group, moduleIdentifier.name, classifier) -internal fun ComponentIdentifier.matchesModule(module: KotlinModule): Boolean { - return when (val moduleId = module.moduleIdentifier) { - is LocalModuleIdentifier -> { - val projectId = this as? ProjectComponentIdentifier - projectId?.build?.name == moduleId.buildId && projectId.projectPath == moduleId.projectId - } - is MavenModuleIdentifier -> { - val componentId = this as? ModuleComponentIdentifier - componentId?.toModuleIdentifier() == moduleId - } - else -> false - } -} +internal fun ComponentIdentifier.matchesModule(module: KotlinModule): Boolean = + matchesModuleIdentifier(module.moduleIdentifier) internal fun ResolvedComponentResult.toModuleIdentifier(): KotlinModuleIdentifier { val capabilities = variants.flatMap { it.capabilities } // expected to be disjoint @@ -251,7 +240,10 @@ internal fun ComponentSelector.toModuleDependency(): KotlinModuleDependency { } internal fun ComponentIdentifier.matchesModuleDependency(moduleDependency: KotlinModuleDependency) = - when (val id = moduleDependency.moduleIdentifier) { + matchesModuleIdentifier(moduleDependency.moduleIdentifier) + +internal fun ComponentIdentifier.matchesModuleIdentifier(id: KotlinModuleIdentifier): Boolean = + when (id) { is LocalModuleIdentifier -> { val projectId = this as? ProjectComponentIdentifier projectId?.build?.name == id.buildId && projectId.projectPath == id.projectId diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/GradlePlugin.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/GradlePlugin.kt index 49a29069b88..009ccc5b9d8 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/GradlePlugin.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/GradlePlugin.kt @@ -6,34 +6,14 @@ package org.jetbrains.kotlin.gradle.plugin.mpp.pm20 import org.gradle.api.* -import org.gradle.api.attributes.Usage import org.gradle.api.plugins.JavaBasePlugin import org.gradle.api.publish.maven.MavenPublication -import org.gradle.api.tasks.TaskProvider -import org.gradle.jvm.tasks.Jar import org.gradle.util.GradleVersion -import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformCommonOptions import org.jetbrains.kotlin.gradle.dsl.KotlinTopLevelExtension import org.jetbrains.kotlin.gradle.dsl.pm20Extension import org.jetbrains.kotlin.gradle.internal.customizeKotlinDependencies -import org.jetbrains.kotlin.gradle.plugin.KotlinCommonSourceSetProcessor -import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType -import org.jetbrains.kotlin.gradle.plugin.getKotlinPluginVersion -import org.jetbrains.kotlin.gradle.plugin.mpp.* -import org.jetbrains.kotlin.gradle.plugin.mpp.MULTIPLATFORM_PROJECT_METADATA_JSON_FILE_NAME -import org.jetbrains.kotlin.gradle.plugin.mpp.addSourcesToKotlinCompileTask -import org.jetbrains.kotlin.gradle.plugin.mpp.buildKotlinProjectStructureMetadata -import org.jetbrains.kotlin.gradle.plugin.usageByName -import org.jetbrains.kotlin.gradle.targets.metadata.createGenerateProjectStructureMetadataTask -import org.jetbrains.kotlin.gradle.tasks.KotlinTasksProvider -import org.jetbrains.kotlin.gradle.tasks.registerTask -import org.jetbrains.kotlin.gradle.tasks.withType -import org.jetbrains.kotlin.gradle.utils.addExtendsFromRelation import org.jetbrains.kotlin.gradle.utils.checkGradleCompatibility -import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName -import org.jetbrains.kotlin.project.model.KotlinModuleFragment import org.jetbrains.kotlin.project.model.KotlinModuleIdentifier -import java.util.concurrent.Callable abstract class KotlinPm20GradlePlugin : Plugin { override fun apply(project: Project) { @@ -62,12 +42,13 @@ abstract class KotlinPm20GradlePlugin : Plugin { modules.create(KotlinGradleModule.TEST_MODULE_NAME) main { makePublic() } } - setupMetadataCompilationAndDependencyResolution(project) + setupFragmentsMetadata(project) } - private fun setupMetadataCompilationAndDependencyResolution(project: Project) { + private fun setupFragmentsMetadata(project: Project) { project.pm20Extension.modules.all { module -> configureMetadataResolutionAndBuild(module) + module.ifMadePublic { configureMetadataExposure(module) } } } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinGradleModule.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinGradleModule.kt index 59fd7a0e4c2..ae9eca4ba6e 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinGradleModule.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinGradleModule.kt @@ -96,5 +96,8 @@ internal val KotlinGradleModule.resolvableMetadataConfigurationName: String internal val KotlinGradleModule.isMain get() = moduleIdentifier.moduleClassifier == null -fun KotlinGradleModule.variantsContainingFragment(fragment: KotlinModuleFragment): Iterable = +internal fun KotlinGradleModule.disambiguateName(simpleName: String) = + lowerCamelCaseName(moduleClassifier, simpleName) + +internal fun KotlinGradleModule.variantsContainingFragment(fragment: KotlinModuleFragment): Iterable = variants.filter { fragment in it.refinesClosure } \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/abstractVariantFactories.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/abstractVariantFactories.kt index 1644234d29d..3dfdc08dc4c 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/abstractVariantFactories.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/abstractVariantFactories.kt @@ -9,6 +9,7 @@ import org.gradle.api.artifacts.Configuration import org.gradle.api.attributes.Usage import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinUsages +import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.LazyCapability import org.jetbrains.kotlin.gradle.plugin.mpp.sourcesJarTask import org.jetbrains.kotlin.gradle.utils.addExtendsFromRelation import org.jetbrains.kotlin.project.model.refinesClosure @@ -68,7 +69,7 @@ abstract class AbstractKotlinGradleVariantFactory( isCanBeConsumed = false module.ifMadePublic { isCanBeConsumed = true - // FIXME set capability + setModuleCapability(this, fragment.containingModule) } attributes.attribute(Usage.USAGE_ATTRIBUTE, KotlinUsages.producerApiUsage(project, fragment.platformType)) extendsFrom(project.configurations.getByName(fragment.transitiveApiConfigurationName)) @@ -111,7 +112,7 @@ abstract class AbstractKotlinGradleVariantWithRuntimeDependenciesFactory + // FIXME: native api-implementation + project.addExtendsFromRelation(name, fragment.apiConfigurationName) + } + setModuleCapability(this, module) + } +} + private fun generateAndExportProjectStructureMetadata( module: KotlinGradleModule ) { 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 3410136b2a1..f2350a90b6f 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 @@ -32,6 +32,7 @@ import org.jetbrains.kotlin.gradle.tasks.* import org.jetbrains.kotlin.gradle.utils.addExtendsFromRelation import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName import org.jetbrains.kotlin.statistics.metrics.BooleanMetrics +import java.util.concurrent.Callable internal const val COMMON_MAIN_ELEMENTS_CONFIGURATION_NAME = "commonMainMetadataElements" internal const val ALL_COMPILE_METADATA_CONFIGURATION_NAME = "allSourceSetsCompileDependenciesMetadata" @@ -503,7 +504,7 @@ internal fun createTransformedMetadataClasspath( metadataResolutionProviders: Lazy> ): FileCollection { return project.files( - project.provider { + Callable { val allResolutionsByComponentId: Map> = mutableMapOf>().apply { metadataResolutionProviders.value.forEach {