From 67fc9be3c5dfdd45e4052eec49c237b64752d075 Mon Sep 17 00:00:00 2001 From: "Alexander.Likhachev" Date: Tue, 14 Mar 2023 15:55:36 +0100 Subject: [PATCH] [Gradle] Access the artifact type attribute via non-deprecated API #KT-54447 Fixed --- .../gradle/plugin/KotlinPluginWrapper.kt | 5 +++ .../gradle/plugin/KotlinTargetConfigurator.kt | 12 +++--- .../internal/ArtifactTypeAttributeAccessor.kt | 39 +++++++++++++++++++ .../native/KotlinNativeTargetConfigurator.kt | 8 ++-- .../native/internal/CInteropConfigurations.kt | 4 +- .../kotlin/gradle/plugin/PluginWrappers.kt | 2 + .../ArtifactTypeAttributeAccessorG70.kt | 20 ++++++++++ .../kotlin/gradle/plugin/PluginWrappers.kt | 2 + .../ArtifactTypeAttributeAccessorG71.kt | 20 ++++++++++ .../kotlin/gradle/plugin/PluginWrappers.kt | 2 + .../ArtifactTypeAttributeAccessorG6.kt | 20 ++++++++++ 11 files changed, 122 insertions(+), 12 deletions(-) create mode 100644 libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/internal/ArtifactTypeAttributeAccessor.kt create mode 100644 libraries/tools/kotlin-gradle-plugin/src/gradle70/kotlin/org/jetbrains/kotlin/gradle/plugin/internal/ArtifactTypeAttributeAccessorG70.kt create mode 100644 libraries/tools/kotlin-gradle-plugin/src/gradle71/kotlin/org/jetbrains/kotlin/gradle/plugin/internal/ArtifactTypeAttributeAccessorG71.kt create mode 100644 libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/internal/ArtifactTypeAttributeAccessorG6.kt diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPluginWrapper.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPluginWrapper.kt index badbab21238..10f195c606a 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPluginWrapper.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPluginWrapper.kt @@ -162,6 +162,11 @@ abstract class DefaultKotlinBasePlugin : KotlinBasePlugin { KotlinTestReportCompatibilityHelper.KotlinTestReportCompatibilityHelperVariantFactory::class, DefaultKotlinTestReportCompatibilityHelperVariantFactory() ) + + factories.putIfAbsent( + ArtifactTypeAttributeAccessor.ArtifactTypeAttributeAccessorVariantFactory::class, + DefaultArtifactTypeAttributeAccessorVariantFactory() + ) } protected fun setupAttributeMatchingStrategy( diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinTargetConfigurator.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinTargetConfigurator.kt index 7f081256b78..b19e420e30f 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinTargetConfigurator.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinTargetConfigurator.kt @@ -16,7 +16,6 @@ import org.gradle.api.artifacts.type.ArtifactTypeDefinition import org.gradle.api.attributes.* import org.gradle.api.attributes.Usage.USAGE_ATTRIBUTE import org.gradle.api.file.FileCollection -import org.gradle.api.internal.artifacts.ArtifactAttributes import org.gradle.api.plugins.BasePlugin import org.gradle.api.plugins.ExtensionAware import org.gradle.api.plugins.JavaBasePlugin @@ -26,6 +25,7 @@ import org.gradle.api.tasks.bundling.Zip import org.gradle.language.base.plugins.LifecycleBasePlugin import org.gradle.language.jvm.tasks.ProcessResources import org.jetbrains.kotlin.gradle.dsl.KotlinCommonOptions +import org.jetbrains.kotlin.gradle.plugin.internal.artifactTypeAttribute import org.jetbrains.kotlin.gradle.plugin.mpp.* import org.jetbrains.kotlin.gradle.targets.js.KotlinJsCompilerAttribute import org.jetbrains.kotlin.gradle.targets.js.KotlinJsTarget @@ -336,25 +336,25 @@ abstract class KotlinOnlyTargetConfigurator) { val runtimeConfiguration = mainCompilation.internal.configurations.deprecatedRuntimeConfiguration val runtimeElementsConfiguration = project.configurations.getByName(target.runtimeElementsConfigurationName) - runtimeConfiguration?.let { addJarIfNoArtifactsPresent(runtimeConfiguration, jarArtifact) } - addJarIfNoArtifactsPresent(runtimeElementsConfiguration, jarArtifact) + runtimeConfiguration?.let { addJarIfNoArtifactsPresent(project, runtimeConfiguration, jarArtifact) } + addJarIfNoArtifactsPresent(project, runtimeElementsConfiguration, jarArtifact) } } } } - private fun addJarIfNoArtifactsPresent(configuration: Configuration, jarArtifact: PublishArtifact) { + private fun addJarIfNoArtifactsPresent(project: Project, configuration: Configuration, jarArtifact: PublishArtifact) { if (configuration.artifacts.isEmpty()) { val publications = configuration.outgoing // Configure an implicit variant publications.artifacts.add(jarArtifact) - publications.attributes.attribute(ArtifactAttributes.ARTIFACT_FORMAT, archiveType) + publications.attributes.attribute(project.artifactTypeAttribute, archiveType) } } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/internal/ArtifactTypeAttributeAccessor.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/internal/ArtifactTypeAttributeAccessor.kt new file mode 100644 index 00000000000..62e0f8da60a --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/internal/ArtifactTypeAttributeAccessor.kt @@ -0,0 +1,39 @@ +/* + * Copyright 2010-2023 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.internal + +import org.gradle.api.Project +import org.gradle.api.artifacts.type.ArtifactTypeDefinition +import org.gradle.api.attributes.Attribute +import org.jetbrains.kotlin.gradle.plugin.VariantImplementationFactories +import org.jetbrains.kotlin.gradle.plugin.variantImplementationFactory + +/** + * Gradle 7.3 introduced the artifact type attribute as a part of public API. + * The old API is now deprecated, so we continue using it only for old Gradle versions + */ +interface ArtifactTypeAttributeAccessor { + val artifactTypeAttribute: Attribute + + interface ArtifactTypeAttributeAccessorVariantFactory : VariantImplementationFactories.VariantImplementationFactory { + fun getInstance(): ArtifactTypeAttributeAccessor + } +} + +internal class DefaultArtifactTypeAttributeAccessorVariantFactory : + ArtifactTypeAttributeAccessor.ArtifactTypeAttributeAccessorVariantFactory { + override fun getInstance() = DefaultArtifactTypeAttributeAccessor() +} + +internal class DefaultArtifactTypeAttributeAccessor : ArtifactTypeAttributeAccessor { + override val artifactTypeAttribute: Attribute + get() = ArtifactTypeDefinition.ARTIFACT_TYPE_ATTRIBUTE +} + +internal val Project.artifactTypeAttribute + get() = variantImplementationFactory() + .getInstance() + .artifactTypeAttribute \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeTargetConfigurator.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeTargetConfigurator.kt index ef348b74e46..2ea5c552ba7 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeTargetConfigurator.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeTargetConfigurator.kt @@ -17,7 +17,6 @@ import org.gradle.api.attributes.AttributeContainer import org.gradle.api.attributes.Category import org.gradle.api.attributes.Usage import org.gradle.api.attributes.Usage.USAGE_ATTRIBUTE -import org.gradle.api.internal.artifacts.ArtifactAttributes import org.gradle.api.internal.plugins.DefaultArtifactPublicationSet import org.gradle.api.plugins.BasePlugin import org.gradle.api.provider.Provider @@ -28,6 +27,7 @@ import org.jetbrains.kotlin.gradle.dsl.KotlinNativeCompilerOptions import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation.Companion.TEST_COMPILATION_NAME import org.jetbrains.kotlin.gradle.plugin.KotlinCompilationInfo.KPM import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.Companion.KOTLIN_NATIVE_IGNORE_INCORRECT_DEPENDENCIES +import org.jetbrains.kotlin.gradle.plugin.internal.artifactTypeAttribute import org.jetbrains.kotlin.gradle.plugin.mpp.* import org.jetbrains.kotlin.gradle.plugin.mpp.apple.registerEmbedAndSignAppleFrameworkTask import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.GradleKpmVariant @@ -125,7 +125,7 @@ open class KotlinNativeTargetConfigurator : AbstractKotl artifacts.add(linkArtifact) attributes.attribute(KotlinPlatformType.attribute, binary.target.platformType) attributes.attribute( - ArtifactAttributes.ARTIFACT_FORMAT, + project.artifactTypeAttribute, NativeArtifactFormat.FRAMEWORK ) attributes.attribute( @@ -303,7 +303,7 @@ open class KotlinNativeTargetConfigurator : AbstractKotl val apiElements = configurations.getByName(target.apiElementsConfigurationName) - apiElements.outgoing.attributes.attribute(ArtifactAttributes.ARTIFACT_FORMAT, NativeArtifactFormat.KLIB) + apiElements.outgoing.attributes.attribute(artifactTypeAttribute, NativeArtifactFormat.KLIB) if (project.isKotlinGranularMetadataEnabled) { project.configurations.create(target.hostSpecificMetadataElementsConfigurationName) { configuration -> @@ -580,7 +580,7 @@ open class KotlinNativeTargetConfigurator : AbstractKotl } project.project.extensions.getByType(DefaultArtifactPublicationSet::class.java).addCandidate(klibArtifact) artifacts.add(klibArtifact) - attributes.attribute(ArtifactAttributes.ARTIFACT_FORMAT, NativeArtifactFormat.KLIB) + attributes.attribute(project.artifactTypeAttribute, NativeArtifactFormat.KLIB) } } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/CInteropConfigurations.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/CInteropConfigurations.kt index 765c4636e7f..ce64bca7928 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/CInteropConfigurations.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/CInteropConfigurations.kt @@ -8,11 +8,11 @@ package org.jetbrains.kotlin.gradle.targets.native.internal import org.gradle.api.Project import org.gradle.api.artifacts.Configuration import org.gradle.api.attributes.* -import org.gradle.api.internal.artifacts.ArtifactAttributes import org.gradle.api.tasks.TaskProvider import org.jetbrains.kotlin.gradle.plugin.KotlinNativeTargetConfigurator.NativeArtifactFormat import org.jetbrains.kotlin.gradle.plugin.KotlinTarget import org.jetbrains.kotlin.gradle.plugin.categoryByName +import org.jetbrains.kotlin.gradle.plugin.internal.artifactTypeAttribute import org.jetbrains.kotlin.gradle.plugin.mpp.* import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.copyAttributes import org.jetbrains.kotlin.gradle.plugin.usesPlatformOf @@ -80,7 +80,7 @@ internal fun Project.locateOrCreateCInteropApiElementsConfiguration(target: Kotl attributes.attribute(LibraryElements.LIBRARY_ELEMENTS_ATTRIBUTE, cinteropKlibLibraryElements()) attributes.attribute(Usage.USAGE_ATTRIBUTE, objects.named(Usage::class.java, KotlinUsages.KOTLIN_CINTEROP)) attributes.attribute(Category.CATEGORY_ATTRIBUTE, project.categoryByName(Category.LIBRARY)) - attributes.attribute(ArtifactAttributes.ARTIFACT_FORMAT, NativeArtifactFormat.KLIB) + attributes.attribute(artifactTypeAttribute, NativeArtifactFormat.KLIB) } } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/gradle70/kotlin/org/jetbrains/kotlin/gradle/plugin/PluginWrappers.kt b/libraries/tools/kotlin-gradle-plugin/src/gradle70/kotlin/org/jetbrains/kotlin/gradle/plugin/PluginWrappers.kt index 02f7f657695..f38f2cf9d11 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/gradle70/kotlin/org/jetbrains/kotlin/gradle/plugin/PluginWrappers.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/gradle70/kotlin/org/jetbrains/kotlin/gradle/plugin/PluginWrappers.kt @@ -149,4 +149,6 @@ private fun Project.registerVariantImplementations() { MppTestReportHelperG70.MppTestReportHelperVariantFactoryG70() factories[KotlinTestReportCompatibilityHelper.KotlinTestReportCompatibilityHelperVariantFactory::class] = KotlinTestReportCompatibilityHelperG70.KotlinTestReportCompatibilityHelperVariantFactoryG70() + factories[ArtifactTypeAttributeAccessor.ArtifactTypeAttributeAccessorVariantFactory::class] = + ArtifactTypeAttributeAccessorG70.ArtifactTypeAttributeAccessorVariantFactoryG70() } diff --git a/libraries/tools/kotlin-gradle-plugin/src/gradle70/kotlin/org/jetbrains/kotlin/gradle/plugin/internal/ArtifactTypeAttributeAccessorG70.kt b/libraries/tools/kotlin-gradle-plugin/src/gradle70/kotlin/org/jetbrains/kotlin/gradle/plugin/internal/ArtifactTypeAttributeAccessorG70.kt new file mode 100644 index 00000000000..bc893e3cc80 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/gradle70/kotlin/org/jetbrains/kotlin/gradle/plugin/internal/ArtifactTypeAttributeAccessorG70.kt @@ -0,0 +1,20 @@ +/* + * Copyright 2010-2023 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.internal + +import org.gradle.api.attributes.Attribute +import org.gradle.api.internal.artifacts.ArtifactAttributes + +internal class ArtifactTypeAttributeAccessorG70( +) : ArtifactTypeAttributeAccessor { + override val artifactTypeAttribute: Attribute + get() = ArtifactAttributes.ARTIFACT_FORMAT + + internal class ArtifactTypeAttributeAccessorVariantFactoryG70 : + ArtifactTypeAttributeAccessor.ArtifactTypeAttributeAccessorVariantFactory { + override fun getInstance(): ArtifactTypeAttributeAccessor = ArtifactTypeAttributeAccessorG70() + } +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/gradle71/kotlin/org/jetbrains/kotlin/gradle/plugin/PluginWrappers.kt b/libraries/tools/kotlin-gradle-plugin/src/gradle71/kotlin/org/jetbrains/kotlin/gradle/plugin/PluginWrappers.kt index 9526f939962..f7d66fa72fe 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/gradle71/kotlin/org/jetbrains/kotlin/gradle/plugin/PluginWrappers.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/gradle71/kotlin/org/jetbrains/kotlin/gradle/plugin/PluginWrappers.kt @@ -150,4 +150,6 @@ private fun Project.registerVariantImplementations() { MppTestReportHelperG71.MppTestReportHelperVariantFactoryG71() factories[KotlinTestReportCompatibilityHelper.KotlinTestReportCompatibilityHelperVariantFactory::class] = KotlinTestReportCompatibilityHelperG71.KotlinTestReportCompatibilityHelperVariantFactoryG71() + factories[ArtifactTypeAttributeAccessor.ArtifactTypeAttributeAccessorVariantFactory::class] = + ArtifactTypeAttributeAccessorG71.ArtifactTypeAttributeAccessorVariantFactoryG71() } diff --git a/libraries/tools/kotlin-gradle-plugin/src/gradle71/kotlin/org/jetbrains/kotlin/gradle/plugin/internal/ArtifactTypeAttributeAccessorG71.kt b/libraries/tools/kotlin-gradle-plugin/src/gradle71/kotlin/org/jetbrains/kotlin/gradle/plugin/internal/ArtifactTypeAttributeAccessorG71.kt new file mode 100644 index 00000000000..3be6c8f7f06 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/gradle71/kotlin/org/jetbrains/kotlin/gradle/plugin/internal/ArtifactTypeAttributeAccessorG71.kt @@ -0,0 +1,20 @@ +/* + * Copyright 2010-2023 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.internal + +import org.gradle.api.attributes.Attribute +import org.gradle.api.internal.artifacts.ArtifactAttributes + +internal class ArtifactTypeAttributeAccessorG71( +) : ArtifactTypeAttributeAccessor { + override val artifactTypeAttribute: Attribute + get() = ArtifactAttributes.ARTIFACT_FORMAT + + internal class ArtifactTypeAttributeAccessorVariantFactoryG71 : + ArtifactTypeAttributeAccessor.ArtifactTypeAttributeAccessorVariantFactory { + override fun getInstance(): ArtifactTypeAttributeAccessor = ArtifactTypeAttributeAccessorG71() + } +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/PluginWrappers.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/PluginWrappers.kt index e4a0aeff23e..00e41820d82 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/PluginWrappers.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/PluginWrappers.kt @@ -155,4 +155,6 @@ private fun Project.registerVariantImplementations() { MppTestReportHelperG6.MppTestReportHelperVariantFactoryG6() factories[KotlinTestReportCompatibilityHelper.KotlinTestReportCompatibilityHelperVariantFactory::class] = KotlinTestReportCompatibilityHelperG6.KotlinTestReportCompatibilityHelperVariantFactoryG6() + factories[ArtifactTypeAttributeAccessor.ArtifactTypeAttributeAccessorVariantFactory::class] = + ArtifactTypeAttributeAccessorG6.ArtifactTypeAttributeAccessorVariantFactoryG6() } \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/internal/ArtifactTypeAttributeAccessorG6.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/internal/ArtifactTypeAttributeAccessorG6.kt new file mode 100644 index 00000000000..0f4016c35e7 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/internal/ArtifactTypeAttributeAccessorG6.kt @@ -0,0 +1,20 @@ +/* + * Copyright 2010-2023 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.internal + +import org.gradle.api.attributes.Attribute +import org.gradle.api.internal.artifacts.ArtifactAttributes + +internal class ArtifactTypeAttributeAccessorG6( +) : ArtifactTypeAttributeAccessor { + override val artifactTypeAttribute: Attribute + get() = ArtifactAttributes.ARTIFACT_FORMAT + + internal class ArtifactTypeAttributeAccessorVariantFactoryG6 : + ArtifactTypeAttributeAccessor.ArtifactTypeAttributeAccessorVariantFactory { + override fun getInstance(): ArtifactTypeAttributeAccessor = ArtifactTypeAttributeAccessorG6() + } +} \ No newline at end of file