From 986cf1ae514fa92fe31bda3c83a1f24b21e7c579 Mon Sep 17 00:00:00 2001 From: "sebastian.sellmair" Date: Wed, 19 Jan 2022 11:49:56 +0100 Subject: [PATCH] [KPM] Implement *ConfigurationDefinition and Kotlin*VariantConfig APIs Those new APIs shall make it easier for external Variant authors (Android) to reuse logic from KGP with more clear semantic. --- .../build.gradle.kts | 2 +- .../gradle/kpm/KotlinJvmVariantFactoryTest.kt | 54 +++-- .../kpm/KotlinNativeVariantFactoryTest.kt | 4 +- .../pm20/DefaultKotlinFragmentAttributes.kt | 55 +++++ .../DefaultKotlinFragmentConfigurations.kt | 85 +++++++ .../gradle/plugin/mpp/pm20/GradlePlugin.kt | 2 +- ...nFragmentCompilationOutputsJarArtifact.kt} | 14 +- .../KotlinFragmentConfigurationDefinition.kt | 222 ++++++++++++++++++ ...KotlinFragmentConfigurationInstantiator.kt | 17 -- ...otlinFragmentConfigurationsConfigurator.kt | 119 ---------- ...linFragmentHostSpecificMetadataArtifact.kt | 46 ++++ .../pm20/KotlinFragmentModuleCapability.kt | 21 ++ .../mpp/pm20/KotlinGradleFragmentFactory.kt | 12 + ...ostSpecificMetadataArtifactConfigurator.kt | 47 ---- .../mpp/pm20/KotlinJvmVariantFactory.kt | 128 +++++----- .../mpp/pm20/KotlinNativeVariantFactory.kt | 109 +++++---- .../pm20/configuration/KotlinApiElements.kt | 39 --- .../KotlinCompileDependencies.kt | 34 --- .../KotlinHostSpecificMetadataElements.kt | 40 ---- .../KotlinRuntimeDependencies.kt | 34 --- .../configuration/KotlinRuntimeElements.kt | 44 ---- .../mpp/pm20/fragmentsMetadataCompilation.kt | 1 - .../kotlin/gradle/utils/UnsafeApi.kt | 3 +- 23 files changed, 596 insertions(+), 536 deletions(-) create mode 100644 libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/DefaultKotlinFragmentAttributes.kt create mode 100644 libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/DefaultKotlinFragmentConfigurations.kt rename libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/{KotlinCompilationOutputsJarArtifactConfigurator.kt => KotlinFragmentCompilationOutputsJarArtifact.kt} (50%) create mode 100644 libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinFragmentConfigurationDefinition.kt delete mode 100644 libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinFragmentConfigurationInstantiator.kt delete mode 100644 libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinFragmentConfigurationsConfigurator.kt create mode 100644 libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinFragmentHostSpecificMetadataArtifact.kt create mode 100644 libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinFragmentModuleCapability.kt delete mode 100644 libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinHostSpecificMetadataArtifactConfigurator.kt delete mode 100644 libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/configuration/KotlinApiElements.kt delete mode 100644 libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/configuration/KotlinCompileDependencies.kt delete mode 100644 libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/configuration/KotlinHostSpecificMetadataElements.kt delete mode 100644 libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/configuration/KotlinRuntimeDependencies.kt delete mode 100644 libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/configuration/KotlinRuntimeElements.kt diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kpmTransientPluginOptions/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kpmTransientPluginOptions/build.gradle.kts index 1676423befe..48d77b0aac3 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kpmTransientPluginOptions/build.gradle.kts +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kpmTransientPluginOptions/build.gradle.kts @@ -51,4 +51,4 @@ class GradleKpmPluginWithTransientPluginOptions : GradleKpmCompilerPlugin { transientOptionValue = project.property("test-plugin.transient") as String ) } -} \ No newline at end of file +} diff --git a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/kpm/KotlinJvmVariantFactoryTest.kt b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/kpm/KotlinJvmVariantFactoryTest.kt index eeff68b677d..14a7240f58f 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/kpm/KotlinJvmVariantFactoryTest.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/kpm/KotlinJvmVariantFactoryTest.kt @@ -86,11 +86,12 @@ class KotlinJvmVariantFactoryTest : AbstractKpmExtensionTest() { @Test fun `test custom configure compileDependenciesConfiguration`() { val variant = KotlinJvmVariantFactory( - KotlinJvmVariantInstantiator(kotlin.main), - KotlinJvmVariantConfigurator(compileDependenciesConfigurator = { fragment, configuration -> - assertSame(fragment.compileDependenciesConfiguration, configuration) - configuration.attributes.attribute(testAttribute, "compileDependencies") - }) + kotlin.main, KotlinJvmVariantConfig( + compileDependencies = DefaultKotlinCompileDependenciesDefinition + FragmentAttributes { fragment -> + assertSame(fragment.compileDependenciesConfiguration.attributes, this) + attribute(testAttribute, "compileDependencies") + } + ) ).create("jvm") assertEquals( @@ -101,11 +102,12 @@ class KotlinJvmVariantFactoryTest : AbstractKpmExtensionTest() { @Test fun `test custom configure runtimeDependenciesConfiguration`() { val variant = KotlinJvmVariantFactory( - KotlinJvmVariantInstantiator(kotlin.main), - KotlinJvmVariantConfigurator(runtimeDependenciesConfigurator = { fragment, configuration -> - assertSame(fragment.runtimeDependenciesConfiguration, configuration) - configuration.attributes.attribute(testAttribute, "runtimeDependencies") - }) + kotlin.main, KotlinJvmVariantConfig( + runtimeDependencies = DefaultKotlinRuntimeDependenciesDefinition + FragmentAttributes { fragment -> + assertSame(fragment.runtimeDependenciesConfiguration.attributes, this) + attribute(testAttribute, "runtimeDependencies") + } + ) ).create("jvm") assertEquals( @@ -116,10 +118,12 @@ class KotlinJvmVariantFactoryTest : AbstractKpmExtensionTest() { @Test fun `test custom configure apiElementsConfiguration`() { val variant = KotlinJvmVariantFactory( - KotlinJvmVariantInstantiator(kotlin.main), KotlinJvmVariantConfigurator(apiElementsConfigurator = { fragment, configuration -> - assertSame(fragment.apiElementsConfiguration, configuration) - configuration.attributes.attribute(testAttribute, "apiElements") - }) + kotlin.main, KotlinJvmVariantConfig( + apiElements = DefaultKotlinApiElementsDefinition + FragmentAttributes { fragment -> + assertSame(fragment.apiElementsConfiguration.attributes, this) + attribute(testAttribute, "apiElements") + } + ) ).create("jvm") assertEquals( @@ -130,11 +134,12 @@ class KotlinJvmVariantFactoryTest : AbstractKpmExtensionTest() { @Test fun `test custom configure runtimeElementsConfiguration`() { val variant = KotlinJvmVariantFactory( - KotlinJvmVariantInstantiator(kotlin.main), - KotlinJvmVariantConfigurator(runtimeElementsConfigurator = { fragment, configuration -> - assertSame(fragment.runtimeElementsConfiguration, configuration) - configuration.attributes.attribute(testAttribute, "runtimeElements") - }) + kotlin.main, KotlinJvmVariantConfig( + runtimeElements = DefaultKotlinRuntimeElementsDefinition + FragmentAttributes { fragment -> + assertSame(fragment.runtimeElementsConfiguration.attributes, this) + attribute(testAttribute, "runtimeElements") + } + ) ).create("jvm") assertEquals( @@ -145,12 +150,13 @@ class KotlinJvmVariantFactoryTest : AbstractKpmExtensionTest() { @Test fun `test custom sourceDirectories configuration`() { val variant = KotlinJvmVariantFactory( - KotlinJvmVariantInstantiator(kotlin.main), - KotlinJvmVariantConfigurator(sourceDirectoriesConfigurator = object : KotlinSourceDirectoriesConfigurator { - override fun configure(fragment: KotlinJvmVariant) { - fragment.kotlinSourceRoots.setSrcDirs(listOf(project.file("src/abc/kotlin"))) + kotlin.main, KotlinJvmVariantConfig( + sourceDirectoriesConfigurator = object : KotlinSourceDirectoriesConfigurator { + override fun configure(fragment: KotlinJvmVariant) { + fragment.kotlinSourceRoots.setSrcDirs(listOf(project.file("src/abc/kotlin"))) + } } - }) + ) ).create("jvm") assertEquals(listOf(project.file("src/abc/kotlin")), variant.kotlinSourceRoots.srcDirs.toList()) diff --git a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/kpm/KotlinNativeVariantFactoryTest.kt b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/kpm/KotlinNativeVariantFactoryTest.kt index 710f971535f..91423c57c1c 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/kpm/KotlinNativeVariantFactoryTest.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/kpm/KotlinNativeVariantFactoryTest.kt @@ -29,9 +29,7 @@ class KotlinNativeVariantFactoryTest( @BeforeTest fun createVariant() { - variant = KotlinNativeVariantFactory( - KotlinNativeVariantInstantiator(kotlin.main, variantConstructor) - ).create("native") + variant = KotlinNativeVariantFactory(kotlin.main, variantConstructor).create("native") } @Test diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/DefaultKotlinFragmentAttributes.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/DefaultKotlinFragmentAttributes.kt new file mode 100644 index 00000000000..be193f7f38d --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/DefaultKotlinFragmentAttributes.kt @@ -0,0 +1,55 @@ +/* + * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +@file:Suppress("FunctionName") + +package org.jetbrains.kotlin.gradle.plugin.mpp.pm20 + +import org.gradle.api.attributes.Usage.USAGE_ATTRIBUTE +import org.gradle.api.attributes.java.TargetJvmEnvironment +import org.gradle.kotlin.dsl.named +import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType +import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget +import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinUsages +import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinUsages.consumerApiUsage +import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinUsages.consumerRuntimeUsage +import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinUsages.producerApiUsage +import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinUsages.producerRuntimeUsage +import org.jetbrains.kotlin.gradle.plugin.usageByName + +val KotlinFragmentPlatformAttributes = FragmentAttributes { fragment -> + // TODO NOW! Maybe we want to provide API for Android target to hook into this? + if (fragment.platformType == KotlinPlatformType.jvm) { + attribute( + TargetJvmEnvironment.TARGET_JVM_ENVIRONMENT_ATTRIBUTE, + fragment.project.objects.named(TargetJvmEnvironment.STANDARD_JVM) + ) + } + attribute(KotlinPlatformType.attribute, fragment.platformType) +} + +val KotlinFragmentConsumerApiUsageAttribute = FragmentAttributes { fragment -> + attribute(USAGE_ATTRIBUTE, consumerApiUsage(fragment.project, fragment.platformType)) +} + +val KotlinFragmentProducerApiUsageAttribute = FragmentAttributes { fragment -> + attribute(USAGE_ATTRIBUTE, producerApiUsage(fragment.project, fragment.platformType)) +} + +val KotlinFragmentConsumerRuntimeUsageAttribute = FragmentAttributes { fragment -> + attribute(USAGE_ATTRIBUTE, consumerRuntimeUsage(fragment.project, fragment.platformType)) +} + +val KotlinFragmentProducerRuntimeUsageAttribute = FragmentAttributes { fragment -> + attribute(USAGE_ATTRIBUTE, producerRuntimeUsage(fragment.project, fragment.platformType)) +} + +val KotlinFragmentMetadataUsageAttribute = FragmentAttributes { fragment -> + attribute(USAGE_ATTRIBUTE, fragment.project.usageByName(KotlinUsages.KOTLIN_METADATA)) +} + +val KotlinFragmentKonanTargetAttribute = FragmentAttributes { fragment -> + attribute(KotlinNativeTarget.konanTargetAttribute, fragment.konanTarget.name) +} diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/DefaultKotlinFragmentConfigurations.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/DefaultKotlinFragmentConfigurations.kt new file mode 100644 index 00000000000..7347067c5e0 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/DefaultKotlinFragmentConfigurations.kt @@ -0,0 +1,85 @@ +/* + * Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.gradle.plugin.mpp.pm20 + +import org.gradle.api.attributes.Bundling +import org.gradle.api.attributes.Category + + +val DefaultKotlinCompileDependenciesDefinition = KotlinGradleFragmentConfigurationDefinition( + provider = { + project.configurations.maybeCreate(disambiguateName("compileDependencies")).apply { + isCanBeConsumed = false + isCanBeResolved = true + } + }, + relations = { configuration -> + configuration.extendsFrom(dependencies.transitiveApiConfiguration) + configuration.extendsFrom(dependencies.transitiveImplementationConfiguration) + }, + attributes = KotlinFragmentPlatformAttributes + KotlinFragmentConsumerApiUsageAttribute +) + +val DefaultKotlinRuntimeDependenciesDefinition = ConfigurationDefinition( + provider = { + project.configurations.maybeCreate(disambiguateName("runtimeDependencies")).apply { + isCanBeConsumed = false + isCanBeResolved = true + } + }, + attributes = KotlinFragmentPlatformAttributes + KotlinFragmentConsumerRuntimeUsageAttribute, + relations = { configuration -> + configuration.extendsFrom(dependencies.transitiveApiConfiguration) + configuration.extendsFrom(dependencies.transitiveImplementationConfiguration) + } +) + +val DefaultKotlinApiElementsDefinition = ConfigurationDefinition( + provider = { + module.project.configurations.maybeCreate(disambiguateName("apiElements")).apply { + isCanBeResolved = false + isCanBeConsumed = false + module.ifMadePublic { isCanBeConsumed = true } + } + }, + relations = { configuration -> configuration.extendsFrom(dependencies.transitiveApiConfiguration) }, + capabilities = KotlinFragmentModuleCapability, + attributes = KotlinFragmentPlatformAttributes + KotlinFragmentProducerApiUsageAttribute + { fragment -> + attribute(Category.CATEGORY_ATTRIBUTE, fragment.project.objects.named(Category::class.java, Category.LIBRARY)) + attribute(Bundling.BUNDLING_ATTRIBUTE, fragment.project.objects.named(Bundling::class.java, Bundling.EXTERNAL)) + }, +) + +val DefaultKotlinRuntimeElementsDefinition = ConfigurationDefinition( + provider = { + module.project.configurations.maybeCreate(disambiguateName("runtimeElements")).apply { + isCanBeResolved = false + isCanBeConsumed = false + module.ifMadePublic { isCanBeConsumed = true } + } + }, + relations = { configuration -> + configuration.extendsFrom(dependencies.transitiveApiConfiguration) + configuration.extendsFrom(dependencies.transitiveImplementationConfiguration) + }, + attributes = KotlinFragmentPlatformAttributes + KotlinFragmentProducerRuntimeUsageAttribute + { fragment -> + attributes.attribute(Category.CATEGORY_ATTRIBUTE, fragment.project.objects.named(Category::class.java, Category.LIBRARY)) + attributes.attribute(Bundling.BUNDLING_ATTRIBUTE, fragment.project.objects.named(Bundling::class.java, Bundling.EXTERNAL)) + }, + capabilities = KotlinFragmentModuleCapability.onlyIfMadePublic() +) + +val DefaultKotlinHostSpecificMetadataElementsDefinition = ConfigurationDefinition( + provider = { + project.configurations.maybeCreate(disambiguateName("hostSpecificMetadataElements")).apply { + isCanBeResolved = false + isCanBeConsumed = false + } + }, + attributes = KotlinFragmentPlatformAttributes + KotlinFragmentKonanTargetAttribute + KotlinFragmentMetadataUsageAttribute, + artifacts = KotlinFragmentHostSpecificMetadataArtifact +) + 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 e9fe2de1e6d..f83c22162ff 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 @@ -47,7 +47,7 @@ abstract class KotlinPm20GradlePlugin @Inject constructor( fun registerNativeVariantFactory( constructor: KotlinNativeVariantConstructor ) = module.fragments.registerFactory( - constructor.variantClass, KotlinNativeVariantFactory(KotlinNativeVariantInstantiator(module, constructor)) + constructor.variantClass, KotlinNativeVariantFactory(module, constructor) ) listOf( diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinCompilationOutputsJarArtifactConfigurator.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinFragmentCompilationOutputsJarArtifact.kt similarity index 50% rename from libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinCompilationOutputsJarArtifactConfigurator.kt rename to libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinFragmentCompilationOutputsJarArtifact.kt index 4a430dceba1..3ac96709862 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinCompilationOutputsJarArtifactConfigurator.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinFragmentCompilationOutputsJarArtifact.kt @@ -5,7 +5,6 @@ package org.jetbrains.kotlin.gradle.plugin.mpp.pm20 -import org.gradle.api.artifacts.Configuration import org.gradle.jvm.tasks.Jar import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.disambiguateName import org.jetbrains.kotlin.gradle.tasks.locateOrRegisterTask @@ -14,12 +13,9 @@ import org.jetbrains.kotlin.gradle.utils.dashSeparatedName /** * Registers a [Jar] task with the variant's compilation outputs and attaches this artifact to the given configuration. */ -object KotlinCompilationOutputsJarArtifactConfigurator : KotlinFragmentConfigurationsConfigurator { - override fun configure(fragment: KotlinGradleVariant, configuration: Configuration) { - val jarTask = fragment.project.locateOrRegisterTask(fragment.disambiguateName("jar")) { - it.from(fragment.compilationOutputs.allOutputs) - it.archiveClassifier.set(dashSeparatedName(fragment.name, fragment.containingModule.moduleClassifier)) - } - fragment.project.artifacts.add(configuration.name, jarTask) - } +val KotlinFragmentCompilationOutputsJarArtifact = FragmentArtifacts { fragment -> + artifact(fragment.project.locateOrRegisterTask(fragment.disambiguateName("jar")) { + it.from(fragment.compilationOutputs.allOutputs) + it.archiveClassifier.set(dashSeparatedName(fragment.name, fragment.containingModule.moduleClassifier)) + }) } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinFragmentConfigurationDefinition.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinFragmentConfigurationDefinition.kt new file mode 100644 index 00000000000..627e92ee962 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinFragmentConfigurationDefinition.kt @@ -0,0 +1,222 @@ +/* + * Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.gradle.plugin.mpp.pm20 + +import org.gradle.api.Project +import org.gradle.api.artifacts.Configuration +import org.gradle.api.artifacts.ConfigurationPublications +import org.gradle.api.attributes.AttributeContainer +import org.gradle.api.capabilities.Capability +import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.KotlinNameDisambiguation + +/* Internal abbreviation */ +internal typealias ConfigurationDefinition = KotlinGradleFragmentConfigurationDefinition + +data class KotlinGradleFragmentConfigurationDefinition( + val provider: KotlinGradleFragmentConfigurationProvider, + val attributes: KotlinGradleFragmentConfigurationAttributes = KotlinGradleFragmentConfigurationAttributes.None, + val capabilities: KotlinGradleFragmentConfigurationCapabilities = KotlinGradleFragmentConfigurationCapabilities.None, + val artifacts: KotlinGradleFragmentConfigurationArtifacts = KotlinGradleFragmentConfigurationArtifacts.None, + val relations: KotlinGradleFragmentConfigurationRelation = KotlinGradleFragmentConfigurationRelation.None, +) + +/* Internal abbreviation */ +internal typealias ConfigurationContext = KotlinGradleFragmentConfigurationContext + +interface KotlinGradleFragmentConfigurationContext : KotlinNameDisambiguation { + val project: Project get() = module.project + val module: KotlinGradleModule + val dependencies: KotlinFragmentDependencyConfigurations +} + +internal class ConfigurationContextImpl( + override val module: KotlinGradleModule, + override val dependencies: KotlinFragmentDependencyConfigurations, + names: KotlinNameDisambiguation +) : KotlinGradleFragmentConfigurationContext, KotlinNameDisambiguation by names + +/* Internal abbreviation */ +internal typealias FragmentConfigurationProvider = KotlinGradleFragmentConfigurationProvider + +fun interface KotlinGradleFragmentConfigurationProvider { + fun KotlinGradleFragmentConfigurationContext.getConfiguration(): Configuration +} + +/* Internal abbreviation */ +internal typealias FragmentRelation = KotlinGradleFragmentConfigurationRelation + +fun interface KotlinGradleFragmentConfigurationRelation { + fun KotlinGradleFragmentConfigurationContext.setupExtendsFromRelations(configuration: Configuration) + + object None : KotlinGradleFragmentConfigurationRelation { + override fun KotlinGradleFragmentConfigurationContext.setupExtendsFromRelations(configuration: Configuration) = Unit + } +} + +/* Internal abbreviation */ +internal typealias FragmentAttributes = KotlinGradleFragmentConfigurationAttributes + +fun interface KotlinGradleFragmentConfigurationAttributes { + fun AttributeContainer.setAttributes(fragment: T) + + object None : KotlinGradleFragmentConfigurationAttributes { + override fun AttributeContainer.setAttributes(fragment: KotlinGradleFragment) = Unit + } +} +/* Internal abbreviation */ +internal typealias FragmentCapabilities = KotlinGradleFragmentConfigurationCapabilities + +fun interface KotlinGradleFragmentConfigurationCapabilities { + interface Context { + fun capability(notation: Any) + val capabilities: List + } + + class ContextImpl internal constructor( + private val configuration: Configuration + ) : Context { + override fun capability(notation: Any) = configuration.outgoing.capability(notation) + override val capabilities: List get() = configuration.outgoing.capabilities.orEmpty().toList() + } + + fun Context.setCapabilities(fragment: T) + + object None : KotlinGradleFragmentConfigurationCapabilities { + override fun Context.setCapabilities(fragment: KotlinGradleFragment) = Unit + } +} + +/* Internal abbreviation */ +internal typealias FragmentArtifacts = KotlinGradleFragmentConfigurationArtifacts + +fun interface KotlinGradleFragmentConfigurationArtifacts { + fun ConfigurationPublications.addArtifacts(fragment: T) + + object None : KotlinGradleFragmentConfigurationArtifacts { + override fun ConfigurationPublications.addArtifacts(fragment: KotlinGradleFragment) = Unit + } +} + +/* +Definition Extensions + */ + +operator fun KotlinGradleFragmentConfigurationDefinition.plus(other: FragmentAttributes): + KotlinGradleFragmentConfigurationDefinition = copy(attributes = attributes + other) + +operator fun KotlinGradleFragmentConfigurationDefinition.plus(other: FragmentArtifacts): + KotlinGradleFragmentConfigurationDefinition = copy(artifacts = artifacts + other) + +/* +Provider Extensions + */ + +fun KotlinGradleFragmentConfigurationDefinition.withConfigurationProvider( + provider: KotlinGradleFragmentConfigurationContext.() -> Configuration +) = copy(provider = provider) + +fun KotlinGradleFragmentConfigurationProvider.getConfiguration(context: KotlinGradleFragmentConfigurationContext): Configuration { + return with(context) { getConfiguration() } +} + +/* +FragmentArtifacts Extensions + */ + +fun ConfigurationPublications.addArtifacts(artifacts: FragmentArtifacts, fragment: T) = with(artifacts) { + addArtifacts(fragment) +} + +operator fun FragmentArtifacts.plus(other: FragmentArtifacts): FragmentArtifacts { + if (this is CompositeFragmentArtifacts && other is CompositeFragmentArtifacts) { + return CompositeFragmentArtifacts(this.children + other.children) + } + + if (this is CompositeFragmentArtifacts) { + return CompositeFragmentArtifacts(this.children + other) + } + + if (other is CompositeFragmentArtifacts) { + return CompositeFragmentArtifacts(listOf(this) + other.children) + } + + return CompositeFragmentArtifacts(listOf(this, other)) +} + +internal class CompositeFragmentArtifacts(val children: List>) : + FragmentArtifacts { + override fun ConfigurationPublications.addArtifacts(fragment: T) { + children.forEach { child -> addArtifacts(child, fragment) } + } +} + +/* +FragmentAttributes Extensions + */ + +fun AttributeContainer.attribute(attributes: FragmentAttributes, fragment: T) = with(attributes) { + setAttributes(fragment) +} + +operator fun FragmentAttributes.plus(other: FragmentAttributes): FragmentAttributes { + if (this is CompositeFragmentAttributes && other is CompositeFragmentAttributes) { + return CompositeFragmentAttributes(this.children + other.children) + } + + if (this is CompositeFragmentAttributes) { + return CompositeFragmentAttributes(this.children + other) + } + + if (other is CompositeFragmentAttributes) { + return CompositeFragmentAttributes(listOf(this) + other.children) + } + + return CompositeFragmentAttributes(listOf(this, other)) +} + +internal class CompositeFragmentAttributes(val children: List>) : + FragmentAttributes { + override fun AttributeContainer.setAttributes(fragment: T) { + children.forEach { attribute -> attribute(attribute, fragment) } + } +} + +/* +FragmentCapabilities Extensions + */ + +fun KotlinGradleFragmentConfigurationCapabilities.onlyIfMadePublic(): KotlinGradleFragmentConfigurationCapabilities { + return KotlinGradleFragmentConfigurationCapabilities { fragment -> + fragment.containingModule.ifMadePublic { setCapabilities(this@onlyIfMadePublic, fragment) } + } +} + +fun KotlinGradleFragmentConfigurationCapabilities.Context.setCapabilities( + capabilities: KotlinGradleFragmentConfigurationCapabilities, fragment: T +) = with(capabilities) { setCapabilities(fragment) } + +operator fun FragmentCapabilities.plus(other: FragmentCapabilities): FragmentCapabilities { + if (this is CompositeFragmentCapabilities && other is CompositeFragmentCapabilities) { + return CompositeFragmentCapabilities(this.children + other.children) + } + + if (this is CompositeFragmentCapabilities) { + return CompositeFragmentCapabilities(this.children + other) + } + + if (other is CompositeFragmentCapabilities) { + return CompositeFragmentCapabilities(listOf(this) + other.children) + } + + return CompositeFragmentCapabilities(listOf(this, other)) +} + +internal class CompositeFragmentCapabilities(val children: List>) : + FragmentCapabilities { + override fun KotlinGradleFragmentConfigurationCapabilities.Context.setCapabilities(fragment: T) { + children.forEach { capability -> setCapabilities(capability, fragment) } + } +} diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinFragmentConfigurationInstantiator.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinFragmentConfigurationInstantiator.kt deleted file mode 100644 index 3de3fbc750f..00000000000 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinFragmentConfigurationInstantiator.kt +++ /dev/null @@ -1,17 +0,0 @@ -/* - * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. - * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. - */ - -package org.jetbrains.kotlin.gradle.plugin.mpp.pm20 - -import org.gradle.api.artifacts.Configuration -import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.KotlinNameDisambiguation - -interface KotlinFragmentConfigurationInstantiator { - fun create( - module: KotlinGradleModule, - names: KotlinNameDisambiguation, - dependencies: KotlinFragmentDependencyConfigurations - ): Configuration -} diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinFragmentConfigurationsConfigurator.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinFragmentConfigurationsConfigurator.kt deleted file mode 100644 index 6121cde546e..00000000000 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinFragmentConfigurationsConfigurator.kt +++ /dev/null @@ -1,119 +0,0 @@ -/* - * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. - * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. - */ - -@file:Suppress("FunctionName") - -package org.jetbrains.kotlin.gradle.plugin.mpp.pm20 - -import org.gradle.api.artifacts.Configuration -import org.gradle.api.attributes.Usage.USAGE_ATTRIBUTE -import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType -import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget -import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinUsages -import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinUsages.consumerApiUsage -import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinUsages.consumerRuntimeUsage -import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinUsages.producerApiUsage -import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinUsages.producerRuntimeUsage -import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.ComputedCapability -import org.jetbrains.kotlin.gradle.plugin.usageByName - -/** - * Special 'Configurator' for Gradle configurations. - * Such 'Configurator' depend on the concrete [KotlinGradleFragment] instance in order to run - * This 'Configurator's can be composed using the [KotlinConfigurationsConfigurator] or [plus] function. - */ -fun interface KotlinFragmentConfigurationsConfigurator { - fun configure(fragment: T, configuration: Configuration) -} - -fun KotlinConfigurationsConfigurator( - vararg configurators: KotlinFragmentConfigurationsConfigurator -): KotlinFragmentConfigurationsConfigurator { - return CompositeKotlinFragmentConfigurationsConfigurator(configurators.toList()) -} - -//region Simple default implementations - -object KotlinFragmentPlatformAttributesConfigurator : KotlinFragmentConfigurationsConfigurator { - override fun configure(fragment: KotlinGradleVariant, configuration: Configuration) { - configuration.attributes.attribute(KotlinPlatformType.attribute, fragment.platformType) - } -} - -object KotlinFragmentConsumerApiUsageAttributesConfigurator : KotlinFragmentConfigurationsConfigurator { - override fun configure(fragment: KotlinGradleVariant, configuration: Configuration) { - configuration.attributes.attribute(USAGE_ATTRIBUTE, consumerApiUsage(fragment.project, fragment.platformType)) - } -} - -object KotlinFragmentProducerApiUsageAttributesConfigurator : KotlinFragmentConfigurationsConfigurator { - override fun configure(fragment: KotlinGradleVariant, configuration: Configuration) { - configuration.attributes.attribute(USAGE_ATTRIBUTE, producerApiUsage(fragment.project, fragment.platformType)) - } -} - -object KotlinFragmentConsumerRuntimeUsageAttributesConfigurator : KotlinFragmentConfigurationsConfigurator { - override fun configure(fragment: KotlinGradleVariant, configuration: Configuration) { - configuration.attributes.attribute(USAGE_ATTRIBUTE, consumerRuntimeUsage(fragment.project, fragment.platformType)) - } -} - -object KotlinFragmentProducerRuntimeUsageAttributesConfigurator : KotlinFragmentConfigurationsConfigurator { - override fun configure(fragment: KotlinGradleVariant, configuration: Configuration) { - configuration.attributes.attribute(USAGE_ATTRIBUTE, producerRuntimeUsage(fragment.project, fragment.platformType)) - } -} - -object KotlinFragmentMetadataUsageAttributeConfigurator : KotlinFragmentConfigurationsConfigurator { - override fun configure(fragment: KotlinGradleVariant, configuration: Configuration) { - configuration.attributes.attribute(USAGE_ATTRIBUTE, fragment.project.usageByName(KotlinUsages.KOTLIN_METADATA)) - } -} - -object KonanTargetAttributesConfigurator : KotlinFragmentConfigurationsConfigurator { - override fun configure(fragment: KotlinNativeVariantInternal, configuration: Configuration) { - configuration.attributes.attribute(KotlinNativeTarget.konanTargetAttribute, fragment.konanTarget.name) - } -} - -object KotlinFragmentModuleCapabilityConfigurator : KotlinFragmentConfigurationsConfigurator { - override fun configure(fragment: KotlinGradleVariant, configuration: Configuration) { - setModuleCapability(configuration, fragment.containingModule) - } - - internal fun setModuleCapability(configuration: Configuration, module: KotlinGradleModule) { - if (module.moduleClassifier != null) { - configuration.outgoing.capability(ComputedCapability.fromModule(module)) - } - } -} - -//endregion - -operator fun KotlinFragmentConfigurationsConfigurator.plus( - other: KotlinFragmentConfigurationsConfigurator -): KotlinFragmentConfigurationsConfigurator { - if (this is CompositeKotlinFragmentConfigurationsConfigurator && other is CompositeKotlinFragmentConfigurationsConfigurator) { - return CompositeKotlinFragmentConfigurationsConfigurator(this.setups + other.setups) - } - - if (this is CompositeKotlinFragmentConfigurationsConfigurator) { - return CompositeKotlinFragmentConfigurationsConfigurator(this.setups + other) - } - - if (other is CompositeKotlinFragmentConfigurationsConfigurator) { - return CompositeKotlinFragmentConfigurationsConfigurator(listOf(this) + other.setups) - } - - return CompositeKotlinFragmentConfigurationsConfigurator(listOf(this, other)) -} - -private class CompositeKotlinFragmentConfigurationsConfigurator( - val setups: List> -) : KotlinFragmentConfigurationsConfigurator { - override fun configure(fragment: T, configuration: Configuration) { - setups.forEach { setup -> setup.configure(fragment, configuration) } - } -} diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinFragmentHostSpecificMetadataArtifact.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinFragmentHostSpecificMetadataArtifact.kt new file mode 100644 index 00000000000..4452e1243ad --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinFragmentHostSpecificMetadataArtifact.kt @@ -0,0 +1,46 @@ +/* + * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.gradle.plugin.mpp.pm20 + +import org.gradle.api.artifacts.Dependency +import org.gradle.jvm.tasks.Jar +import org.jetbrains.kotlin.gradle.dsl.pm20Extension +import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.disambiguateName +import org.jetbrains.kotlin.gradle.targets.metadata.filesWithUnpackedArchives +import org.jetbrains.kotlin.gradle.tasks.registerTask +import org.jetbrains.kotlin.library.KLIB_FILE_EXTENSION +import org.jetbrains.kotlin.project.model.refinesClosure + +/** + * Will register a 'hostSpecificMetadataJar' [Jar] task containing compilation outputs of host specific metadata. + * Will add this jar artifact to the given configuration + */ + +val KotlinFragmentHostSpecificMetadataArtifact = FragmentArtifacts artifacts@{ fragment -> + val project = fragment.project + val hostSpecificMetadataElements = fragment.hostSpecificMetadataElementsConfiguration ?: return@artifacts + + val hostSpecificMetadataJar = project.registerTask(fragment.disambiguateName("hostSpecificMetadataJar")) { jar -> + jar.archiveClassifier.set("metadata") + jar.archiveAppendix.set(fragment.disambiguateName("")) + project.pm20Extension.metadataCompilationRegistryByModuleId.getValue(fragment.containingModule.moduleIdentifier) + .withAll { metadataCompilation -> + val metadataFragment = metadataCompilation.fragment + if (metadataCompilation is KotlinNativeFragmentMetadataCompilationData) { + jar.from(project.files(project.provider { + if (metadataFragment in fragment.refinesClosure && metadataFragment.isNativeHostSpecific()) + project.filesWithUnpackedArchives(metadataCompilation.output.allOutputs, setOf(KLIB_FILE_EXTENSION)) + else emptyList() + })) { spec -> spec.into(metadataFragment.name) } + } + } + } + + artifact(hostSpecificMetadataJar) + hostSpecificMetadataElements.dependencies.addAllLater(project.objects.listProperty(Dependency::class.java).apply { + set(project.provider { fragment.apiElementsConfiguration.allDependencies }) + }) +} diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinFragmentModuleCapability.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinFragmentModuleCapability.kt new file mode 100644 index 00000000000..c658d3960b4 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinFragmentModuleCapability.kt @@ -0,0 +1,21 @@ +/* + * Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.gradle.plugin.mpp.pm20 + +import org.gradle.api.artifacts.Configuration +import org.gradle.api.capabilities.Capability +import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.ComputedCapability + +val KotlinFragmentModuleCapability = FragmentCapabilities { fragment -> + capability(fragment.containingModule.moduleCapability ?: return@FragmentCapabilities) +} + +internal fun setModuleCapability(configuration: Configuration, module: KotlinGradleModule) { + configuration.outgoing.capability(module.moduleCapability ?: return) +} + +internal val KotlinGradleModule.moduleCapability: Capability? + get() = if (moduleClassifier != null) ComputedCapability.fromModule(this) else null diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinGradleFragmentFactory.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinGradleFragmentFactory.kt index e6ec3012365..e179f771c0f 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinGradleFragmentFactory.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinGradleFragmentFactory.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.gradle.plugin.mpp.pm20 import org.gradle.api.NamedDomainObjectFactory +import org.gradle.api.artifacts.Configuration import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KotlinGradleFragmentFactory.FragmentConfigurator import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KotlinGradleFragmentFactory.FragmentInstantiator @@ -48,3 +49,14 @@ class KotlinGradleFragmentFactory( return fragmentInstantiator.create(name).apply(fragmentConfigurator::configure) } } + +internal fun Configuration.configure( + definition: KotlinGradleFragmentConfigurationDefinition, + fragment: T +) { + attributes.attribute(definition.attributes, fragment) + outgoing.addArtifacts(definition.artifacts, fragment) + + KotlinGradleFragmentConfigurationCapabilities.ContextImpl(this) + .setCapabilities(definition.capabilities, fragment) +} diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinHostSpecificMetadataArtifactConfigurator.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinHostSpecificMetadataArtifactConfigurator.kt deleted file mode 100644 index cd0ffcc0063..00000000000 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinHostSpecificMetadataArtifactConfigurator.kt +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. - * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. - */ - -package org.jetbrains.kotlin.gradle.plugin.mpp.pm20 - -import org.gradle.api.artifacts.Dependency -import org.gradle.jvm.tasks.Jar -import org.jetbrains.kotlin.gradle.dsl.pm20Extension -import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.disambiguateName -import org.jetbrains.kotlin.gradle.targets.metadata.filesWithUnpackedArchives -import org.jetbrains.kotlin.gradle.tasks.registerTask -import org.jetbrains.kotlin.library.KLIB_FILE_EXTENSION -import org.jetbrains.kotlin.project.model.refinesClosure - -/** - * Will register a 'hostSpecificMetadataJar' [Jar] task containing compilation outputs of host specific metadata. - * Will add this jar artifact to the given configuration - */ -object KotlinHostSpecificMetadataArtifactConfigurator : KotlinGradleFragmentFactory.FragmentConfigurator { - override fun configure(fragment: KotlinNativeVariantInternal) { - val project = fragment.project - val hostSpecificMetadataElements = fragment.hostSpecificMetadataElementsConfiguration ?: return - - val hostSpecificMetadataJar = project.registerTask(fragment.disambiguateName("hostSpecificMetadataJar")) { jar -> - jar.archiveClassifier.set("metadata") - jar.archiveAppendix.set(fragment.disambiguateName("")) - project.pm20Extension.metadataCompilationRegistryByModuleId.getValue(fragment.containingModule.moduleIdentifier) - .withAll { metadataCompilation -> - val metadataFragment = metadataCompilation.fragment - if (metadataCompilation is KotlinNativeFragmentMetadataCompilationData) { - jar.from(project.files(project.provider { - if (metadataFragment in fragment.refinesClosure && metadataFragment.isNativeHostSpecific()) - project.filesWithUnpackedArchives(metadataCompilation.output.allOutputs, setOf(KLIB_FILE_EXTENSION)) - else emptyList() - })) { spec -> spec.into(metadataFragment.name) } - } - } - } - - project.artifacts.add(hostSpecificMetadataElements.name, hostSpecificMetadataJar) - hostSpecificMetadataElements.dependencies.addAllLater(project.objects.listProperty(Dependency::class.java).apply { - set(project.provider { fragment.apiElementsConfiguration.allDependencies }) - }) - } -} diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinJvmVariantFactory.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinJvmVariantFactory.kt index ba71184e180..e24d2ea5303 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinJvmVariantFactory.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinJvmVariantFactory.kt @@ -7,92 +7,88 @@ package org.jetbrains.kotlin.gradle.plugin.mpp.pm20 -import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.configuration.* import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.FragmentNameDisambiguation typealias KotlinJvmVariantFactory = KotlinGradleFragmentFactory -fun KotlinJvmVariantFactory(module: KotlinGradleModule): KotlinJvmVariantFactory = - KotlinJvmVariantFactory(KotlinJvmVariantInstantiator(module)) - fun KotlinJvmVariantFactory( - jvmVariantInstantiator: KotlinJvmVariantInstantiator, - jvmVariantConfigurator: KotlinJvmVariantConfigurator = KotlinJvmVariantConfigurator() -): KotlinJvmVariantFactory = KotlinGradleFragmentFactory( - fragmentInstantiator = jvmVariantInstantiator, - fragmentConfigurator = jvmVariantConfigurator + module: KotlinGradleModule, config: KotlinJvmVariantConfig = KotlinJvmVariantConfig() +): KotlinJvmVariantFactory = KotlinJvmVariantFactory( + KotlinJvmVariantInstantiator(module, config), + KotlinJvmVariantConfigurator(config) ) -class KotlinJvmVariantInstantiator( +data class KotlinJvmVariantConfig( + val dependenciesConfigurationFactory: KotlinFragmentDependencyConfigurationsFactory + = DefaultKotlinFragmentDependencyConfigurationsFactory, + + val compileDependencies: KotlinGradleFragmentConfigurationDefinition + = DefaultKotlinCompileDependenciesDefinition, + + val runtimeDependencies: KotlinGradleFragmentConfigurationDefinition + = DefaultKotlinRuntimeDependenciesDefinition, + + val apiElements: KotlinGradleFragmentConfigurationDefinition + = DefaultKotlinApiElementsDefinition + KotlinFragmentCompilationOutputsJarArtifact, + + val runtimeElements: KotlinGradleFragmentConfigurationDefinition + = DefaultKotlinRuntimeElementsDefinition, + + val compileTaskConfigurator: KotlinCompileTaskConfigurator + = KotlinJvmCompileTaskConfigurator, + + val sourceArchiveTaskConfigurator: KotlinSourceArchiveTaskConfigurator + = DefaultKotlinSourceArchiveTaskConfigurator, + + val sourceDirectoriesConfigurator: KotlinSourceDirectoriesConfigurator + = DefaultKotlinSourceDirectoriesConfigurator, + + val publicationConfigurator: KotlinPublicationConfigurator + = KotlinPublicationConfigurator.SingleVariantPublication +) + +class KotlinJvmVariantInstantiator internal constructor( private val module: KotlinGradleModule, - - private val dependenciesConfigurationFactory: KotlinFragmentDependencyConfigurationsFactory = - DefaultKotlinFragmentDependencyConfigurationsFactory, - - private val compileDependenciesConfigurationInstantiator: KotlinCompileDependenciesConfigurationInstantiator = - DefaultKotlinCompileDependenciesConfigurationInstantiator, - - private val apiElementsConfigurationInstantiator: KotlinApiElementsConfigurationInstantiator = - DefaultKotlinApiElementsConfigurationInstantiator, - - private val runtimeDependenciesConfigurationInstantiator: KotlinRuntimeDependenciesConfigurationInstantiator = - DefaultKotlinRuntimeDependenciesConfigurationInstantiator, - - private val runtimeElementsConfigurationInstantiator: KotlinRuntimeElementsConfigurationFactory = - DefaultKotlinRuntimeElementsConfigurationInstantiator, - - ) : KotlinGradleFragmentFactory.FragmentInstantiator { + private val config: KotlinJvmVariantConfig +) : KotlinGradleFragmentFactory.FragmentInstantiator { override fun create(name: String): KotlinJvmVariant { val names = FragmentNameDisambiguation(module, name) - val dependencies = dependenciesConfigurationFactory.create(module, names) + val context = ConfigurationContextImpl(module, config.dependenciesConfigurationFactory.create(module, names), names) + return KotlinJvmVariant( containingModule = module, fragmentName = name, - dependencyConfigurations = dependencies, - compileDependenciesConfiguration = compileDependenciesConfigurationInstantiator.create(module, names, dependencies), - apiElementsConfiguration = apiElementsConfigurationInstantiator.create(module, names, dependencies), - runtimeDependenciesConfiguration = runtimeDependenciesConfigurationInstantiator.create(module, names, dependencies), - runtimeElementsConfiguration = runtimeElementsConfigurationInstantiator.create(module, names, dependencies) + dependencyConfigurations = context.dependencies, + compileDependenciesConfiguration = config.compileDependencies.provider.getConfiguration(context).also { configuration -> + config.compileDependencies.relations.run { context.setupExtendsFromRelations(configuration) } + }, + runtimeDependenciesConfiguration = config.runtimeDependencies.provider.getConfiguration(context).also { configuration -> + config.runtimeDependencies.relations.run { context.setupExtendsFromRelations(configuration) } + }, + apiElementsConfiguration = config.apiElements.provider.getConfiguration(context).also { configuration -> + config.apiElements.relations.run { context.setupExtendsFromRelations(configuration) } + }, + runtimeElementsConfiguration = config.runtimeElements.provider.getConfiguration(context).also { configuration -> + config.runtimeElements.relations.run { context.setupExtendsFromRelations(configuration) } + } ) } } -class KotlinJvmVariantConfigurator( - private val compileTaskConfigurator: KotlinCompileTaskConfigurator = - KotlinJvmCompileTaskConfigurator, - - private val sourceArchiveTaskConfigurator: KotlinSourceArchiveTaskConfigurator = - DefaultKotlinSourceArchiveTaskConfigurator, - - private val sourceDirectoriesConfigurator: KotlinSourceDirectoriesConfigurator = - DefaultKotlinSourceDirectoriesConfigurator, - - private val compileDependenciesConfigurator: KotlinFragmentConfigurationsConfigurator = - DefaultKotlinCompileDependenciesConfigurator, - - private val runtimeDependenciesConfigurator: KotlinFragmentConfigurationsConfigurator = - DefaultKotlinRuntimeDependenciesConfigurator, - - private val apiElementsConfigurator: KotlinFragmentConfigurationsConfigurator = - DefaultKotlinApiElementsConfigurator + KotlinCompilationOutputsJarArtifactConfigurator, - - private val runtimeElementsConfigurator: KotlinFragmentConfigurationsConfigurator = - DefaultKotlinRuntimeElementsConfigurator, - - private val publicationConfigurator: KotlinPublicationConfigurator = - KotlinPublicationConfigurator.SingleVariantPublication - +class KotlinJvmVariantConfigurator internal constructor( + private val config: KotlinJvmVariantConfig ) : KotlinGradleFragmentFactory.FragmentConfigurator { override fun configure(fragment: KotlinJvmVariant) { - compileDependenciesConfigurator.configure(fragment, fragment.compileDependenciesConfiguration) - runtimeDependenciesConfigurator.configure(fragment, fragment.runtimeDependenciesConfiguration) - apiElementsConfigurator.configure(fragment, fragment.apiElementsConfiguration) - runtimeElementsConfigurator.configure(fragment, fragment.runtimeElementsConfiguration) - sourceDirectoriesConfigurator.configure(fragment) - compileTaskConfigurator.registerCompileTasks(fragment) - sourceArchiveTaskConfigurator.registerSourceArchiveTask(fragment) - publicationConfigurator.configure(fragment) + fragment.compileDependenciesConfiguration.configure(config.compileDependencies, fragment) + fragment.runtimeDependenciesConfiguration.configure(config.runtimeDependencies, fragment) + fragment.apiElementsConfiguration.configure(config.apiElements, fragment) + fragment.runtimeElementsConfiguration.configure(config.runtimeElements, fragment) + + config.sourceDirectoriesConfigurator.configure(fragment) + config.compileTaskConfigurator.registerCompileTasks(fragment) + config.sourceArchiveTaskConfigurator.registerSourceArchiveTask(fragment) + config.publicationConfigurator.configure(fragment) } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinNativeVariantFactory.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinNativeVariantFactory.kt index 2af59394805..75462256054 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinNativeVariantFactory.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinNativeVariantFactory.kt @@ -7,88 +7,85 @@ package org.jetbrains.kotlin.gradle.plugin.mpp.pm20 -import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.configuration.* import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.FragmentNameDisambiguation -import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.KotlinNameDisambiguation fun KotlinNativeVariantFactory( - nativeVariantInstantiator: KotlinNativeVariantInstantiator, - nativeVariantConfigurator: KotlinNativeVariantConfigurator = KotlinNativeVariantConfigurator() + module: KotlinGradleModule, + constructor: KotlinNativeVariantConstructor, + config: KotlinNativeVariantConfig = KotlinNativeVariantConfig() ) = KotlinGradleFragmentFactory( - fragmentInstantiator = nativeVariantInstantiator, - fragmentConfigurator = nativeVariantConfigurator + fragmentInstantiator = KotlinNativeVariantInstantiator(module, constructor, config), + fragmentConfigurator = KotlinNativeVariantConfigurator(config) +) + +data class KotlinNativeVariantConfig( + val dependenciesConfigurationFactory: KotlinFragmentDependencyConfigurationsFactory = + DefaultKotlinFragmentDependencyConfigurationsFactory, + + val compileDependencies: ConfigurationDefinition = + DefaultKotlinCompileDependenciesDefinition + KotlinFragmentKonanTargetAttribute, + + val apiElements: ConfigurationDefinition = + DefaultKotlinApiElementsDefinition + KotlinFragmentKonanTargetAttribute, + + val hostSpecificMetadataElements: ConfigurationDefinition = + DefaultKotlinHostSpecificMetadataElementsDefinition, + + val compileTaskConfigurator: KotlinCompileTaskConfigurator = + KotlinNativeCompileTaskConfigurator, + + val sourceArchiveTaskConfigurator: KotlinSourceArchiveTaskConfigurator = + DefaultKotlinSourceArchiveTaskConfigurator, + + val sourceDirectoriesConfigurator: KotlinSourceDirectoriesConfigurator = + DefaultKotlinSourceDirectoriesConfigurator, + + val publicationConfigurator: KotlinPublicationConfigurator = + KotlinPublicationConfigurator.NativeVariantPublication ) class KotlinNativeVariantInstantiator( private val module: KotlinGradleModule, - private val kotlinNativeVariantConstructor: KotlinNativeVariantConstructor, - - private val dependenciesConfigurationFactory: KotlinFragmentDependencyConfigurationsFactory = - DefaultKotlinFragmentDependencyConfigurationsFactory, - - private val compileDependenciesConfigurationInstantiator: KotlinCompileDependenciesConfigurationInstantiator = - DefaultKotlinCompileDependenciesConfigurationInstantiator, - - private val apiElementsConfigurationInstantiator: KotlinApiElementsConfigurationInstantiator = - DefaultKotlinApiElementsConfigurationInstantiator, - - private val hostSpecificMetadataElementsConfigurationInstantiator: KotlinHostSpecificMetadataElementsConfigurationInstantiator? = - DefaultKotlinHostSpecificMetadataElementsConfigurationInstantiator(kotlinNativeVariantConstructor.konanTarget) + private val config: KotlinNativeVariantConfig ) : KotlinGradleFragmentFactory.FragmentInstantiator { override fun create(name: String): T { val names = FragmentNameDisambiguation(module, name) - val dependencies = dependenciesConfigurationFactory.create(module, names) + val dependencies = config.dependenciesConfigurationFactory.create(module, names) + val context = ConfigurationContextImpl(module, dependencies, names) + return kotlinNativeVariantConstructor.invoke( containingModule = module, fragmentName = name, dependencyConfigurations = dependencies, - compileDependencyConfiguration = compileDependenciesConfigurationInstantiator.create(module, names, dependencies), - apiElementsConfiguration = apiElementsConfigurationInstantiator.create(module, names, dependencies), + compileDependencyConfiguration = config.compileDependencies.provider.getConfiguration(context).also { configuration -> + config.compileDependencies.relations.run { context.setupExtendsFromRelations(configuration) } + }, + apiElementsConfiguration = config.apiElements.provider.getConfiguration(context).also { configuration -> + config.apiElements.relations.run { context.setupExtendsFromRelations(configuration) } + }, hostSpecificMetadataElementsConfiguration = - hostSpecificMetadataElementsConfigurationInstantiator?.create(module, names, dependencies) + config.hostSpecificMetadataElements.provider.getConfiguration(context).also { configuration -> + config.hostSpecificMetadataElements.relations.run { context.setupExtendsFromRelations(configuration) } + } ) } } class KotlinNativeVariantConfigurator( - private val compileTaskConfigurator: KotlinCompileTaskConfigurator = - KotlinNativeCompileTaskConfigurator, - - private val sourceArchiveTaskConfigurator: KotlinSourceArchiveTaskConfigurator = - DefaultKotlinSourceArchiveTaskConfigurator, - - private val sourceDirectoriesConfigurator: KotlinSourceDirectoriesConfigurator = - DefaultKotlinSourceDirectoriesConfigurator, - - private val compileDependenciesConfigurator: KotlinFragmentConfigurationsConfigurator = - DefaultKotlinCompileDependenciesConfigurator + KonanTargetAttributesConfigurator, - - private val apiElementsConfigurator: KotlinFragmentConfigurationsConfigurator = - DefaultKotlinApiElementsConfigurator + KonanTargetAttributesConfigurator, - - private val hostSpecificMetadataElementsConfigurator: KotlinFragmentConfigurationsConfigurator = - DefaultHostSpecificMetadataElementsConfigurator, - - private val hostSpecificMetadataArtifactConfigurator: KotlinGradleFragmentFactory.FragmentConfigurator = - KotlinHostSpecificMetadataArtifactConfigurator, - - private val publicationConfigurator: KotlinPublicationConfigurator = - KotlinPublicationConfigurator.NativeVariantPublication + private val config: KotlinNativeVariantConfig ) : KotlinGradleFragmentFactory.FragmentConfigurator { override fun configure(fragment: T) { - compileDependenciesConfigurator.configure(fragment, fragment.compileDependenciesConfiguration) - apiElementsConfigurator.configure(fragment, fragment.apiElementsConfiguration) - fragment.hostSpecificMetadataElementsConfiguration?.let { configuration -> - hostSpecificMetadataElementsConfigurator.configure(fragment, configuration) - } - hostSpecificMetadataArtifactConfigurator.configure(fragment) - sourceDirectoriesConfigurator.configure(fragment) - compileTaskConfigurator.registerCompileTasks(fragment) - sourceArchiveTaskConfigurator.registerSourceArchiveTask(fragment) - publicationConfigurator.configure(fragment) + fragment.compileDependenciesConfiguration.configure(config.compileDependencies, fragment) + fragment.apiElementsConfiguration.configure(config.apiElements, fragment) + fragment.hostSpecificMetadataElementsConfiguration?.configure(config.hostSpecificMetadataElements, fragment) + + config.sourceDirectoriesConfigurator.configure(fragment) + config.compileTaskConfigurator.registerCompileTasks(fragment) + config.sourceArchiveTaskConfigurator.registerSourceArchiveTask(fragment) + config.publicationConfigurator.configure(fragment) } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/configuration/KotlinApiElements.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/configuration/KotlinApiElements.kt deleted file mode 100644 index 80b796a569d..00000000000 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/configuration/KotlinApiElements.kt +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. - * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. - */ - -package org.jetbrains.kotlin.gradle.plugin.mpp.pm20.configuration - -import org.gradle.api.artifacts.Configuration -import org.gradle.api.attributes.Bundling -import org.gradle.api.attributes.Category -import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.* -import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.FragmentNameDisambiguation -import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.KotlinNameDisambiguation - -interface KotlinApiElementsConfigurationInstantiator : KotlinFragmentConfigurationInstantiator - -object DefaultKotlinApiElementsConfigurationInstantiator : KotlinApiElementsConfigurationInstantiator { - override fun create( - module: KotlinGradleModule, - names: KotlinNameDisambiguation, - dependencies: KotlinFragmentDependencyConfigurations - ): Configuration { - return module.project.configurations.maybeCreate(names.disambiguateName("apiElements")).apply { - isCanBeResolved = false - isCanBeConsumed = false - extendsFrom(dependencies.transitiveApiConfiguration) - module.ifMadePublic { isCanBeConsumed = true } - - attributes.attribute(Category.CATEGORY_ATTRIBUTE, module.project.objects.named(Category::class.java, Category.LIBRARY)) - attributes.attribute(Bundling.BUNDLING_ATTRIBUTE, module.project.objects.named(Bundling::class.java, Bundling.EXTERNAL)) - } - } -} - -val DefaultKotlinApiElementsConfigurator = KotlinConfigurationsConfigurator( - KotlinFragmentPlatformAttributesConfigurator, - KotlinFragmentModuleCapabilityConfigurator, - KotlinFragmentProducerApiUsageAttributesConfigurator -) diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/configuration/KotlinCompileDependencies.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/configuration/KotlinCompileDependencies.kt deleted file mode 100644 index 0b5686f55d2..00000000000 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/configuration/KotlinCompileDependencies.kt +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. - * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. - */ - -package org.jetbrains.kotlin.gradle.plugin.mpp.pm20.configuration - -import org.gradle.api.artifacts.Configuration -import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.* -import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.FragmentNameDisambiguation -import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.KotlinNameDisambiguation -import org.jetbrains.kotlin.gradle.utils.addExtendsFromRelation - - -interface KotlinCompileDependenciesConfigurationInstantiator : KotlinFragmentConfigurationInstantiator - -object DefaultKotlinCompileDependenciesConfigurationInstantiator : KotlinCompileDependenciesConfigurationInstantiator { - override fun create( - module: KotlinGradleModule, - names: KotlinNameDisambiguation, - dependencies: KotlinFragmentDependencyConfigurations - ): Configuration { - return module.project.configurations.maybeCreate(names.disambiguateName("compileDependencies")).apply { - isCanBeConsumed = false - isCanBeResolved = true - module.project.addExtendsFromRelation(name, dependencies.transitiveApiConfiguration.name) - module.project.addExtendsFromRelation(name, dependencies.transitiveImplementationConfiguration.name) - } - } -} - -val DefaultKotlinCompileDependenciesConfigurator = KotlinConfigurationsConfigurator( - KotlinFragmentPlatformAttributesConfigurator, KotlinFragmentConsumerApiUsageAttributesConfigurator -) diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/configuration/KotlinHostSpecificMetadataElements.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/configuration/KotlinHostSpecificMetadataElements.kt deleted file mode 100644 index 2fcf540e754..00000000000 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/configuration/KotlinHostSpecificMetadataElements.kt +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. - * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. - */ - -@file:Suppress("FunctionName") - -package org.jetbrains.kotlin.gradle.plugin.mpp.pm20.configuration - -import org.gradle.api.artifacts.Configuration -import org.jetbrains.kotlin.gradle.plugin.mpp.isHostSpecificKonanTargetsSet -import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.* -import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.FragmentNameDisambiguation -import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.KotlinNameDisambiguation -import org.jetbrains.kotlin.konan.target.KonanTarget - -interface KotlinHostSpecificMetadataElementsConfigurationInstantiator : KotlinFragmentConfigurationInstantiator - -fun DefaultKotlinHostSpecificMetadataElementsConfigurationInstantiator( - konanTarget: KonanTarget -): KotlinHostSpecificMetadataElementsConfigurationInstantiator? = if (isHostSpecificKonanTargetsSet(setOf(konanTarget))) - DefaultKotlinHostSpecificMetadataElementsConfigurationInstantiator else null - -private object DefaultKotlinHostSpecificMetadataElementsConfigurationInstantiator : - KotlinHostSpecificMetadataElementsConfigurationInstantiator { - override fun create( - module: KotlinGradleModule, names: KotlinNameDisambiguation, dependencies: KotlinFragmentDependencyConfigurations - ): Configuration { - return module.project.configurations.maybeCreate(names.disambiguateName("hostSpecificMetadataElements")).apply { - isCanBeResolved = false - isCanBeConsumed = false - } - } -} - -val DefaultHostSpecificMetadataElementsConfigurator = KotlinConfigurationsConfigurator( - KotlinFragmentPlatformAttributesConfigurator, - KonanTargetAttributesConfigurator, - KotlinFragmentMetadataUsageAttributeConfigurator -) diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/configuration/KotlinRuntimeDependencies.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/configuration/KotlinRuntimeDependencies.kt deleted file mode 100644 index bb9b00cf7f2..00000000000 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/configuration/KotlinRuntimeDependencies.kt +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. - * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. - */ - -package org.jetbrains.kotlin.gradle.plugin.mpp.pm20.configuration - -import org.gradle.api.artifacts.Configuration -import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.* -import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.FragmentNameDisambiguation -import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.KotlinNameDisambiguation -import org.jetbrains.kotlin.gradle.utils.addExtendsFromRelation - -interface KotlinRuntimeDependenciesConfigurationInstantiator : KotlinFragmentConfigurationInstantiator - -object DefaultKotlinRuntimeDependenciesConfigurationInstantiator : KotlinRuntimeDependenciesConfigurationInstantiator { - override fun create( - module: KotlinGradleModule, - names: KotlinNameDisambiguation, - dependencies: KotlinFragmentDependencyConfigurations - ): Configuration { - return module.project.configurations.maybeCreate(names.disambiguateName("runtimeDependencies")).apply { - isCanBeConsumed = false - isCanBeResolved = true - module.project.addExtendsFromRelation(name, dependencies.transitiveApiConfiguration.name) - module.project.addExtendsFromRelation(name, dependencies.transitiveImplementationConfiguration.name) - } - } -} - -val DefaultKotlinRuntimeDependenciesConfigurator = KotlinConfigurationsConfigurator( - KotlinFragmentPlatformAttributesConfigurator, - KotlinFragmentConsumerRuntimeUsageAttributesConfigurator -) diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/configuration/KotlinRuntimeElements.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/configuration/KotlinRuntimeElements.kt deleted file mode 100644 index 57e87336494..00000000000 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/configuration/KotlinRuntimeElements.kt +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. - * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. - */ - -package org.jetbrains.kotlin.gradle.plugin.mpp.pm20.configuration - -import org.gradle.api.artifacts.Configuration -import org.gradle.api.attributes.Bundling -import org.gradle.api.attributes.Category -import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.* -import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KotlinFragmentModuleCapabilityConfigurator.setModuleCapability -import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.FragmentNameDisambiguation -import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.KotlinNameDisambiguation - -interface KotlinRuntimeElementsConfigurationFactory : KotlinFragmentConfigurationInstantiator - -object DefaultKotlinRuntimeElementsConfigurationInstantiator : KotlinRuntimeElementsConfigurationFactory { - override fun create( - module: KotlinGradleModule, - names: KotlinNameDisambiguation, - dependencies: KotlinFragmentDependencyConfigurations - ): Configuration { - return module.project.configurations.maybeCreate(names.disambiguateName("runtimeElements")).apply { - isCanBeResolved = false - isCanBeConsumed = false - - attributes.attribute(Category.CATEGORY_ATTRIBUTE, module.project.objects.named(Category::class.java, Category.LIBRARY)) - attributes.attribute(Bundling.BUNDLING_ATTRIBUTE, module.project.objects.named(Bundling::class.java, Bundling.EXTERNAL)) - - extendsFrom(dependencies.transitiveApiConfiguration) - extendsFrom(dependencies.transitiveImplementationConfiguration) - module.ifMadePublic { - isCanBeConsumed = true - setModuleCapability(this, module) - } - } - } -} - -val DefaultKotlinRuntimeElementsConfigurator = KotlinConfigurationsConfigurator( - KotlinFragmentPlatformAttributesConfigurator, - KotlinFragmentProducerRuntimeUsageAttributesConfigurator -) diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/fragmentsMetadataCompilation.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/fragmentsMetadataCompilation.kt index 3093be87e20..20029fe8f0e 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/fragmentsMetadataCompilation.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/fragmentsMetadataCompilation.kt @@ -14,7 +14,6 @@ import org.jetbrains.kotlin.gradle.dsl.pm20Extension import org.jetbrains.kotlin.gradle.plugin.* import org.jetbrains.kotlin.gradle.plugin.KotlinCommonSourceSetProcessor import org.jetbrains.kotlin.gradle.plugin.mpp.* -import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KotlinFragmentModuleCapabilityConfigurator.setModuleCapability import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.ComputedCapability import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.disambiguateName import org.jetbrains.kotlin.gradle.targets.metadata.createGenerateProjectStructureMetadataTask diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/utils/UnsafeApi.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/utils/UnsafeApi.kt index 0ac1598f7b9..c72b4064fd0 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/utils/UnsafeApi.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/utils/UnsafeApi.kt @@ -6,4 +6,5 @@ package org.jetbrains.kotlin.gradle.utils @RequiresOptIn("Unsafe API. Please use safe counterpart", level = RequiresOptIn.Level.ERROR) -internal annotation class UnsafeApi +@Retention(AnnotationRetention.BINARY) +internal annotation class UnsafeApi(val message: String = "")