diff --git a/libraries/tools/kotlin-gradle-plugin-kpm-android/src/main/kotlin/org/jetbrains/kotlin/gradle/android/KotlinAndroidVariantFactory.kt b/libraries/tools/kotlin-gradle-plugin-kpm-android/src/main/kotlin/org/jetbrains/kotlin/gradle/android/KotlinAndroidVariantFactory.kt index a43a53f9ab0..7002f7230ae 100644 --- a/libraries/tools/kotlin-gradle-plugin-kpm-android/src/main/kotlin/org/jetbrains/kotlin/gradle/android/KotlinAndroidVariantFactory.kt +++ b/libraries/tools/kotlin-gradle-plugin-kpm-android/src/main/kotlin/org/jetbrains/kotlin/gradle/android/KotlinAndroidVariantFactory.kt @@ -20,7 +20,7 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.external.createExternalJvmVariant import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.* fun KotlinGradleModule.createKotlinAndroidVariant(androidVariant: BaseVariant) { - val androidOutgoingArtifacts = FragmentArtifacts { fragment -> + val androidOutgoingArtifacts = FragmentArtifacts { variants.create("classes") { variant -> variant.attributes.attribute(AndroidArtifacts.ARTIFACT_TYPE, AndroidArtifacts.ArtifactType.CLASSES_JAR.type) variant.artifact(project.provider { fragment.compilationOutputs.classesDirs.singleFile }) { diff --git a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/kpm/KotlinFragmentConfigurationDefinitionTest.kt b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/kpm/KotlinFragmentConfigurationDefinitionTest.kt index 5bc1531af4b..eb9a2feeb5a 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/kpm/KotlinFragmentConfigurationDefinitionTest.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/kpm/KotlinFragmentConfigurationDefinitionTest.kt @@ -26,14 +26,14 @@ class KotlinFragmentConfigurationDefinitionTest : AbstractKpmExtensionTest() { ) } - private val testFragment by lazy { + private val dummyFragment by lazy { KotlinCommonFragmentFactory(kotlin.main).create("testFragment") } @Test fun `test withProvider`() { val testDefinition = ConfigurationDefinition( - provider = { project.configurations.create("a") } + provider = ConfigurationProvider { project.configurations.create("a") } ).withConfigurationProvider { project.configurations.create("b") } assertEquals( @@ -60,14 +60,14 @@ class KotlinFragmentConfigurationDefinitionTest : AbstractKpmExtensionTest() { val testConfiguration = project.configurations.create("dummy") val fragmentAttributes1 = FragmentAttributes { - assertSame(testConfiguration.attributes, this) + assertSame(testConfiguration.attributes, attributes) assertNull(attributes.getAttribute(testAttribute1)) assertNull(attributes.getAttribute(testAttribute2)) attribute(testAttribute1, "value1") } val fragmentAttributes2 = FragmentAttributes { - assertSame(testConfiguration.attributes, this) + assertSame(testConfiguration.attributes, attributes) assertEquals(attributes.getAttribute(testAttribute1), "value1") assertNull(attributes.getAttribute(testAttribute2)) attribute(testAttribute2, "value2") @@ -81,7 +81,7 @@ class KotlinFragmentConfigurationDefinitionTest : AbstractKpmExtensionTest() { listOf(fragmentAttributes1, fragmentAttributes2), composite.children ) - testConfiguration.attributes.attributes(composite, testFragment) + composite.setAttributes(testConfiguration.attributes, dummyFragment) assertEquals( "value1", testConfiguration.attributes.getAttribute(testAttribute1), @@ -97,7 +97,7 @@ class KotlinFragmentConfigurationDefinitionTest : AbstractKpmExtensionTest() { @Test fun `test definition + attributes`() { val definition = ConfigurationDefinition( - provider = { project.configurations.create("a") } + provider = ConfigurationProvider { project.configurations.create("a") } ) val attributes1 = FragmentAttributes { } @@ -131,7 +131,7 @@ class KotlinFragmentConfigurationDefinitionTest : AbstractKpmExtensionTest() { ) project.configurations.create("dummy").apply { - outgoing.artifacts(composite, testFragment) + composite.addArtifacts(outgoing, dummyFragment) assertEquals( project.files("artifact1.jar", "artifact2-a.jar", "artifact2-b.jar").toSet(), outgoing.artifacts.files.toSet() @@ -142,7 +142,7 @@ class KotlinFragmentConfigurationDefinitionTest : AbstractKpmExtensionTest() { @Test fun `test definition + artifacts`() { val definition = ConfigurationDefinition( - provider = { throw NotImplementedError() } + provider = ConfigurationProvider { throw NotImplementedError() } ) val artifacts1 = FragmentArtifacts {} @@ -174,7 +174,7 @@ class KotlinFragmentConfigurationDefinitionTest : AbstractKpmExtensionTest() { listOf(capabilities1, capabilities2), composite.children ) - val dummyContext = object : KotlinGradleFragmentConfigurationCapabilities.Context { + val testCapabilitiesContainer = object : KotlinGradleFragmentConfigurationCapabilities.CapabilitiesContainer { val setCapabilities = mutableListOf() override fun capability(notation: Any) { setCapabilities.add(notation) @@ -184,9 +184,10 @@ class KotlinFragmentConfigurationDefinitionTest : AbstractKpmExtensionTest() { } - dummyContext.capabilities(composite, testFragment) + composite.setCapabilities(testCapabilitiesContainer, dummyFragment) + assertEquals( - listOf("capability1", "capability2"), dummyContext.setCapabilities, + listOf("capability1", "capability2"), testCapabilitiesContainer.setCapabilities, "Expected 'dummyContext' to receive all capabilities" ) } @@ -194,7 +195,7 @@ class KotlinFragmentConfigurationDefinitionTest : AbstractKpmExtensionTest() { @Test fun `test definition + capability`() { val definition = ConfigurationDefinition( - provider = { throw NotImplementedError() } + provider = ConfigurationProvider { throw NotImplementedError() } ) val capabilities1 = FragmentCapabilities {} 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 14a7240f58f..a2ef2c2e5df 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 @@ -87,8 +87,8 @@ class KotlinJvmVariantFactoryTest : AbstractKpmExtensionTest() { fun `test custom configure compileDependenciesConfiguration`() { val variant = KotlinJvmVariantFactory( kotlin.main, KotlinJvmVariantConfig( - compileDependencies = DefaultKotlinCompileDependenciesDefinition + FragmentAttributes { fragment -> - assertSame(fragment.compileDependenciesConfiguration.attributes, this) + compileDependencies = DefaultKotlinCompileDependenciesDefinition + FragmentAttributes { + assertSame(fragment.compileDependenciesConfiguration.attributes, attributes) attribute(testAttribute, "compileDependencies") } ) @@ -103,8 +103,8 @@ class KotlinJvmVariantFactoryTest : AbstractKpmExtensionTest() { fun `test custom configure runtimeDependenciesConfiguration`() { val variant = KotlinJvmVariantFactory( kotlin.main, KotlinJvmVariantConfig( - runtimeDependencies = DefaultKotlinRuntimeDependenciesDefinition + FragmentAttributes { fragment -> - assertSame(fragment.runtimeDependenciesConfiguration.attributes, this) + runtimeDependencies = DefaultKotlinRuntimeDependenciesDefinition + FragmentAttributes { + assertSame(fragment.runtimeDependenciesConfiguration.attributes, attributes) attribute(testAttribute, "runtimeDependencies") } ) @@ -119,8 +119,8 @@ class KotlinJvmVariantFactoryTest : AbstractKpmExtensionTest() { fun `test custom configure apiElementsConfiguration`() { val variant = KotlinJvmVariantFactory( kotlin.main, KotlinJvmVariantConfig( - apiElements = DefaultKotlinApiElementsDefinition + FragmentAttributes { fragment -> - assertSame(fragment.apiElementsConfiguration.attributes, this) + apiElements = DefaultKotlinApiElementsDefinition + FragmentAttributes { + assertSame(fragment.apiElementsConfiguration.attributes, attributes) attribute(testAttribute, "apiElements") } ) @@ -135,8 +135,8 @@ class KotlinJvmVariantFactoryTest : AbstractKpmExtensionTest() { fun `test custom configure runtimeElementsConfiguration`() { val variant = KotlinJvmVariantFactory( kotlin.main, KotlinJvmVariantConfig( - runtimeElements = DefaultKotlinRuntimeElementsDefinition + FragmentAttributes { fragment -> - assertSame(fragment.runtimeElementsConfiguration.attributes, this) + runtimeElements = DefaultKotlinRuntimeElementsDefinition + FragmentAttributes { + assertSame(fragment.runtimeElementsConfiguration.attributes, attributes) attribute(testAttribute, "runtimeElements") } ) 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 index cb566d7561b..6ca0a1c8684 100644 --- 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 @@ -10,7 +10,6 @@ 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.api.attributes.java.TargetJvmEnvironment.TARGET_JVM_ENVIRONMENT_ATTRIBUTE -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 @@ -21,34 +20,34 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinUsages.producerRuntimeUsage import org.jetbrains.kotlin.gradle.plugin.usageByName import org.jetbrains.kotlin.gradle.utils.isGradleVersionAtLeast -val KotlinFragmentPlatformAttributes = FragmentAttributes { fragment -> +val KotlinFragmentPlatformAttributes = FragmentAttributes { if (isGradleVersionAtLeast(7, 0) && fragment.platformType == KotlinPlatformType.jvm) { - attribute(TARGET_JVM_ENVIRONMENT_ATTRIBUTE, fragment.project.objects.named(TargetJvmEnvironment.STANDARD_JVM)) + namedAttribute(TARGET_JVM_ENVIRONMENT_ATTRIBUTE, TargetJvmEnvironment.STANDARD_JVM) } attribute(KotlinPlatformType.attribute, fragment.platformType) } -val KotlinFragmentConsumerApiUsageAttribute = FragmentAttributes { fragment -> - attribute(USAGE_ATTRIBUTE, consumerApiUsage(fragment.project, fragment.platformType)) +val KotlinFragmentConsumerApiUsageAttribute = FragmentAttributes { + attribute(USAGE_ATTRIBUTE, consumerApiUsage(project, fragment.platformType)) } -val KotlinFragmentProducerApiUsageAttribute = FragmentAttributes { fragment -> +val KotlinFragmentProducerApiUsageAttribute = FragmentAttributes { attribute(USAGE_ATTRIBUTE, producerApiUsage(fragment.project, fragment.platformType)) } -val KotlinFragmentConsumerRuntimeUsageAttribute = FragmentAttributes { fragment -> +val KotlinFragmentConsumerRuntimeUsageAttribute = FragmentAttributes { attribute(USAGE_ATTRIBUTE, consumerRuntimeUsage(fragment.project, fragment.platformType)) } -val KotlinFragmentProducerRuntimeUsageAttribute = FragmentAttributes { fragment -> +val KotlinFragmentProducerRuntimeUsageAttribute = FragmentAttributes { attribute(USAGE_ATTRIBUTE, producerRuntimeUsage(fragment.project, fragment.platformType)) } -val KotlinFragmentMetadataUsageAttribute = FragmentAttributes { fragment -> +val KotlinFragmentMetadataUsageAttribute = FragmentAttributes { attribute(USAGE_ATTRIBUTE, fragment.project.usageByName(KotlinUsages.KOTLIN_METADATA)) } -val KotlinFragmentKonanTargetAttribute = FragmentAttributes { fragment -> - attribute(KotlinNativeTarget.konanTargetAttribute, fragment.konanTarget.name) +val KotlinFragmentKonanTargetAttribute = FragmentAttributes { + attributes.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 index 7347067c5e0..23c4abc41e8 100644 --- 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 @@ -10,70 +10,70 @@ import org.gradle.api.attributes.Category val DefaultKotlinCompileDependenciesDefinition = KotlinGradleFragmentConfigurationDefinition( - provider = { + provider = ConfigurationProvider { project.configurations.maybeCreate(disambiguateName("compileDependencies")).apply { isCanBeConsumed = false isCanBeResolved = true } }, - relations = { configuration -> - configuration.extendsFrom(dependencies.transitiveApiConfiguration) - configuration.extendsFrom(dependencies.transitiveImplementationConfiguration) + relations = FragmentConfigurationRelation { + extendsFrom(dependencies.transitiveApiConfiguration) + extendsFrom(dependencies.transitiveImplementationConfiguration) }, attributes = KotlinFragmentPlatformAttributes + KotlinFragmentConsumerApiUsageAttribute ) val DefaultKotlinRuntimeDependenciesDefinition = ConfigurationDefinition( - provider = { + provider = ConfigurationProvider { project.configurations.maybeCreate(disambiguateName("runtimeDependencies")).apply { isCanBeConsumed = false isCanBeResolved = true } }, attributes = KotlinFragmentPlatformAttributes + KotlinFragmentConsumerRuntimeUsageAttribute, - relations = { configuration -> - configuration.extendsFrom(dependencies.transitiveApiConfiguration) - configuration.extendsFrom(dependencies.transitiveImplementationConfiguration) + relations = FragmentConfigurationRelation { + extendsFrom(dependencies.transitiveApiConfiguration) + extendsFrom(dependencies.transitiveImplementationConfiguration) } ) val DefaultKotlinApiElementsDefinition = ConfigurationDefinition( - provider = { - module.project.configurations.maybeCreate(disambiguateName("apiElements")).apply { + provider = ConfigurationProvider { + project.configurations.maybeCreate(disambiguateName("apiElements")).apply { isCanBeResolved = false isCanBeConsumed = false module.ifMadePublic { isCanBeConsumed = true } } }, - relations = { configuration -> configuration.extendsFrom(dependencies.transitiveApiConfiguration) }, + relations = FragmentConfigurationRelation { extendsFrom(dependencies.transitiveApiConfiguration) }, capabilities = KotlinFragmentModuleCapability, - attributes = KotlinFragmentPlatformAttributes + KotlinFragmentProducerApiUsageAttribute + { fragment -> + attributes = KotlinFragmentPlatformAttributes + KotlinFragmentProducerApiUsageAttribute + FragmentAttributes { 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 { + provider = ConfigurationProvider { + project.configurations.maybeCreate(disambiguateName("runtimeElements")).apply { isCanBeResolved = false isCanBeConsumed = false module.ifMadePublic { isCanBeConsumed = true } } }, - relations = { configuration -> - configuration.extendsFrom(dependencies.transitiveApiConfiguration) - configuration.extendsFrom(dependencies.transitiveImplementationConfiguration) + relations = FragmentConfigurationRelation { + extendsFrom(dependencies.transitiveApiConfiguration) + 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)) + attributes = KotlinFragmentPlatformAttributes + KotlinFragmentProducerRuntimeUsageAttribute + FragmentAttributes { + 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)) }, capabilities = KotlinFragmentModuleCapability.onlyIfMadePublic() ) val DefaultKotlinHostSpecificMetadataElementsDefinition = ConfigurationDefinition( - provider = { + provider = ConfigurationProvider { project.configurations.maybeCreate(disambiguateName("hostSpecificMetadataElements")).apply { isCanBeResolved = false isCanBeConsumed = false @@ -82,4 +82,3 @@ val DefaultKotlinHostSpecificMetadataElementsDefinition = ConfigurationDefinitio attributes = KotlinFragmentPlatformAttributes + KotlinFragmentKonanTargetAttribute + KotlinFragmentMetadataUsageAttribute, artifacts = KotlinFragmentHostSpecificMetadataArtifact ) - diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinFragmentCompilationOutputsJarArtifact.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinFragmentCompilationOutputsJarArtifact.kt index 3ac96709862..2155867e427 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinFragmentCompilationOutputsJarArtifact.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinFragmentCompilationOutputsJarArtifact.kt @@ -13,8 +13,8 @@ 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. */ -val KotlinFragmentCompilationOutputsJarArtifact = FragmentArtifacts { fragment -> - artifact(fragment.project.locateOrRegisterTask(fragment.disambiguateName("jar")) { +val KotlinFragmentCompilationOutputsJarArtifact = FragmentArtifacts { + artifact(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/KotlinFragmentHostSpecificMetadataArtifact.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinFragmentHostSpecificMetadataArtifact.kt index 4452e1243ad..8cf34c03686 100644 --- 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 @@ -19,8 +19,7 @@ import org.jetbrains.kotlin.project.model.refinesClosure * Will add this jar artifact to the given configuration */ -val KotlinFragmentHostSpecificMetadataArtifact = FragmentArtifacts artifacts@{ fragment -> - val project = fragment.project +val KotlinFragmentHostSpecificMetadataArtifact = FragmentArtifacts artifacts@{ val hostSpecificMetadataElements = fragment.hostSpecificMetadataElementsConfiguration ?: return@artifacts val hostSpecificMetadataJar = project.registerTask(fragment.disambiguateName("hostSpecificMetadataJar")) { jar -> 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 index c658d3960b4..93a74dff47c 100644 --- 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 @@ -9,7 +9,7 @@ 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 -> +val KotlinFragmentModuleCapability = FragmentCapabilities { capability(fragment.containingModule.moduleCapability ?: return@FragmentCapabilities) } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinGradleFragmentConfigurationArtifacts.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinGradleFragmentConfigurationArtifacts.kt index 0af8502f146..6ece548e12f 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinGradleFragmentConfigurationArtifacts.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinGradleFragmentConfigurationArtifacts.kt @@ -5,31 +5,47 @@ package org.jetbrains.kotlin.gradle.plugin.mpp.pm20 +import org.gradle.api.Project import org.gradle.api.artifacts.ConfigurationPublications /* Internal abbreviation */ internal typealias FragmentArtifacts = KotlinGradleFragmentConfigurationArtifacts -fun interface KotlinGradleFragmentConfigurationArtifacts { - fun ConfigurationPublications.addArtifacts(fragment: T) +interface KotlinGradleFragmentConfigurationArtifacts { + fun addArtifacts(outgoing: ConfigurationPublications, fragment: T) - companion object { - val None = FragmentArtifacts {} + object None : KotlinGradleFragmentConfigurationArtifacts { + override fun addArtifacts(outgoing: ConfigurationPublications, fragment: KotlinGradleFragment) = Unit } } -fun ConfigurationPublications.artifacts( - artifacts: FragmentArtifacts, fragment: T -) = with(artifacts) { addArtifacts(fragment) } +class KotlinGradleFragmentConfigurationArtifactsContext internal constructor( + internal val outgoing: ConfigurationPublications, + val fragment: T +) : ConfigurationPublications by outgoing { + val project: Project get() = fragment.project +} + +@Suppress("FunctionName") +fun FragmentArtifacts( + addArtifacts: KotlinGradleFragmentConfigurationArtifactsContext.() -> Unit +): KotlinGradleFragmentConfigurationArtifacts { + return object : KotlinGradleFragmentConfigurationArtifacts { + override fun addArtifacts(outgoing: ConfigurationPublications, fragment: T) { + val context = KotlinGradleFragmentConfigurationArtifactsContext(outgoing, fragment) + context.addArtifacts() + } + } +} operator fun FragmentArtifacts.plus(other: FragmentArtifacts): FragmentArtifacts { + if (this === KotlinGradleFragmentConfigurationArtifacts.None) return other + if (other === KotlinGradleFragmentConfigurationArtifacts.None) return this + if (this is CompositeFragmentArtifacts && other is CompositeFragmentArtifacts) { return CompositeFragmentArtifacts(this.children + other.children) } - if (this === FragmentArtifacts.None) return other - if (other === FragmentArtifacts.None) return this - if (this is CompositeFragmentArtifacts) { return CompositeFragmentArtifacts(this.children + other) } @@ -43,7 +59,8 @@ operator fun FragmentArtifacts.plus(other: Fragmen internal class CompositeFragmentArtifacts(val children: List>) : FragmentArtifacts { - override fun ConfigurationPublications.addArtifacts(fragment: T) { - children.forEach { child -> artifacts(child, fragment) } + + override fun addArtifacts(outgoing: ConfigurationPublications, fragment: T) { + children.forEach { child -> child.addArtifacts(outgoing, fragment) } } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinGradleFragmentConfigurationAttributes.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinGradleFragmentConfigurationAttributes.kt index 4512b335a85..c3f6ba80d7b 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinGradleFragmentConfigurationAttributes.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinGradleFragmentConfigurationAttributes.kt @@ -5,31 +5,58 @@ package org.jetbrains.kotlin.gradle.plugin.mpp.pm20 +import org.gradle.api.Named +import org.gradle.api.Project +import org.gradle.api.attributes.Attribute import org.gradle.api.attributes.AttributeContainer /* Internal abbreviation */ internal typealias FragmentAttributes = KotlinGradleFragmentConfigurationAttributes -fun interface KotlinGradleFragmentConfigurationAttributes { - fun AttributeContainer.setAttributes(fragment: T) +interface KotlinGradleFragmentConfigurationAttributes { - companion object { - val None = FragmentAttributes {} + fun setAttributes(attributes: AttributeContainer, fragment: T) + + object None : FragmentAttributes { + override fun setAttributes(attributes: AttributeContainer, fragment: KotlinGradleFragment) = Unit } } -fun AttributeContainer.attributes(attributes: FragmentAttributes, fragment: T) = with(attributes) { - setAttributes(fragment) +class KotlinGradleFragmentConfigurationAttributesContext internal constructor( + internal val attributes: AttributeContainer, + val fragment: T, +) : AttributeContainer by attributes { + val project: Project get() = fragment.project + + inline fun named(name: String): T = project.objects.named(T::class.java, name) + + inline fun namedAttribute(key: Attribute, name: String) = apply { attribute(key, named(name)) } + + override fun attribute(key: Attribute, value: K): KotlinGradleFragmentConfigurationAttributesContext = apply { + attributes.attribute(key, value) + } +} + +@Suppress("FunctionName") +fun FragmentAttributes( + setAttributes: KotlinGradleFragmentConfigurationAttributesContext.() -> Unit +): KotlinGradleFragmentConfigurationAttributes { + return object : KotlinGradleFragmentConfigurationAttributes { + override fun setAttributes(attributes: AttributeContainer, fragment: T) { + val context = KotlinGradleFragmentConfigurationAttributesContext(attributes, fragment) + context.setAttributes() + } + } } operator fun FragmentAttributes.plus(other: FragmentAttributes): FragmentAttributes { + if (this === KotlinGradleFragmentConfigurationAttributes.None) return other + if (other === KotlinGradleFragmentConfigurationAttributes.None) return this + if (this is CompositeFragmentAttributes && other is CompositeFragmentAttributes) { return CompositeFragmentAttributes(this.children + other.children) } - if (this === FragmentAttributes.None) return other - if (other === FragmentAttributes.None) return this - if (this is CompositeFragmentAttributes) { return CompositeFragmentAttributes(this.children + other) } @@ -43,7 +70,7 @@ operator fun FragmentAttributes.plus(other: Fragme internal class CompositeFragmentAttributes(val children: List>) : FragmentAttributes { - override fun AttributeContainer.setAttributes(fragment: T) { - children.forEach { attribute -> attributes(attribute, fragment) } + override fun setAttributes(attributes: AttributeContainer, fragment: T) { + children.forEach { child -> child.setAttributes(attributes, fragment) } } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinGradleFragmentConfigurationCapabilities.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinGradleFragmentConfigurationCapabilities.kt index 04c45143c31..baa05388b34 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinGradleFragmentConfigurationCapabilities.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinGradleFragmentConfigurationCapabilities.kt @@ -3,52 +3,80 @@ * 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.Project import org.gradle.api.artifacts.Configuration +import org.gradle.api.artifacts.ConfigurationPublications import org.gradle.api.capabilities.Capability +import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KotlinGradleFragmentConfigurationCapabilities.CapabilitiesContainer /* Internal abbreviation */ internal typealias FragmentCapabilities = KotlinGradleFragmentConfigurationCapabilities -fun interface KotlinGradleFragmentConfigurationCapabilities { - interface Context { +interface KotlinGradleFragmentConfigurationCapabilities { + interface CapabilitiesContainer { 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 setCapabilities(container: CapabilitiesContainer, fragment: T) - fun Context.setCapabilities(fragment: T) - - companion object { - val None = FragmentCapabilities {} + object None : KotlinGradleFragmentConfigurationCapabilities { + override fun setCapabilities(container: CapabilitiesContainer, fragment: KotlinGradleFragment) = Unit } } -fun KotlinGradleFragmentConfigurationCapabilities.onlyIfMadePublic(): KotlinGradleFragmentConfigurationCapabilities { - return KotlinGradleFragmentConfigurationCapabilities { fragment -> - fragment.containingModule.ifMadePublic { capabilities(this@onlyIfMadePublic, fragment) } +fun KotlinGradleFragmentConfigurationCapabilities.setCapabilities( + publications: ConfigurationPublications, fragment: T +) = setCapabilities(CapabilitiesContainer(publications), fragment) + +fun CapabilitiesContainer(configuration: ConfigurationPublications): CapabilitiesContainer = + CapabilitiesContainerImpl(configuration) + +fun CapabilitiesContainer(configuration: Configuration): CapabilitiesContainer = + CapabilitiesContainerImpl(configuration.outgoing) + +private class CapabilitiesContainerImpl( + private val publications: ConfigurationPublications +) : CapabilitiesContainer { + override fun capability(notation: Any) = publications.capability(notation) + override val capabilities: List get() = publications.capabilities.orEmpty().toList() +} + +class KotlinGradleFragmentConfigurationCapabilitiesContext internal constructor( + internal val container: CapabilitiesContainer, val fragment: T +) : CapabilitiesContainer by container { + val project: Project get() = fragment.project +} + +fun FragmentCapabilities( + setCapabilities: KotlinGradleFragmentConfigurationCapabilitiesContext.() -> Unit +): KotlinGradleFragmentConfigurationCapabilities = object : KotlinGradleFragmentConfigurationCapabilities { + override fun setCapabilities(container: CapabilitiesContainer, fragment: T) { + val context = KotlinGradleFragmentConfigurationCapabilitiesContext(container, fragment) + context.setCapabilities() } } -fun KotlinGradleFragmentConfigurationCapabilities.Context.capabilities( - capabilities: KotlinGradleFragmentConfigurationCapabilities, fragment: T -) = with(capabilities) { setCapabilities(fragment) } +fun KotlinGradleFragmentConfigurationCapabilities.onlyIfMadePublic(): + KotlinGradleFragmentConfigurationCapabilities { + val decorated = this + return FragmentCapabilities { + fragment.containingModule.ifMadePublic { decorated.setCapabilities(this, fragment) } + } +} operator fun FragmentCapabilities.plus(other: FragmentCapabilities): FragmentCapabilities { + if (this === KotlinGradleFragmentConfigurationCapabilities.None) return other + if (other === KotlinGradleFragmentConfigurationCapabilities.None) return this + if (this is CompositeFragmentCapabilities && other is CompositeFragmentCapabilities) { return CompositeFragmentCapabilities(this.children + other.children) } - if (this === FragmentCapabilities.None) return other - if (other === FragmentCapabilities.None) return this - if (this is CompositeFragmentCapabilities) { return CompositeFragmentCapabilities(this.children + other) } @@ -62,7 +90,7 @@ operator fun FragmentCapabilities.plus(other: Frag internal class CompositeFragmentCapabilities(val children: List>) : FragmentCapabilities { - override fun KotlinGradleFragmentConfigurationCapabilities.Context.setCapabilities(fragment: T) { - children.forEach { capability -> capabilities(capability, fragment) } + override fun setCapabilities(container: CapabilitiesContainer, fragment: T) { + children.forEach { child -> child.setCapabilities(container, fragment) } } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinGradleFragmentConfigurationDefinition.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinGradleFragmentConfigurationDefinition.kt index 67c5b529f92..6129ade6e8d 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinGradleFragmentConfigurationDefinition.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinGradleFragmentConfigurationDefinition.kt @@ -37,7 +37,7 @@ internal class KotlinGradleFragmentConfigurationContextImpl( fun KotlinGradleFragmentConfigurationDefinition.withConfigurationProvider( provider: KotlinGradleFragmentConfigurationContext.() -> Configuration -) = copy(provider = provider) +) = copy(provider = ConfigurationProvider(provider)) operator fun KotlinGradleFragmentConfigurationDefinition.plus(other: FragmentAttributes): KotlinGradleFragmentConfigurationDefinition = copy(attributes = attributes + other) diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinGradleFragmentConfigurationProvider.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinGradleFragmentConfigurationProvider.kt index fc426812a55..15b8cbe4b0e 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinGradleFragmentConfigurationProvider.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinGradleFragmentConfigurationProvider.kt @@ -3,14 +3,17 @@ * 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 -fun interface KotlinGradleFragmentConfigurationProvider { - fun KotlinGradleFragmentConfigurationContext.getConfiguration(): Configuration +interface KotlinGradleFragmentConfigurationProvider { + fun getConfiguration(context: KotlinGradleFragmentConfigurationContext): Configuration } -internal fun KotlinGradleFragmentConfigurationProvider.getConfiguration(context: KotlinGradleFragmentConfigurationContext): Configuration { - return with(context) { getConfiguration() } +fun ConfigurationProvider(provider: KotlinGradleFragmentConfigurationContext.() -> Configuration): + KotlinGradleFragmentConfigurationProvider = object : KotlinGradleFragmentConfigurationProvider { + override fun getConfiguration(context: KotlinGradleFragmentConfigurationContext): Configuration = context.provider() } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinGradleFragmentConfigurationRelation.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinGradleFragmentConfigurationRelation.kt index 1548ec72ca6..c5fa21569c2 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinGradleFragmentConfigurationRelation.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinGradleFragmentConfigurationRelation.kt @@ -3,17 +3,37 @@ * 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.jetbrains.kotlin.gradle.utils.addExtendsFromRelation /* Internal abbreviation */ -internal typealias FragmentRelation = KotlinGradleFragmentConfigurationRelation +internal typealias FragmentConfigurationRelation = KotlinGradleFragmentConfigurationRelation -fun interface KotlinGradleFragmentConfigurationRelation { - fun KotlinGradleFragmentConfigurationContext.setupExtendsFromRelations(configuration: Configuration) +interface KotlinGradleFragmentConfigurationRelation { + fun setExtendsFrom(configuration: Configuration, context: KotlinGradleFragmentConfigurationContext) - companion object { - val None = FragmentRelation {} + object None : KotlinGradleFragmentConfigurationRelation { + override fun setExtendsFrom(configuration: Configuration, context: KotlinGradleFragmentConfigurationContext) = Unit + } +} + +class KotlinGradleFragmentConfigurationRelationContext internal constructor( + val configuration: Configuration, + context: KotlinGradleFragmentConfigurationContext +) : KotlinGradleFragmentConfigurationContext by context { + fun extendsFrom(configuration: Configuration) = this.configuration.extendsFrom(configuration) + fun extendsFrom(configuration: String) = project.addExtendsFromRelation(this.configuration.name, configuration) +} + +fun FragmentConfigurationRelation( + setExtendsFrom: KotlinGradleFragmentConfigurationRelationContext.() -> Unit +): KotlinGradleFragmentConfigurationRelation = object : KotlinGradleFragmentConfigurationRelation { + override fun setExtendsFrom(configuration: Configuration, context: KotlinGradleFragmentConfigurationContext) { + val relationContext = KotlinGradleFragmentConfigurationRelationContext(configuration, context) + relationContext.setExtendsFrom() } } 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 a29cf3c57fd..050dfa7fd35 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 @@ -51,12 +51,9 @@ class KotlinGradleFragmentFactory( } internal fun Configuration.configure( - definition: KotlinGradleFragmentConfigurationDefinition, - fragment: T + definition: KotlinGradleFragmentConfigurationDefinition, fragment: T ) { - attributes.attributes(definition.attributes, fragment) - outgoing.artifacts(definition.artifacts, fragment) - - KotlinGradleFragmentConfigurationCapabilities.ContextImpl(this) - .capabilities(definition.capabilities, fragment) + definition.attributes.setAttributes(attributes, fragment) + definition.artifacts.addArtifacts(outgoing, fragment) + definition.capabilities.setCapabilities(outgoing, fragment) } 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 1ca38d047a7..8724086c9cf 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 @@ -54,23 +54,25 @@ class KotlinJvmVariantInstantiator internal constructor( override fun create(name: String): KotlinJvmVariant { val names = FragmentNameDisambiguation(module, name) - val context = KotlinGradleFragmentConfigurationContextImpl(module, config.dependenciesConfigurationFactory.create(module, names), names) + val context = KotlinGradleFragmentConfigurationContextImpl( + module, config.dependenciesConfigurationFactory.create(module, names), names + ) return KotlinJvmVariant( containingModule = module, fragmentName = name, dependencyConfigurations = context.dependencies, compileDependenciesConfiguration = config.compileDependencies.provider.getConfiguration(context).also { configuration -> - config.compileDependencies.relations.run { context.setupExtendsFromRelations(configuration) } + config.compileDependencies.relations.setExtendsFrom(configuration, context) }, runtimeDependenciesConfiguration = config.runtimeDependencies.provider.getConfiguration(context).also { configuration -> - config.runtimeDependencies.relations.run { context.setupExtendsFromRelations(configuration) } + config.runtimeElements.relations.setExtendsFrom(configuration, context) }, apiElementsConfiguration = config.apiElements.provider.getConfiguration(context).also { configuration -> - config.apiElements.relations.run { context.setupExtendsFromRelations(configuration) } + config.apiElements.relations.setExtendsFrom(configuration, context) }, runtimeElementsConfiguration = config.runtimeElements.provider.getConfiguration(context).also { configuration -> - config.runtimeElements.relations.run { context.setupExtendsFromRelations(configuration) } + config.runtimeElements.relations.setExtendsFrom(configuration, context) } ) } 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 1229cb83089..b6eebb3fe07 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 @@ -61,14 +61,14 @@ class KotlinNativeVariantInstantiator( fragmentName = name, dependencyConfigurations = dependencies, compileDependencyConfiguration = config.compileDependencies.provider.getConfiguration(context).also { configuration -> - config.compileDependencies.relations.run { context.setupExtendsFromRelations(configuration) } + config.compileDependencies.relations.setExtendsFrom(configuration, context) }, apiElementsConfiguration = config.apiElements.provider.getConfiguration(context).also { configuration -> - config.apiElements.relations.run { context.setupExtendsFromRelations(configuration) } + config.apiElements.relations.setExtendsFrom(configuration, context) }, hostSpecificMetadataElementsConfiguration = config.hostSpecificMetadataElements.provider.getConfiguration(context).also { configuration -> - config.hostSpecificMetadataElements.relations.run { context.setupExtendsFromRelations(configuration) } + config.hostSpecificMetadataElements.relations.setExtendsFrom(configuration, context) } ) }