diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/compilerRunner/GradleCliCommonizer.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/compilerRunner/GradleCliCommonizer.kt index dbb0fa8a8b5..8e4da1526f3 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/compilerRunner/GradleCliCommonizer.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/compilerRunner/GradleCliCommonizer.kt @@ -16,8 +16,9 @@ import org.jetbrains.kotlin.commonizer.CliCommonizer import org.jetbrains.kotlin.gradle.internal.KOTLIN_MODULE_GROUP import org.jetbrains.kotlin.gradle.plugin.KLIB_COMMONIZER_CLASSPATH_CONFIGURATION_NAME import org.jetbrains.kotlin.gradle.plugin.getKotlinPluginVersion -import org.jetbrains.kotlin.gradle.utils.markResolvable import org.jetbrains.kotlin.gradle.plugin.usageByName +import org.jetbrains.kotlin.gradle.utils.createResolvable +import org.jetbrains.kotlin.gradle.utils.findResolvable import org.jetbrains.kotlin.gradle.utils.named private const val KOTLIN_KLIB_COMMONIZER_EMBEDDABLE = "kotlin-klib-commonizer-embeddable" @@ -29,9 +30,8 @@ internal fun GradleCliCommonizer(commonizerToolRunner: KotlinNativeCommonizerToo } internal fun Project.maybeCreateCommonizerClasspathConfiguration(): Configuration { - return configurations.findByName(KLIB_COMMONIZER_CLASSPATH_CONFIGURATION_NAME) - ?: project.configurations.create(KLIB_COMMONIZER_CLASSPATH_CONFIGURATION_NAME) - .markResolvable() + return configurations.findResolvable(KLIB_COMMONIZER_CLASSPATH_CONFIGURATION_NAME) + ?: project.configurations.createResolvable(KLIB_COMMONIZER_CLASSPATH_CONFIGURATION_NAME) .run { attributes.attribute(Category.CATEGORY_ATTRIBUTE, objects.named(Category.LIBRARY)) attributes.attribute(LibraryElements.LIBRARY_ELEMENTS_ATTRIBUTE, objects.named(LibraryElements.JAR)) diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/artifacts/KotlinLegacyCompatibilityMetadataArtifact.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/artifacts/KotlinLegacyCompatibilityMetadataArtifact.kt index 3c91ba3d1b6..ef1bea4af8e 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/artifacts/KotlinLegacyCompatibilityMetadataArtifact.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/artifacts/KotlinLegacyCompatibilityMetadataArtifact.kt @@ -21,6 +21,7 @@ import org.jetbrains.kotlin.gradle.targets.metadata.COMMON_MAIN_ELEMENTS_CONFIGU import org.jetbrains.kotlin.gradle.targets.metadata.isCompatibilityMetadataVariantEnabled import org.jetbrains.kotlin.gradle.targets.metadata.isKotlinGranularMetadataEnabled import org.jetbrains.kotlin.gradle.tasks.registerTask +import org.jetbrains.kotlin.gradle.utils.createConsumable internal val KotlinLegacyCompatibilityMetadataArtifact = KotlinTargetArtifact { target, _, _ -> if (target !is KotlinMetadataTarget) return@KotlinTargetArtifact @@ -35,9 +36,7 @@ internal val KotlinLegacyCompatibilityMetadataArtifact = KotlinTargetArtifact { } /* Create actual Gradle artifact */ - target.project.configurations.create(COMMON_MAIN_ELEMENTS_CONFIGURATION_NAME).apply { - isCanBeConsumed = true - isCanBeResolved = false + target.project.configurations.createConsumable(COMMON_MAIN_ELEMENTS_CONFIGURATION_NAME).apply { usesPlatformOf(target) attributes.attribute(Usage.USAGE_ATTRIBUTE, KotlinUsages.producerApiUsage(target)) diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/artifacts/KotlinNativeHostSpecificMetadataArtifact.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/artifacts/KotlinNativeHostSpecificMetadataArtifact.kt index 05a599fb66b..3b329b32241 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/artifacts/KotlinNativeHostSpecificMetadataArtifact.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/artifacts/KotlinNativeHostSpecificMetadataArtifact.kt @@ -23,6 +23,7 @@ import org.jetbrains.kotlin.gradle.targets.metadata.isKotlinGranularMetadataEnab import org.jetbrains.kotlin.gradle.targets.native.internal.includeCommonizedCInteropMetadata import org.jetbrains.kotlin.gradle.tasks.locateOrRegisterTask import org.jetbrains.kotlin.gradle.utils.copyAttributes +import org.jetbrains.kotlin.gradle.utils.createConsumable import org.jetbrains.kotlin.util.capitalizeDecapitalize.toLowerCaseAsciiOnly internal val KotlinNativeHostSpecificMetadataArtifact = KotlinTargetArtifact { target, apiElements, _ -> @@ -30,10 +31,7 @@ internal val KotlinNativeHostSpecificMetadataArtifact = KotlinTargetArtifact { t if (!target.project.isKotlinGranularMetadataEnabled) return@KotlinTargetArtifact val project = target.project - target.project.configurations.create(target.hostSpecificMetadataElementsConfigurationName) { configuration -> - configuration.isCanBeConsumed = true - configuration.isCanBeResolved = false - + target.project.configurations.createConsumable(target.hostSpecificMetadataElementsConfigurationName).also { configuration -> configuration.extendsFrom(*apiElements.extendsFrom.toTypedArray()) target.project.launchInStage(AfterFinaliseDsl) { diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/internal/kapt/Kapt3KotlinGradleSubplugin.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/internal/kapt/Kapt3KotlinGradleSubplugin.kt index a78d3a6872e..a1aefe7eff8 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/internal/kapt/Kapt3KotlinGradleSubplugin.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/internal/kapt/Kapt3KotlinGradleSubplugin.kt @@ -32,6 +32,8 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJvmAndroidCompilation import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinWithJavaCompilation import org.jetbrains.kotlin.gradle.tasks.* import org.jetbrains.kotlin.gradle.tasks.configuration.* +import org.jetbrains.kotlin.gradle.utils.createResolvable +import org.jetbrains.kotlin.gradle.utils.findResolvable import org.jetbrains.kotlin.gradle.utils.whenEvaluated import org.jetbrains.kotlin.util.capitalizeDecapitalize.capitalizeAsciiOnly import java.io.ByteArrayOutputStream @@ -142,10 +144,8 @@ class Kapt3GradleSubplugin @Inject internal constructor(private val registry: To fun createAptConfigurationIfNeeded(project: Project, sourceSetName: String): Configuration { val configurationName = getKaptConfigurationName(sourceSetName) - project.configurations.findByName(configurationName)?.let { return it } - val aptConfiguration = project.configurations.create(configurationName).apply { - // Should not be available for consumption from other projects during variant-aware dependency resolution: - isCanBeConsumed = false + project.configurations.findResolvable(configurationName)?.let { return it } + val aptConfiguration = project.configurations.createResolvable(configurationName).apply { attributes.attribute(Usage.USAGE_ATTRIBUTE, project.objects.named(Usage::class.java, Usage.JAVA_RUNTIME)) } @@ -368,11 +368,9 @@ class Kapt3GradleSubplugin @Inject internal constructor(private val registry: To kaptExtension ) - val kaptClasspathConfiguration = project.configurations.create("kaptClasspath_$taskName") + val kaptClasspathConfiguration = project.configurations.createResolvable("kaptClasspath_$taskName") .setExtendsFrom(kaptClasspathConfigurations).also { it.isVisible = false - it.isCanBeConsumed = false - it.isCanBeResolved = true } taskConfigAction.configureTaskProvider { taskProvider -> taskProvider.dependsOn(generateStubsTask) diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinLegacyMultiplatformPlugin.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinLegacyMultiplatformPlugin.kt index d07fe5043f7..d1bed41ace0 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinLegacyMultiplatformPlugin.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinLegacyMultiplatformPlugin.kt @@ -27,6 +27,7 @@ import org.jetbrains.kotlin.gradle.plugin.diagnostics.KotlinToolingDiagnostics import org.jetbrains.kotlin.gradle.plugin.diagnostics.reportDiagnosticOncePerBuild import org.jetbrains.kotlin.gradle.plugin.internal.JavaSourceSetsAccessor import org.jetbrains.kotlin.gradle.tasks.AbstractKotlinCompile +import org.jetbrains.kotlin.gradle.utils.createDependencyScope import org.jetbrains.kotlin.gradle.utils.whenEvaluated abstract class KotlinPlatformPluginBase(protected val platformName: String) : Plugin { @@ -53,8 +54,8 @@ open class KotlinPlatformImplementationPluginBase(platformName: String) : Kotlin override fun apply(project: Project) { warnAboutKotlin12xMppDeprecation(project) - val implementConfig = project.configurations.create(IMPLEMENT_CONFIG_NAME) - val expectedByConfig = project.configurations.create(EXPECTED_BY_CONFIG_NAME) + val implementConfig = project.configurations.createDependencyScope(IMPLEMENT_CONFIG_NAME) + val expectedByConfig = project.configurations.createDependencyScope(EXPECTED_BY_CONFIG_NAME) implementConfig.dependencies.whenObjectAdded { if (!implementConfigurationIsUsed) { 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 5b32ebea2a0..fc23ae1e819 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 @@ -70,10 +70,8 @@ abstract class DefaultKotlinBasePlugin : KotlinBasePlugin { addKotlinCompilerConfiguration(project) - project.configurations.maybeCreate(PLUGIN_CLASSPATH_CONFIGURATION_NAME).apply { + project.configurations.maybeCreateResolvable(PLUGIN_CLASSPATH_CONFIGURATION_NAME).apply { isVisible = false - isCanBeConsumed = false - isCanBeResolved = true addGradlePluginMetadataAttributes(project) } @@ -88,8 +86,7 @@ abstract class DefaultKotlinBasePlugin : KotlinBasePlugin { private fun addKotlinCompilerConfiguration(project: Project) { project .configurations - .maybeCreate(COMPILER_CLASSPATH_CONFIGURATION_NAME) - .markResolvable() + .maybeCreateResolvable(COMPILER_CLASSPATH_CONFIGURATION_NAME) .defaultDependencies { it.add( project.dependencies.create("$KOTLIN_MODULE_GROUP:$KOTLIN_COMPILER_EMBEDDABLE:${project.getKotlinPluginVersion()}") @@ -97,8 +94,7 @@ abstract class DefaultKotlinBasePlugin : KotlinBasePlugin { } project .configurations - .maybeCreate(BUILD_TOOLS_API_CLASSPATH_CONFIGURATION_NAME) - .markResolvable() + .maybeCreateResolvable(BUILD_TOOLS_API_CLASSPATH_CONFIGURATION_NAME) .defaultDependencies { it.add( project.dependencies.create("$KOTLIN_MODULE_GROUP:$KOTLIN_BUILD_TOOLS_API_IMPL:${project.getKotlinPluginVersion()}") @@ -227,9 +223,8 @@ abstract class KotlinBasePluginWrapper : DefaultKotlinBasePlugin() { project.logger.info("Using Kotlin Gradle Plugin $pluginVariant variant") checkGradleCompatibility() - project.configurations.maybeCreate(NATIVE_COMPILER_PLUGIN_CLASSPATH_CONFIGURATION_NAME).apply { + project.configurations.maybeCreateResolvable(NATIVE_COMPILER_PLUGIN_CLASSPATH_CONFIGURATION_NAME).apply { isVisible = false - isCanBeConsumed = false isTransitive = false addGradlePluginMetadataAttributes(project) } diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/dependencyResolvers/IdeBinaryDependencyResolver.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/dependencyResolvers/IdeBinaryDependencyResolver.kt index 8ed2dce0c26..ed33e2d460c 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/dependencyResolvers/IdeBinaryDependencyResolver.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/dependencyResolvers/IdeBinaryDependencyResolver.kt @@ -29,7 +29,7 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.resolvableMetadataConfiguration import org.jetbrains.kotlin.gradle.plugin.sources.DefaultKotlinSourceSet import org.jetbrains.kotlin.gradle.plugin.sources.InternalKotlinSourceSet import org.jetbrains.kotlin.gradle.plugin.sources.internal -import org.jetbrains.kotlin.gradle.utils.markResolvable +import org.jetbrains.kotlin.gradle.utils.detachedResolvable import org.jetbrains.kotlin.gradle.utils.relativeOrAbsolute import org.jetbrains.kotlin.tooling.core.mutableExtrasOf @@ -244,8 +244,7 @@ class IdeBinaryDependencyResolver @JvmOverloads constructor( if (sourceSet !is DefaultKotlinSourceSet) return null val project = sourceSet.project - val platformLikeCompileDependenciesConfiguration = project.configurations.detachedConfiguration() - platformLikeCompileDependenciesConfiguration.markResolvable() + val platformLikeCompileDependenciesConfiguration = project.configurations.detachedResolvable() platformLikeCompileDependenciesConfiguration.attributes.setupPlatformResolutionAttributes(sourceSet) platformLikeCompileDependenciesConfiguration.dependencies.addAll(sourceSet.resolvableMetadataConfiguration.allDependencies) diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinSoftwareComponent.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinSoftwareComponent.kt index 1783e0e8779..a1a93763775 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinSoftwareComponent.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinSoftwareComponent.kt @@ -34,7 +34,6 @@ import org.jetbrains.kotlin.gradle.targets.metadata.* import org.jetbrains.kotlin.gradle.utils.* import org.jetbrains.kotlin.gradle.utils.Future import org.jetbrains.kotlin.gradle.utils.future -import org.jetbrains.kotlin.gradle.utils.markResolvable import org.jetbrains.kotlin.gradle.utils.setProperty import org.jetbrains.kotlin.util.capitalizeDecapitalize.toLowerCaseAsciiOnly @@ -207,7 +206,7 @@ class DefaultKotlinUsageContext( * attributes schema migration, or create proper, non-detached configurations for publishing that are separated from the * configurations used for project-to-project dependencies */ - val result = project.configurations.detachedConfiguration().markResolvable().attributes + val result = project.configurations.detachedResolvable().attributes // Capture type parameter T: fun copyAttribute(attribute: Attribute, from: AttributeContainer, to: AttributeContainer) { diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/compilationImpl/factory/KotlinCompilationDependencyConfigurationsFactories.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/compilationImpl/factory/KotlinCompilationDependencyConfigurationsFactories.kt index 6400d62150e..bd0f74d5833 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/compilationImpl/factory/KotlinCompilationDependencyConfigurationsFactories.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/compilationImpl/factory/KotlinCompilationDependencyConfigurationsFactories.kt @@ -14,7 +14,6 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.DefaultKotlinCompi import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.KotlinCompilationConfigurationsContainer import org.jetbrains.kotlin.gradle.plugin.mpp.javaSourceSets import org.jetbrains.kotlin.gradle.plugin.sources.METADATA_CONFIGURATION_NAME_SUFFIX -import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrTarget import org.jetbrains.kotlin.gradle.utils.* internal sealed class DefaultKotlinCompilationDependencyConfigurationsFactory : @@ -101,84 +100,72 @@ private fun KotlinCompilationDependencyConfigurationsContainer( val compilationCoordinates = "${target.disambiguationClassifier}/$compilationName" /* Support deprecated configurations */ - val deprecatedCompileConfiguration = target.project.configurations.findByName( + val deprecatedCompileConfiguration = target.project.configurations.findDependencyScope( ConfigurationNaming.Default(target, compilationName).name(COMPILE) )?.apply { - isCanBeConsumed = false setupAsLocalTargetSpecificConfigurationIfSupported(target) isVisible = false - isCanBeResolved = false description = "Dependencies for $compilation (deprecated, use '${implementationConfigurationName} ' instead)." } - val deprecatedRuntimeConfiguration = if (withRuntime) target.project.configurations.findByName( + val deprecatedRuntimeConfiguration = if (withRuntime) target.project.configurations.findDependencyScope( ConfigurationNaming.Default(target, compilationName).name(RUNTIME) )?.apply { - isCanBeConsumed = false setupAsLocalTargetSpecificConfigurationIfSupported(target) deprecatedCompileConfiguration?.let { extendsFrom(it) } isVisible = false - isCanBeResolved = false description = "Runtime dependencies for $compilation (deprecated, use '${runtimeOnlyConfigurationName} ' instead)." } else null /* Actual configurations */ - val apiConfiguration = target.project.configurations.maybeCreate(apiConfigurationName).apply { + val apiConfiguration = target.project.configurations.maybeCreateDependencyScope(apiConfigurationName).apply { deprecatedCompileConfiguration?.let { extendsFrom(it) } isVisible = false - isCanBeConsumed = false - isCanBeResolved = false description = "API dependencies for $compilationCoordinates" } - val implementationConfiguration = target.project.configurations.maybeCreate(implementationConfigurationName).apply { - extendsFrom(apiConfiguration) - deprecatedCompileConfiguration?.let { extendsFrom(it) } - isVisible = false - isCanBeConsumed = false - isCanBeResolved = false - description = "Implementation only dependencies for $compilationCoordinates." - } + val implementationConfiguration = target.project.configurations + .maybeCreateDependencyScope(implementationConfigurationName).apply { + extendsFrom(apiConfiguration) + deprecatedCompileConfiguration?.let { extendsFrom(it) } + isVisible = false + description = "Implementation only dependencies for $compilationCoordinates." + } - val compileOnlyConfiguration = target.project.configurations.maybeCreate(compileOnlyConfigurationName).apply { - isCanBeConsumed = false - setupAsLocalTargetSpecificConfigurationIfSupported(target) - attributes.attribute(Category.CATEGORY_ATTRIBUTE, target.project.categoryByName(Category.LIBRARY)) - isVisible = false - isCanBeResolved = false - description = "Compile only dependencies for $compilationCoordinates." - } + val compileOnlyConfiguration = target.project.configurations + .maybeCreateDependencyScope(compileOnlyConfigurationName).apply { + setupAsLocalTargetSpecificConfigurationIfSupported(target) + attributes.attribute(Category.CATEGORY_ATTRIBUTE, target.project.categoryByName(Category.LIBRARY)) + isVisible = false + description = "Compile only dependencies for $compilationCoordinates." + } - val runtimeOnlyConfiguration = target.project.configurations.maybeCreate(runtimeOnlyConfigurationName).apply { + val runtimeOnlyConfiguration = target.project.configurations.maybeCreateDependencyScope(runtimeOnlyConfigurationName).apply { isVisible = false - isCanBeConsumed = false - isCanBeResolved = false description = "Runtime only dependencies for $compilationCoordinates." } - val compileDependencyConfiguration = target.project.configurations.maybeCreate(compileClasspathConfigurationName).apply { - extendsFrom(compileOnlyConfiguration, implementationConfiguration) - usesPlatformOf(target) - isVisible = false - isCanBeConsumed = false - attributes.attribute(Usage.USAGE_ATTRIBUTE, KotlinUsages.consumerApiUsage(target)) - if (target.platformType != KotlinPlatformType.androidJvm) { - attributes.attribute(Category.CATEGORY_ATTRIBUTE, target.project.categoryByName(Category.LIBRARY)) + val compileDependencyConfiguration = target.project.configurations + .maybeCreateResolvable(compileClasspathConfigurationName).apply { + extendsFrom(compileOnlyConfiguration, implementationConfiguration) + usesPlatformOf(target) + isVisible = false + attributes.attribute(Usage.USAGE_ATTRIBUTE, KotlinUsages.consumerApiUsage(target)) + if (target.platformType != KotlinPlatformType.androidJvm) { + attributes.attribute(Category.CATEGORY_ATTRIBUTE, target.project.categoryByName(Category.LIBRARY)) + } + description = "Compile classpath for $compilationCoordinates." } - description = "Compile classpath for $compilationCoordinates." - } val runtimeDependencyConfiguration = - if (withRuntime) target.project.configurations.maybeCreate(runtimeClasspathConfigurationName).apply { + if (withRuntime) target.project.configurations.maybeCreateResolvable(runtimeClasspathConfigurationName).apply { extendsFrom(runtimeOnlyConfiguration, implementationConfiguration) deprecatedRuntimeConfiguration?.let { extendsFrom(it) } usesPlatformOf(target) isVisible = false - isCanBeConsumed = false - isCanBeResolved = true attributes.attribute(Usage.USAGE_ATTRIBUTE, KotlinUsages.consumerRuntimeUsage(target)) if (target.platformType != KotlinPlatformType.androidJvm) { attributes.attribute(Category.CATEGORY_ATTRIBUTE, target.project.categoryByName(Category.LIBRARY)) @@ -187,8 +174,7 @@ private fun KotlinCompilationDependencyConfigurationsContainer( } else null val hostSpecificMetadataConfiguration = - if (withHostSpecificMetadata) target.project.configurations.maybeCreate(hostSpecificMetadataConfigurationName).apply { - markResolvable() + if (withHostSpecificMetadata) target.project.configurations.maybeCreateResolvable(hostSpecificMetadataConfigurationName).apply { isVisible = false description = "Host-specific Metadata dependencies for $compilationCoordinates" extendsFrom(compileDependencyConfiguration) @@ -198,7 +184,7 @@ private fun KotlinCompilationDependencyConfigurationsContainer( } } else null - val pluginConfiguration = target.project.configurations.maybeCreate(pluginConfigurationName).apply { + val pluginConfiguration = target.project.configurations.maybeCreateResolvable(pluginConfigurationName).apply { addGradlePluginMetadataAttributes(target.project) if (target.platformType == KotlinPlatformType.native) { @@ -208,7 +194,6 @@ private fun KotlinCompilationDependencyConfigurationsContainer( extendsFrom(target.project.commonKotlinPluginClasspath) } isVisible = false - isCanBeConsumed = false description = "Kotlin compiler plugins for $compilation" } diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/external/createExternalKotlinTarget.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/external/createExternalKotlinTarget.kt index ff18c018330..475b20fefd0 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/external/createExternalKotlinTarget.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/external/createExternalKotlinTarget.kt @@ -23,8 +23,8 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinUsages import org.jetbrains.kotlin.gradle.plugin.mpp.configureSourcesPublicationAttributes import org.jetbrains.kotlin.gradle.plugin.usesPlatformOf import org.jetbrains.kotlin.gradle.tasks.locateOrRegisterTask +import org.jetbrains.kotlin.gradle.utils.* import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName -import org.jetbrains.kotlin.gradle.utils.markConsumable import org.jetbrains.kotlin.gradle.utils.named import org.jetbrains.kotlin.gradle.utils.newInstance @@ -39,18 +39,21 @@ import org.jetbrains.kotlin.gradle.utils.newInstance fun KotlinMultiplatformExtension.createExternalKotlinTarget( descriptor: ExternalKotlinTargetDescriptor, ): T { - val apiElementsConfiguration = project.configurations.maybeCreate(lowerCamelCaseName(descriptor.targetName, "apiElements")) - val runtimeElementsConfiguration = project.configurations.maybeCreate(lowerCamelCaseName(descriptor.targetName, "runtimeElements")) - val sourcesElementsConfiguration = project.configurations.maybeCreate(lowerCamelCaseName(descriptor.targetName, "sourcesElements")) + val apiElementsConfiguration = project.configurations + .maybeCreateConsumable(lowerCamelCaseName(descriptor.targetName, "apiElements")) + val runtimeElementsConfiguration = project.configurations + .maybeCreateConsumable(lowerCamelCaseName(descriptor.targetName, "runtimeElements")) + val sourcesElementsConfiguration = project.configurations + .maybeCreateConsumable(lowerCamelCaseName(descriptor.targetName, "sourcesElements")) - val apiElementsPublishedConfiguration = - project.configurations.maybeCreate(lowerCamelCaseName(descriptor.targetName, "apiElements-published")) + val apiElementsPublishedConfiguration = project.configurations + .maybeCreateConsumable(lowerCamelCaseName(descriptor.targetName, "apiElements-published")) - val runtimeElementsPublishedConfiguration = - project.configurations.maybeCreate(lowerCamelCaseName(descriptor.targetName, "runtimeElements-published")) + val runtimeElementsPublishedConfiguration = project.configurations + .maybeCreateConsumable(lowerCamelCaseName(descriptor.targetName, "runtimeElements-published")) - val sourcesElementsPublishedConfiguration = - project.configurations.maybeCreate(lowerCamelCaseName(descriptor.targetName, "sourcesElements-published")) + val sourcesElementsPublishedConfiguration = project.configurations + .maybeCreateConsumable(lowerCamelCaseName(descriptor.targetName, "sourcesElements-published")) val kotlinTargetComponent = ExternalKotlinTargetComponent( ExternalKotlinTargetComponent.TargetProvider.byTargetName(this, descriptor.targetName) @@ -91,17 +94,6 @@ fun KotlinMultiplatformExtension.createExter target.setupRuntimeElements(runtimeElementsPublishedConfiguration) target.setupSourcesElements(sourcesElementsConfiguration) target.setupSourcesElements(sourcesElementsPublishedConfiguration) - apiElementsConfiguration.markConsumable() - runtimeElementsConfiguration.markConsumable() - sourcesElementsConfiguration.markConsumable() - - /* Those configurations can not be resolved but also not consumed (not suitable for project to project dependencies) */ - apiElementsPublishedConfiguration.isCanBeConsumed = false - apiElementsPublishedConfiguration.isCanBeResolved = false - runtimeElementsPublishedConfiguration.isCanBeResolved = false - runtimeElementsPublishedConfiguration.isCanBeConsumed = false - sourcesElementsPublishedConfiguration.isCanBeConsumed = false - sourcesElementsPublishedConfiguration.isCanBeResolved = false val decorated = descriptor.targetFactory.create(DecoratedExternalKotlinTarget.Delegate(target)) target.onCreated() diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/resolvableMetadataConfiguration.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/resolvableMetadataConfiguration.kt index 308696b4cca..a88e2e96e92 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/resolvableMetadataConfiguration.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/resolvableMetadataConfiguration.kt @@ -19,10 +19,8 @@ import org.jetbrains.kotlin.gradle.plugin.sources.disambiguateName import org.jetbrains.kotlin.gradle.plugin.usageByName import org.jetbrains.kotlin.gradle.plugin.usesPlatformOf import org.jetbrains.kotlin.gradle.utils.* -import org.jetbrains.kotlin.gradle.utils.getOrCreate import org.jetbrains.kotlin.gradle.utils.listProperty import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName -import org.jetbrains.kotlin.gradle.utils.markResolvable /** * @see resolvableMetadataConfiguration @@ -37,8 +35,7 @@ internal val InternalKotlinSourceSet.resolvableMetadataConfigurationName: String */ internal val InternalKotlinSourceSet.resolvableMetadataConfiguration: Configuration by extrasStoredProperty { assert(resolvableMetadataConfigurationName !in project.configurations.names) - val configuration = project.configurations.maybeCreate(resolvableMetadataConfigurationName) - configuration.markResolvable() + val configuration = project.configurations.maybeCreateResolvable(resolvableMetadataConfigurationName) withDependsOnClosure.forAll { sourceSet -> configuration.extendsFrom(project.configurations.getByName(sourceSet.apiConfigurationName)) @@ -96,18 +93,18 @@ private fun InternalKotlinSourceSet.configureMetadataDependenciesConfigurations( * the [InternalKotlinSourceSet.resolvableMetadataConfiguration] */ private val Project.allCompileMetadataConfiguration - get(): Configuration = configurations.getOrCreate("allSourceSetsCompileDependenciesMetadata", invokeWhenCreated = { configuration -> - configuration.markResolvable() - configuration.usesPlatformOf(multiplatformExtension.metadata()) - configuration.attributes.attribute(Usage.USAGE_ATTRIBUTE, project.usageByName(KotlinUsages.KOTLIN_METADATA)) - configuration.attributes.attribute(Category.CATEGORY_ATTRIBUTE, project.categoryByName(Category.LIBRARY)) + get(): Configuration = configurations.findResolvable("allSourceSetsCompileDependenciesMetadata") + ?: configurations.createResolvable("allSourceSetsCompileDependenciesMetadata").also { configuration -> + configuration.usesPlatformOf(multiplatformExtension.metadata()) + configuration.attributes.attribute(Usage.USAGE_ATTRIBUTE, project.usageByName(KotlinUsages.KOTLIN_METADATA)) + configuration.attributes.attribute(Category.CATEGORY_ATTRIBUTE, project.categoryByName(Category.LIBRARY)) - kotlinExtension.sourceSets.all { sourceSet -> - configuration.extendsFrom(configurations.getByName(sourceSet.apiConfigurationName)) - configuration.extendsFrom(configurations.getByName(sourceSet.implementationConfigurationName)) - configuration.extendsFrom(configurations.getByName(sourceSet.compileOnlyConfigurationName)) + kotlinExtension.sourceSets.all { sourceSet -> + configuration.extendsFrom(configurations.getByName(sourceSet.apiConfigurationName)) + configuration.extendsFrom(configurations.getByName(sourceSet.implementationConfigurationName)) + configuration.extendsFrom(configurations.getByName(sourceSet.compileOnlyConfigurationName)) + } } - }) private inline fun Project.listProvider(noinline provider: () -> List): Provider> { return project.objects.listProperty().apply { diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/sources/KotlinSourceSetFactory.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/sources/KotlinSourceSetFactory.kt index a3cbf2d273b..1bd1aaba735 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/sources/KotlinSourceSetFactory.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/sources/KotlinSourceSetFactory.kt @@ -12,7 +12,8 @@ import org.gradle.api.attributes.Usage import org.jetbrains.kotlin.gradle.plugin.* import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinUsages import org.jetbrains.kotlin.gradle.targets.metadata.isKotlinGranularMetadataEnabled -import org.jetbrains.kotlin.gradle.utils.getOrCreate +import org.jetbrains.kotlin.gradle.utils.maybeCreateDependencyScope +import org.jetbrains.kotlin.gradle.utils.maybeCreateResolvable import java.io.File internal abstract class KotlinSourceSetFactory internal constructor( @@ -42,11 +43,10 @@ internal abstract class KotlinSourceSetFactory internal con ) } configurationNames.forEach { configurationName -> - maybeCreate(configurationName).apply { - if (!configurationName.endsWith(METADATA_CONFIGURATION_NAME_SUFFIX)) { - isCanBeResolved = false - } - isCanBeConsumed = false + if (!configurationName.endsWith(METADATA_CONFIGURATION_NAME_SUFFIX)) { + maybeCreateDependencyScope(configurationName) + } else { + maybeCreateResolvable(configurationName) } } } @@ -87,15 +87,14 @@ internal class DefaultKotlinSourceSetFactory( } dependencyConfigurationWithMetadata.forEach { (configurationName, metadataName) -> - project.configurations.getOrCreate(metadataName).apply { + project.configurations.maybeCreateResolvable(metadataName).apply { attributes.attribute(KotlinPlatformType.attribute, KotlinPlatformType.common) attributes.attribute(Usage.USAGE_ATTRIBUTE, project.usageByName(KotlinUsages.KOTLIN_API)) attributes.attribute(Category.CATEGORY_ATTRIBUTE, project.categoryByName(Category.LIBRARY)) isVisible = false - isCanBeConsumed = false if (configurationName != null) { - extendsFrom(project.configurations.maybeCreate(configurationName)) + extendsFrom(project.configurations.maybeCreateDependencyScope(configurationName)) } if (project.isKotlinGranularMetadataEnabled) { diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/scripting/internal/ScriptingGradleSubplugin.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/scripting/internal/ScriptingGradleSubplugin.kt index 44507a65f58..10e93b68107 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/scripting/internal/ScriptingGradleSubplugin.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/scripting/internal/ScriptingGradleSubplugin.kt @@ -31,6 +31,8 @@ import org.jetbrains.kotlin.gradle.plugin.internal.JavaSourceSetsAccessor import org.jetbrains.kotlin.gradle.plugin.mpp.AbstractKotlinNativeCompilation import org.jetbrains.kotlin.gradle.scripting.ScriptingExtension import org.jetbrains.kotlin.gradle.tasks.KotlinCompile +import org.jetbrains.kotlin.gradle.utils.maybeCreateDependencyScope +import org.jetbrains.kotlin.gradle.utils.maybeCreateResolvable import org.jetbrains.kotlin.util.capitalizeDecapitalize.capitalizeAsciiOnly private const val SCRIPTING_LOG_PREFIX = "kotlin scripting plugin:" @@ -41,9 +43,8 @@ class ScriptingGradleSubplugin : Plugin { const val MISCONFIGURATION_MESSAGE_SUFFIX = "the plugin is probably applied by a mistake" fun configureForSourceSet(project: Project, sourceSetName: String) { - val discoveryConfiguration = project.configurations.maybeCreate(getDiscoveryClasspathConfigurationName(sourceSetName)).apply { + val discoveryConfiguration = project.configurations.maybeCreateDependencyScope(getDiscoveryClasspathConfigurationName(sourceSetName)).apply { isVisible = false - isCanBeConsumed = false description = "Script filename extensions discovery classpath configuration" } project.logger.info("$SCRIPTING_LOG_PREFIX created the scripting discovery configuration: ${discoveryConfiguration.name}") @@ -111,9 +112,7 @@ private fun configureDiscoveryTransformation( discoveryConfiguration: Configuration, discoveryResultsConfigurationName: String ) { - project.configurations.maybeCreate(discoveryResultsConfigurationName).apply { - isCanBeConsumed = false - isCanBeResolved = true + project.configurations.maybeCreateResolvable(discoveryResultsConfigurationName).apply { attributes.attribute(artifactType, scriptFilesExtensions) extendsFrom(discoveryConfiguration) } diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/CreateTargetConfigurationsSideEffect.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/CreateTargetConfigurationsSideEffect.kt index 436c90f3dc1..c53bbab26b8 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/CreateTargetConfigurationsSideEffect.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/CreateTargetConfigurationsSideEffect.kt @@ -15,6 +15,8 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.configureSourcesPublicationAttribu import org.jetbrains.kotlin.gradle.plugin.mpp.internal import org.jetbrains.kotlin.gradle.plugin.mpp.isSourcesPublishableFuture import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrTarget +import org.jetbrains.kotlin.gradle.utils.maybeCreateConsumable +import org.jetbrains.kotlin.gradle.utils.maybeCreateDependencyScope internal val CreateTargetConfigurationsSideEffect = KotlinTargetSideEffect { target -> val project = target.project @@ -24,21 +26,19 @@ internal val CreateTargetConfigurationsSideEffect = KotlinTargetSideEffect { tar val mainCompilation = target.compilations.maybeCreate(KotlinCompilation.MAIN_COMPILATION_NAME) val compileConfiguration = mainCompilation.internal.configurations.deprecatedCompileConfiguration - val implementationConfiguration = configurations.maybeCreate(mainCompilation.implementationConfigurationName) + val implementationConfiguration = configurations.maybeCreateDependencyScope(mainCompilation.implementationConfigurationName) val runtimeOnlyConfiguration = when (mainCompilation) { - is KotlinCompilationToRunnableFiles<*> -> configurations.maybeCreate(mainCompilation.runtimeOnlyConfigurationName) + is KotlinCompilationToRunnableFiles<*> -> configurations.maybeCreateDependencyScope(mainCompilation.runtimeOnlyConfigurationName) else -> null } - configurations.maybeCreate(target.apiElementsConfigurationName).apply { + configurations.maybeCreateConsumable(target.apiElementsConfigurationName).apply { description = "API elements for main." isVisible = false - isCanBeResolved = false - isCanBeConsumed = true attributes.attribute(Usage.USAGE_ATTRIBUTE, KotlinUsages.producerApiUsage(target)) attributes.attribute(Category.CATEGORY_ATTRIBUTE, project.categoryByName(Category.LIBRARY)) - extendsFrom(configurations.maybeCreate(mainCompilation.apiConfigurationName)) + extendsFrom(configurations.maybeCreateDependencyScope(mainCompilation.apiConfigurationName)) if (mainCompilation is KotlinCompilationToRunnableFiles) { val runtimeConfiguration = mainCompilation.internal.configurations.deprecatedRuntimeConfiguration runtimeConfiguration?.let { extendsFrom(it) } @@ -47,11 +47,9 @@ internal val CreateTargetConfigurationsSideEffect = KotlinTargetSideEffect { tar } if (mainCompilation is KotlinCompilationToRunnableFiles<*>) { - configurations.maybeCreate(target.runtimeElementsConfigurationName).apply { + configurations.maybeCreateConsumable(target.runtimeElementsConfigurationName).apply { description = "Elements of runtime for main." isVisible = false - isCanBeConsumed = true - isCanBeResolved = false attributes.attribute(Usage.USAGE_ATTRIBUTE, KotlinUsages.producerRuntimeUsage(target)) attributes.attribute(Category.CATEGORY_ATTRIBUTE, project.categoryByName(Category.LIBRARY)) val runtimeConfiguration = mainCompilation.internal.configurations.deprecatedRuntimeConfiguration @@ -63,11 +61,9 @@ internal val CreateTargetConfigurationsSideEffect = KotlinTargetSideEffect { tar } } - configurations.maybeCreate(target.sourcesElementsConfigurationName).apply { + configurations.maybeCreateConsumable(target.sourcesElementsConfigurationName).apply { description = "Source files of main compilation of ${target.name}." isVisible = false - isCanBeResolved = false - isCanBeConsumed = true configureSourcesPublicationAttributes(target) project.launch { isCanBeConsumed = target.internal.isSourcesPublishableFuture.await() } } @@ -75,9 +71,9 @@ internal val CreateTargetConfigurationsSideEffect = KotlinTargetSideEffect { tar if (target !is KotlinMetadataTarget) { val testCompilation = target.compilations.getByName(KotlinCompilation.TEST_COMPILATION_NAME) val compileTestsConfiguration = testCompilation.internal.configurations.deprecatedCompileConfiguration - val testImplementationConfiguration = configurations.maybeCreate(testCompilation.implementationConfigurationName) + val testImplementationConfiguration = configurations.maybeCreateDependencyScope(testCompilation.implementationConfigurationName) val testRuntimeOnlyConfiguration = when (testCompilation) { - is KotlinCompilationToRunnableFiles<*> -> configurations.maybeCreate(testCompilation.runtimeOnlyConfigurationName) + is KotlinCompilationToRunnableFiles<*> -> configurations.maybeCreateDependencyScope(testCompilation.runtimeOnlyConfigurationName) else -> null } @@ -93,13 +89,11 @@ internal val CreateTargetConfigurationsSideEffect = KotlinTargetSideEffect { tar } if (target is KotlinJsIrTarget && !target.isMpp!!) { - target.project.configurations.maybeCreate( + target.project.configurations.maybeCreateConsumable( target.commonFakeApiElementsConfigurationName ).apply { description = "Common Fake API elements for main." isVisible = false - isCanBeResolved = false - isCanBeConsumed = true attributes.attribute(Usage.USAGE_ATTRIBUTE, KotlinUsages.producerApiUsage(target)) attributes.attribute(KotlinPlatformType.attribute, KotlinPlatformType.common) } diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/android/KotlinAndroidTarget.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/android/KotlinAndroidTarget.kt index d39aae182d7..21d58c6e141 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/android/KotlinAndroidTarget.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/android/KotlinAndroidTarget.kt @@ -221,10 +221,7 @@ abstract class KotlinAndroidTarget @Inject constructor( val outputTaskOrProvider = getLibraryOutputTask(variant) ?: return emptySet() val artifact = run { val archivesConfigurationName = lowerCamelCaseName(targetName, variantName, "archives") - project.configurations.maybeCreate(archivesConfigurationName).apply { - isCanBeConsumed = false - isCanBeResolved = false - } + project.configurations.maybeCreateDependencyScope(archivesConfigurationName) project.artifacts.add(archivesConfigurationName, outputTaskOrProvider) { artifact -> artifact.classifier = artifactClassifier } @@ -294,12 +291,11 @@ abstract class KotlinAndroidTarget @Inject constructor( val existingConfiguration = project.configurations.findByName(sourcesElementsConfigurationName) if (existingConfiguration != null) return existingConfiguration - val apiElementsConfiguration = project.configurations.getByName(apiElementsConfigurationName) - return project.configurations.create(sourcesElementsConfigurationName).apply { + val apiElementsConfiguration = project.configurations.findConsumable(apiElementsConfigurationName) + ?: error("Configuration $apiElementsConfigurationName was not found") + return project.configurations.createConsumable(sourcesElementsConfigurationName).apply { description = "Source files of Android ${variantName}." isVisible = false - isCanBeResolved = false - isCanBeConsumed = true copyAttributes(apiElementsConfiguration.attributes, attributes) configureSourcesPublicationAttributes(this@KotlinAndroidTarget) diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsPlugin.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsPlugin.kt index 7f759baaadc..9a36a4d181b 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsPlugin.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsPlugin.kt @@ -71,7 +71,7 @@ open class KotlinJsPlugin: Plugin { API, RUNTIME_ONLY ).forEach { baseConfigurationName -> - configurations.maybeCreate( + configurations.maybeCreateDependencyScope( lowerCamelCaseName( baseCompilationName, baseConfigurationName diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/nodejs/NodeJsRootPlugin.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/nodejs/NodeJsRootPlugin.kt index c7778e73357..7f64caff35a 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/nodejs/NodeJsRootPlugin.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/nodejs/NodeJsRootPlugin.kt @@ -50,7 +50,6 @@ open class NodeJsRootPlugin : Plugin { it.description = "Download and install a local node/npm version" it.configuration = project.provider { project.configurations.detachedConfiguration(project.dependencies.create(it.ivyDependency)) - .markResolvable() .also { conf -> conf.isTransitive = false } } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolver/KotlinCompilationNpmResolver.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolver/KotlinCompilationNpmResolver.kt index 253dfcbee1e..f1404968132 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolver/KotlinCompilationNpmResolver.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolver/KotlinCompilationNpmResolver.kt @@ -32,9 +32,8 @@ import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin.Companion. import org.jetbrains.kotlin.gradle.targets.js.npm.* import org.jetbrains.kotlin.gradle.targets.js.npm.tasks.KotlinPackageJsonTask import org.jetbrains.kotlin.gradle.tasks.registerTask -import org.jetbrains.kotlin.gradle.utils.CompositeProjectComponentArtifactMetadata -import org.jetbrains.kotlin.gradle.utils.`is` -import org.jetbrains.kotlin.gradle.utils.topRealPath +import org.jetbrains.kotlin.gradle.utils.* +import org.jetbrains.kotlin.gradle.utils.createResolvable import java.io.Serializable /** @@ -133,15 +132,13 @@ class KotlinCompilationNpmResolver( } private fun createAggregatedConfiguration(): Configuration { - val all = project.configurations.create(compilation.npmAggregatedConfigurationName) + val all = project.configurations.createResolvable(compilation.npmAggregatedConfigurationName) all.usesPlatformOf(target) all.attributes.attribute(Usage.USAGE_ATTRIBUTE, KotlinUsages.consumerRuntimeUsage(target)) all.attributes.attribute(Category.CATEGORY_ATTRIBUTE, project.categoryByName(Category.LIBRARY)) all.attributes.attribute(publicPackageJsonAttribute, PUBLIC_PACKAGE_JSON_ATTR_VALUE) all.isVisible = false - all.isCanBeConsumed = false - all.isCanBeResolved = true all.description = "NPM configuration for $compilation." KotlinDependencyScope.values().forEach { scope -> @@ -163,15 +160,13 @@ class KotlinCompilationNpmResolver( } private fun createPublicPackageJsonConfiguration(): Configuration { - val all = project.configurations.create(compilation.publicPackageJsonConfigurationName) + val all = project.configurations.createConsumable(compilation.publicPackageJsonConfigurationName) all.usesPlatformOf(target) all.attributes.attribute(Usage.USAGE_ATTRIBUTE, KotlinUsages.consumerRuntimeUsage(target)) all.attributes.attribute(Category.CATEGORY_ATTRIBUTE, project.categoryByName(Category.LIBRARY)) all.attributes.attribute(publicPackageJsonAttribute, PUBLIC_PACKAGE_JSON_ATTR_VALUE) all.isVisible = false - all.isCanBeConsumed = true - all.isCanBeResolved = false return all } diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/yarn/YarnPlugin.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/yarn/YarnPlugin.kt index fdef6820980..87b98544805 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/yarn/YarnPlugin.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/yarn/YarnPlugin.kt @@ -21,7 +21,7 @@ import org.jetbrains.kotlin.gradle.targets.js.yarn.YarnLockCopyTask.Companion.ST import org.jetbrains.kotlin.gradle.targets.js.yarn.YarnLockCopyTask.Companion.UPGRADE_YARN_LOCK import org.jetbrains.kotlin.gradle.tasks.CleanDataTask import org.jetbrains.kotlin.gradle.tasks.registerTask -import org.jetbrains.kotlin.gradle.utils.markResolvable +import org.jetbrains.kotlin.gradle.utils.detachedResolvable import org.jetbrains.kotlin.gradle.utils.onlyIfCompat open class YarnPlugin : Plugin { @@ -47,8 +47,7 @@ open class YarnPlugin : Plugin { it.description = "Download and install a local yarn version" it.configuration = provider { - this.project.configurations.detachedConfiguration(this.project.dependencies.create(it.ivyDependency)) - .markResolvable() + this.project.configurations.detachedResolvable(this.project.dependencies.create(it.ivyDependency)) .also { conf -> conf.isTransitive = false } } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/jvm/KotlinJvmWithJavaTargetPreset.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/jvm/KotlinJvmWithJavaTargetPreset.kt index 15b303f6fd4..bd53bc37d90 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/jvm/KotlinJvmWithJavaTargetPreset.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/jvm/KotlinJvmWithJavaTargetPreset.kt @@ -18,6 +18,7 @@ import org.jetbrains.kotlin.gradle.plugin.diagnostics.reportDiagnostic import org.jetbrains.kotlin.gradle.targets.android.internal.InternalKotlinTargetPreset import org.jetbrains.kotlin.gradle.tasks.KotlinTasksProvider import org.jetbrains.kotlin.gradle.utils.configureExperimentalTryNext +import org.jetbrains.kotlin.gradle.utils.maybeCreateResolvable @DeprecatedTargetPresetApi class KotlinJvmWithJavaTargetPreset( @@ -71,12 +72,12 @@ class KotlinJvmWithJavaTargetPreset( compileDependencyFiles = project.files( main.output.allOutputs, - project.configurations.maybeCreate(compileDependencyConfigurationName) + project.configurations.maybeCreateResolvable(compileDependencyConfigurationName) ) runtimeDependencyFiles = project.files( output.allOutputs, main.output.allOutputs, - project.configurations.maybeCreate(runtimeDependencyConfigurationName) + project.configurations.maybeCreateResolvable(runtimeDependencyConfigurationName) ) } diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/ConfigureFrameworkExportSideEffect.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/ConfigureFrameworkExportSideEffect.kt index 07b39260c62..abc51ad6b5c 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/ConfigureFrameworkExportSideEffect.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/ConfigureFrameworkExportSideEffect.kt @@ -13,6 +13,7 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinUsages import org.jetbrains.kotlin.gradle.plugin.usesPlatformOf import org.jetbrains.kotlin.gradle.targets.KotlinTargetSideEffect +import org.jetbrains.kotlin.gradle.utils.maybeCreateResolvable internal val ConfigureFrameworkExportSideEffect = KotlinTargetSideEffect { target -> val project = target.project @@ -30,11 +31,9 @@ internal val ConfigureFrameworkExportSideEffect = KotlinTargetSideEffect - project.configurations.maybeCreate(framework.exportConfigurationName).apply { + project.configurations.maybeCreateResolvable(framework.exportConfigurationName).apply { isVisible = false isTransitive = false - isCanBeConsumed = false - isCanBeResolved = true usesPlatformOf(target) attributes.attribute(Usage.USAGE_ATTRIBUTE, KotlinUsages.consumerApiUsage(target)) attributes.attribute(Category.CATEGORY_ATTRIBUTE, project.categoryByName(Category.LIBRARY)) diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/NativeBinaries.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/NativeBinaries.kt index 73d6a51e2e4..29a9b9c2fb5 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/NativeBinaries.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/NativeBinaries.kt @@ -20,6 +20,7 @@ import org.gradle.api.tasks.TaskProvider import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi import org.jetbrains.kotlin.gradle.tasks.KotlinNativeLink import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName +import org.jetbrains.kotlin.gradle.utils.maybeCreateResolvable import org.jetbrains.kotlin.konan.target.KonanTarget import org.jetbrains.kotlin.util.capitalizeDecapitalize.toUpperCaseAsciiOnly import java.io.File @@ -213,9 +214,9 @@ abstract class AbstractNativeLibrary( */ @ExperimentalKotlinGradlePluginApi var transitiveExport: Boolean - get() = project.configurations.maybeCreate(exportConfigurationName).isTransitive + get() = project.configurations.maybeCreateResolvable(exportConfigurationName).isTransitive set(value) { - project.configurations.maybeCreate(exportConfigurationName).isTransitive = value + project.configurations.maybeCreateResolvable(exportConfigurationName).isTransitive = value } /** diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/NativeCompilerDownloader.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/NativeCompilerDownloader.kt index 7eb16a2b472..d9726f167ae 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/NativeCompilerDownloader.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/NativeCompilerDownloader.kt @@ -148,8 +148,7 @@ class NativeCompilerDownloader( ) } - val configuration = project.configurations.detachedConfiguration(compilerDependency) - .markResolvable() + val configuration = project.configurations.detachedResolvable(compilerDependency) logger.lifecycle("\nPlease wait while Kotlin/Native compiler $compilerVersion is being installed.") if (!kotlinProperties.nativeDownloadFromMaven) { diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/configureBinaryFrameworks.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/configureBinaryFrameworks.kt index 6e5174c0ad8..33569cc07be 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/configureBinaryFrameworks.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/configureBinaryFrameworks.kt @@ -20,10 +20,9 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget import org.jetbrains.kotlin.gradle.plugin.mpp.NativeBuildType import org.jetbrains.kotlin.gradle.tasks.FatFrameworkTask import org.jetbrains.kotlin.gradle.tasks.KotlinNativeLink +import org.jetbrains.kotlin.gradle.utils.* import org.jetbrains.kotlin.gradle.utils.copyAttributes -import org.jetbrains.kotlin.gradle.utils.getOrCreate import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName -import org.jetbrains.kotlin.gradle.utils.markConsumable import org.jetbrains.kotlin.util.capitalizeDecapitalize.capitalizeAsciiOnly import org.jetbrains.kotlin.util.capitalizeDecapitalize.toLowerCaseAsciiOnly import java.io.File @@ -47,13 +46,13 @@ private val Framework.frameworkGroupDescription ) internal fun Project.createFrameworkArtifact(binaryFramework: Framework, linkTask: TaskProvider) { - val frameworkConfiguration = configurations.getOrCreate(binaryFramework.binaryFrameworkConfigurationName, invokeWhenCreated = { - it.markConsumable() - it.applyBinaryFrameworkGroupAttributes(project, binaryFramework.frameworkGroupDescription, listOf(binaryFramework.target)) - project.launchInStage(KotlinPluginLifecycle.Stage.FinaliseDsl) { - copyAttributes(binaryFramework.attributes, it.attributes) + val frameworkConfiguration = configurations.findConsumable(binaryFramework.binaryFrameworkConfigurationName) + ?: configurations.createConsumable(binaryFramework.binaryFrameworkConfigurationName).also { + it.applyBinaryFrameworkGroupAttributes(project, binaryFramework.frameworkGroupDescription, listOf(binaryFramework.target)) + project.launchInStage(KotlinPluginLifecycle.Stage.FinaliseDsl) { + copyAttributes(binaryFramework.attributes, it.attributes) + } } - }) // Can't use flatMap here because of https://github.com/gradle/gradle/issues/25645 val linkTaskOutputProvider = linkTask.map { it.outputFile.get() } @@ -125,10 +124,9 @@ private fun Project.createFatFramework(groupDescription: FrameworkGroupDescripti } } - val fatFrameworkConfiguration = project.configurations.getOrCreate(fatFrameworkConfigurationName, invokeWhenCreated = { - it.markConsumable() + val fatFrameworkConfiguration = project.configurations.maybeCreateConsumable(fatFrameworkConfigurationName).also { it.applyBinaryFrameworkGroupAttributes(project, groupDescription, targets = frameworks.map(Framework::target)) - }) + } addFrameworkArtifact(fatFrameworkConfiguration, fatFrameworkTask.map { it.fatFramework }) } \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/CInteropCommonizerConfigurations.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/CInteropCommonizerConfigurations.kt index fa7c85bfc62..e60acbec69f 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/CInteropCommonizerConfigurations.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/CInteropCommonizerConfigurations.kt @@ -21,8 +21,8 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.resolvableMetadataConfiguration import org.jetbrains.kotlin.gradle.plugin.sources.internal import org.jetbrains.kotlin.gradle.targets.metadata.awaitMetadataCompilationsCreated import org.jetbrains.kotlin.gradle.targets.metadata.findMetadataCompilation -import org.jetbrains.kotlin.gradle.utils.markConsumable -import org.jetbrains.kotlin.gradle.utils.markResolvable +import org.jetbrains.kotlin.gradle.utils.createConsumable +import org.jetbrains.kotlin.gradle.utils.createResolvable import org.jetbrains.kotlin.tooling.core.UnsafeApi /* Elements configuration */ @@ -64,8 +64,7 @@ internal fun Project.locateOrCreateCommonizedCInteropApiElementsConfiguration(co val configurationName = commonizerTarget.identityString + "CInteropApiElements" configurations.findByName(configurationName)?.let { return it } - return configurations.create(configurationName) { configuration -> - configuration.markConsumable() + return configurations.createConsumable(configurationName).also { configuration -> setupBasicCommonizedCInteropConfigurationAttributes(configuration, commonizerTarget) launch { @@ -102,9 +101,8 @@ internal suspend fun Project.locateOrCreateCommonizedCInteropDependencyConfigura val configurationName = sourceSet.name + "CInterop" configurations.findByName(configurationName)?.let { return it } - val configuration = configurations.create(configurationName) { configuration -> + val configuration = configurations.createResolvable(configurationName).also { configuration -> configuration.isVisible = false - configuration.markResolvable() // Extends from Metadata Configuration associated with given source set to ensure matching configuration.extendsFrom(sourceSet.internal.resolvableMetadataConfiguration) 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 e8b5271580a..2c041e1d23d 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 @@ -21,8 +21,10 @@ import org.jetbrains.kotlin.gradle.plugin.usesPlatformOf import org.jetbrains.kotlin.gradle.targets.KotlinTargetSideEffect import org.jetbrains.kotlin.gradle.targets.native.internal.CInteropKlibLibraryElements.cinteropKlibLibraryElements import org.jetbrains.kotlin.gradle.tasks.CInteropProcess +import org.jetbrains.kotlin.gradle.utils.* import org.jetbrains.kotlin.gradle.utils.copyAttributes -import org.jetbrains.kotlin.gradle.utils.markResolvable +import org.jetbrains.kotlin.gradle.utils.createConsumable +import org.jetbrains.kotlin.gradle.utils.findConsumable internal fun createCInteropApiElementsKlibArtifact( target: KotlinNativeTarget, @@ -43,15 +45,14 @@ internal fun createCInteropApiElementsKlibArtifact( internal fun Project.locateOrCreateCInteropDependencyConfiguration( compilation: KotlinNativeCompilation, ): Configuration { - configurations.findByName(compilation.cInteropDependencyConfigurationName)?.let { return it } + configurations.findResolvable(compilation.cInteropDependencyConfigurationName)?.let { return it } val compileOnlyConfiguration = configurations.getByName(compilation.compileOnlyConfigurationName) val implementationConfiguration = configurations.getByName(compilation.implementationConfigurationName) - return configurations.create(compilation.cInteropDependencyConfigurationName).apply { + return configurations.createResolvable(compilation.cInteropDependencyConfigurationName).apply { extendsFrom(compileOnlyConfiguration, implementationConfiguration) isVisible = false - markResolvable() /* Deferring attributes to wait for compilation.attributes to be configured by user*/ launchInStage(AfterFinaliseDsl) { @@ -74,12 +75,9 @@ internal val SetupCInteropApiElementsConfigurationSideEffect = KotlinTargetSideE internal fun Project.locateOrCreateCInteropApiElementsConfiguration(target: KotlinTarget): Configuration { val configurationName = cInteropApiElementsConfigurationName(target) - configurations.findByName(configurationName)?.let { return it } - - return configurations.create(configurationName).apply { - isCanBeResolved = false - isCanBeConsumed = true + configurations.findConsumable(configurationName)?.let { return it } + return configurations.createConsumable(configurationName).apply { /* Deferring attributes to wait for target.attributes to be configured by user */ launchInStage(AfterFinaliseDsl) { usesPlatformOf(target) diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/artifact/KotlinArtifact.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/artifact/KotlinArtifact.kt index 62048618760..65f7132eede 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/artifact/KotlinArtifact.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/artifact/KotlinArtifact.kt @@ -14,6 +14,7 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinUsages import org.jetbrains.kotlin.gradle.plugin.mpp.NativeBuildType import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName +import org.jetbrains.kotlin.gradle.utils.maybeCreateResolvable import org.jetbrains.kotlin.konan.target.KonanTarget import org.jetbrains.kotlin.konan.target.presetName @@ -72,10 +73,8 @@ abstract class KotlinNativeArtifactConfigImpl(artifactName: String) : KotlinArti internal fun Project.registerLibsDependencies(target: KonanTarget, artifactName: String, deps: Set): String { val librariesConfigurationName = lowerCamelCaseName(target.presetName, artifactName, "linkLibrary") - configurations.maybeCreate(librariesConfigurationName).apply { + configurations.maybeCreateResolvable(librariesConfigurationName).apply { isVisible = false - isCanBeConsumed = false - isCanBeResolved = true isTransitive = true attributes.attribute(KotlinPlatformType.attribute, KotlinPlatformType.native) attributes.attribute(KotlinNativeTarget.konanTargetAttribute, target.name) @@ -87,10 +86,8 @@ internal fun Project.registerLibsDependencies(target: KonanTarget, artifactName: internal fun Project.registerExportDependencies(target: KonanTarget, artifactName: String, deps: Set): String { val exportConfigurationName = lowerCamelCaseName(target.presetName, artifactName, "linkExport") - configurations.maybeCreate(exportConfigurationName).apply { + configurations.maybeCreateResolvable(exportConfigurationName).apply { isVisible = false - isCanBeConsumed = false - isCanBeResolved = true isTransitive = false attributes.attribute(KotlinPlatformType.attribute, KotlinPlatformType.native) attributes.attribute(KotlinNativeTarget.konanTargetAttribute, target.name) diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/configuration/KaptConfig.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/configuration/KaptConfig.kt index 85721310fe3..bb3d181e2a8 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/configuration/KaptConfig.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/configuration/KaptConfig.kt @@ -25,8 +25,10 @@ import org.jetbrains.kotlin.gradle.internal.kapt.incremental.StructureTransformA import org.jetbrains.kotlin.gradle.internal.kapt.incremental.StructureTransformLegacyAction import org.jetbrains.kotlin.gradle.plugin.* import org.jetbrains.kotlin.gradle.tasks.toCompilerPluginOptions +import org.jetbrains.kotlin.gradle.utils.* +import org.jetbrains.kotlin.gradle.utils.createDependencyScope +import org.jetbrains.kotlin.gradle.utils.detachedResolvable import org.jetbrains.kotlin.gradle.utils.listProperty -import org.jetbrains.kotlin.gradle.utils.markResolvable import java.io.File internal open class KaptConfig( @@ -91,7 +93,7 @@ internal open class KaptConfig( return if (project.isIncrementalKapt()) { maybeRegisterTransform(project) - val classStructureConfiguration = project.configurations.detachedConfiguration().markResolvable() + val classStructureConfiguration = project.configurations.detachedResolvable() // Wrap the `kotlinCompile.classpath` into a file collection, so that, if the classpath is represented by a configuration, // the configuration is not extended (via extendsFrom, which normally happens when one configuration is _added_ into another) @@ -196,8 +198,8 @@ internal class KaptWithoutKotlincConfig : KaptConfig { kaptGenerateStubsTask: TaskProvider, ext: KaptExtension ) : super(project, kaptGenerateStubsTask, ext) { - project.configurations.findByName(Kapt3GradleSubplugin.KAPT_WORKER_DEPENDENCIES_CONFIGURATION_NAME) - ?: project.configurations.create(Kapt3GradleSubplugin.KAPT_WORKER_DEPENDENCIES_CONFIGURATION_NAME).apply { + project.configurations.findResolvable(Kapt3GradleSubplugin.KAPT_WORKER_DEPENDENCIES_CONFIGURATION_NAME) + ?: project.configurations.createResolvable(Kapt3GradleSubplugin.KAPT_WORKER_DEPENDENCIES_CONFIGURATION_NAME).apply { dependencies.addAllLater(project.listProperty { val kaptDependency = "org.jetbrains.kotlin:kotlin-annotation-processing-gradle:${project.getKotlinPluginVersion()}" listOf( diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/configuration/KotlinCompileConfig.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/configuration/KotlinCompileConfig.kt index 55c510b7c24..4ae6302a426 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/configuration/KotlinCompileConfig.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/configuration/KotlinCompileConfig.kt @@ -32,7 +32,7 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinWithJavaCompilation import org.jetbrains.kotlin.gradle.plugin.tcs import org.jetbrains.kotlin.gradle.tasks.DefaultKotlinJavaToolchain import org.jetbrains.kotlin.gradle.tasks.KotlinCompile -import org.jetbrains.kotlin.gradle.utils.markResolvable +import org.jetbrains.kotlin.gradle.utils.detachedResolvable import org.jetbrains.kotlin.gradle.utils.providerWithLazyConvention internal typealias KotlinCompileConfig = BaseKotlinCompileConfig @@ -48,9 +48,9 @@ internal open class BaseKotlinCompileConfig : AbstractKotl registerTransformsOnce(project, jvmToolchain, runKotlinCompilerViaBuildToolsApi) // Note: Creating configurations should be done during build configuration, not task configuration, to avoid issues with // composite builds (e.g., https://issuetracker.google.com/183952598). - project.configurations.detachedConfiguration( + project.configurations.detachedResolvable( project.dependencies.create(objectFactory.fileCollection().from(project.provider { taskProvider.get().libraries })) - ).markResolvable() + ) } else null if (useClasspathSnapshot) { diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/utils/configurations.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/utils/configurations.kt index 005ba5fb1db..57aca5b4cf0 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/utils/configurations.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/utils/configurations.kt @@ -6,6 +6,8 @@ package org.jetbrains.kotlin.gradle.utils import org.gradle.api.artifacts.Configuration +import org.gradle.api.artifacts.ConfigurationContainer +import org.gradle.api.artifacts.Dependency const val COMPILE_ONLY = "compileOnly" const val COMPILE = "compile" @@ -15,12 +17,55 @@ const val RUNTIME_ONLY = "runtimeOnly" const val RUNTIME = "runtime" internal const val INTRANSITIVE = "intransitive" -internal fun Configuration.markConsumable(): Configuration = apply { - this.isCanBeConsumed = true - this.isCanBeResolved = false +internal fun ConfigurationContainer.createResolvable(name: String): Configuration = create(name).apply { + isCanBeConsumed = false } -internal fun Configuration.markResolvable(): Configuration = apply { - this.isCanBeConsumed = false - this.isCanBeResolved = true +internal fun ConfigurationContainer.findResolvable(name: String): Configuration? = findByName(name)?.apply { + if (isCanBeResolved && isCanBeConsumed) { + isCanBeConsumed = false + } else { + check(isCanBeResolved && !isCanBeConsumed) { "$this is not resolvable" } + } } + +internal fun ConfigurationContainer.maybeCreateResolvable(name: String): Configuration = + findResolvable(name) ?: createResolvable(name) + +internal fun ConfigurationContainer.detachedResolvable(vararg dependencies: Dependency) = + detachedConfiguration(*dependencies).apply { + isCanBeConsumed = false + } + +internal fun ConfigurationContainer.createConsumable(name: String): Configuration = create(name).apply { + isCanBeResolved = false +} + +internal fun ConfigurationContainer.findConsumable(name: String): Configuration? = findByName(name)?.apply { + if (isCanBeResolved && isCanBeConsumed) { + isCanBeResolved = false + } else { + check(!isCanBeResolved && isCanBeConsumed) { "$this is not consumable" } + } +} + +internal fun ConfigurationContainer.maybeCreateConsumable(name: String): Configuration = + findConsumable(name) ?: createConsumable(name) + +internal fun ConfigurationContainer.createDependencyScope(name: String) = create(name).apply { + isCanBeResolved = false + isCanBeConsumed = false +} + +internal fun ConfigurationContainer.findDependencyScope(name: String): Configuration? = findByName(name)?.apply { + if (isCanBeResolved && isCanBeConsumed) { + isCanBeConsumed = false + isCanBeResolved = false + } else { + check(!isCanBeResolved) { "$this is not dependency scope configuration but resolvable one" } + check(!isCanBeConsumed) { "$this is not dependency scope configuration but consumable one" } + } +} + +internal fun ConfigurationContainer.maybeCreateDependencyScope(name: String): Configuration = + findDependencyScope(name) ?: createDependencyScope(name) diff --git a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/unitTests/CInteropCommonizerArtifactTypeAttributeTest.kt b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/unitTests/CInteropCommonizerArtifactTypeAttributeTest.kt index 74113a699bb..df3f787b408 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/unitTests/CInteropCommonizerArtifactTypeAttributeTest.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/unitTests/CInteropCommonizerArtifactTypeAttributeTest.kt @@ -11,8 +11,8 @@ import org.gradle.api.attributes.Usage import org.gradle.kotlin.dsl.dependencies import org.jetbrains.kotlin.gradle.targets.native.internal.CInteropCommonizerArtifactTypeAttribute import org.jetbrains.kotlin.gradle.util.buildProjectWithMPP -import org.jetbrains.kotlin.gradle.utils.markConsumable -import org.jetbrains.kotlin.gradle.utils.markResolvable +import org.jetbrains.kotlin.gradle.utils.createConsumable +import org.jetbrains.kotlin.gradle.utils.createResolvable import org.jetbrains.kotlin.gradle.utils.named import kotlin.test.Test import kotlin.test.assertEquals @@ -33,8 +33,7 @@ class CInteropCommonizerArtifactTypeAttributeTest { ) /* Create consumable elements configuration */ - project.configurations.create("testElements") { configuration -> - configuration.markConsumable() + project.configurations.createConsumable("testElements").also { configuration -> configuration.attributes.attribute(Usage.USAGE_ATTRIBUTE, project.objects.named("test")) /* Add klibCollectionDir as artifact */ @@ -45,8 +44,7 @@ class CInteropCommonizerArtifactTypeAttributeTest { } /* Create resolvable configuration */ - val resolvable = project.configurations.create("testDependencies") { configuration -> - configuration.markResolvable() + val resolvable = project.configurations.createResolvable("testDependencies").also { configuration -> configuration.attributes.attribute(Usage.USAGE_ATTRIBUTE, project.objects.named("test")) configuration.attributes.attribute( CInteropCommonizerArtifactTypeAttribute.attribute, CInteropCommonizerArtifactTypeAttribute.KLIB diff --git a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/unitTests/CInteropCommonizerConfigurationTests.kt b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/unitTests/CInteropCommonizerConfigurationTests.kt index 417eba6eb52..258817e22fd 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/unitTests/CInteropCommonizerConfigurationTests.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/unitTests/CInteropCommonizerConfigurationTests.kt @@ -21,8 +21,8 @@ import org.jetbrains.kotlin.gradle.plugin.await import org.jetbrains.kotlin.gradle.targets.native.internal.CommonizerTargetAttribute import org.jetbrains.kotlin.gradle.targets.native.internal.locateOrCreateCommonizedCInteropDependencyConfiguration import org.jetbrains.kotlin.gradle.util.* -import org.jetbrains.kotlin.gradle.utils.markConsumable -import org.jetbrains.kotlin.gradle.utils.markResolvable +import org.jetbrains.kotlin.gradle.utils.createConsumable +import org.jetbrains.kotlin.gradle.utils.createResolvable import org.jetbrains.kotlin.konan.target.KonanTarget import org.jetbrains.kotlin.tooling.core.UnsafeApi import kotlin.test.Test @@ -35,8 +35,7 @@ class CInteropCommonizerConfigurationTests { fun `test - compatibility rule - superset is compatible`() { val project = buildProjectWithMPP() - val consumable = project.configurations.create("testElements") { configuration -> - configuration.markConsumable() + val consumable = project.configurations.createConsumable("testElements").also { configuration -> configuration.attributes.attribute( CommonizerTargetAttribute.attribute, CommonizerTarget( @@ -48,8 +47,7 @@ class CInteropCommonizerConfigurationTests { ) } - val resolvable = project.configurations.create("testDependencies") { configuration -> - configuration.markResolvable() + val resolvable = project.configurations.createResolvable("testDependencies").also { configuration -> configuration.attributes.attribute( CommonizerTargetAttribute.attribute, CommonizerTarget( @@ -74,8 +72,7 @@ class CInteropCommonizerConfigurationTests { fun `test - disambiguation rule - chooses most specific variant`() { val project = buildProjectWithMPP() - project.configurations.create("testConsumableAll") { configuration -> - configuration.markConsumable() + project.configurations.createConsumable("testConsumableAll").also { configuration -> configuration.attributes.attribute( CommonizerTargetAttribute.attribute, CommonizerTarget( @@ -90,8 +87,7 @@ class CInteropCommonizerConfigurationTests { } /* More specific as it does not offer macos parts */ - val consumableSpecific = project.configurations.create("testConsumableSpecific") { configuration -> - configuration.markConsumable() + val consumableSpecific = project.configurations.createConsumable("testConsumableSpecific").also { configuration -> configuration.attributes.attribute( CommonizerTargetAttribute.attribute, CommonizerTarget( @@ -103,8 +99,7 @@ class CInteropCommonizerConfigurationTests { ) } - val resolvable = project.configurations.create("testDependencies") { configuration -> - configuration.markResolvable() + val resolvable = project.configurations.createResolvable("testDependencies").also { configuration -> configuration.attributes.attribute( CommonizerTargetAttribute.attribute, CommonizerTarget(