diff --git a/libraries/tools/kotlin-gradle-plugin-api/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinSourceSet.kt b/libraries/tools/kotlin-gradle-plugin-api/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinSourceSet.kt index 3a84c1c764f..d7164e8b549 100644 --- a/libraries/tools/kotlin-gradle-plugin-api/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinSourceSet.kt +++ b/libraries/tools/kotlin-gradle-plugin-api/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinSourceSet.kt @@ -25,19 +25,18 @@ interface KotlinSourceSet : Named, HasKotlinDependencies { fun dependsOn(other: KotlinSourceSet) val dependsOn: Set + val metadataLibrariesConfigurationName: String + @Deprecated(message = "KT-55312") val apiMetadataConfigurationName: String + @Deprecated(message = "KT-55312") val implementationMetadataConfigurationName: String + @Deprecated(message = "KT-55312") val compileOnlyMetadataConfigurationName: String @Deprecated(message = "KT-55230: RuntimeOnly scope is not supported for metadata dependency transformation") val runtimeOnlyMetadataConfigurationName: String override val relatedConfigurationNames: List - get() = super.relatedConfigurationNames + - listOf( - apiMetadataConfigurationName, - implementationMetadataConfigurationName, - compileOnlyMetadataConfigurationName, - ) + get() = super.relatedConfigurationNames + metadataLibrariesConfigurationName companion object { const val COMMON_MAIN_SOURCE_SET_NAME = "commonMain" diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/internal/KotlinDependenciesManagement.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/internal/KotlinDependenciesManagement.kt index e06902f5af0..05a3ffb6fd9 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/internal/KotlinDependenciesManagement.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/internal/KotlinDependenciesManagement.kt @@ -86,8 +86,7 @@ private fun KotlinTarget.excludeStdlibAndKotlinTestCommonFromPlatformCompilation compilations.all { listOfNotNull( it.compileDependencyConfigurationName, - it.defaultSourceSet.apiMetadataConfigurationName, - it.defaultSourceSet.implementationMetadataConfigurationName, + it.defaultSourceSet.metadataLibrariesConfigurationName, (it as? KotlinCompilationToRunnableFiles<*>)?.runtimeDependencyConfigurationName, // Additional configurations for (old) jvmWithJava-preset. Remove it when we drop it completely diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/GranularMetadataTransformation.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/GranularMetadataTransformation.kt index f24ad18f265..d9fbcb2e3fa 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/GranularMetadataTransformation.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/GranularMetadataTransformation.kt @@ -97,17 +97,9 @@ internal sealed class MetadataDependencyResolution( internal class GranularMetadataTransformation( val project: Project, val kotlinSourceSet: KotlinSourceSet, - /** A list of scopes that the dependencies from [kotlinSourceSet] are treated as requested dependencies. */ - private val sourceSetRequestedScopes: List, /** A configuration that holds the dependencies of the appropriate scope for all Kotlin source sets in the project */ private val parentTransformations: Lazy> ) { - init { - require(KotlinDependencyScope.RUNTIME_ONLY_SCOPE !in sourceSetRequestedScopes) { - "KT-55230: RuntimeOnly scope is not supported for metadata dependency transformation" - } - } - val metadataDependencyResolutions: Iterable by lazy { doTransform() } // Keep parents of each dependency, too. We need a dependency's parent when it's an MPP's metadata module dependency: @@ -232,7 +224,6 @@ internal class GranularMetadataTransformation( val sourceSetVisibility = SourceSetVisibilityProvider(project).getVisibleSourceSets( kotlinSourceSet, - sourceSetRequestedScopes, if (projectStructureMetadata.isPublishedAsRoot) module else parent, module, projectStructureMetadata, resolvedToProject diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/MetadataDependencyTransformationTask.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/MetadataDependencyTransformationTask.kt index 6fac60f6be3..87018d0bb3b 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/MetadataDependencyTransformationTask.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/MetadataDependencyTransformationTask.kt @@ -89,7 +89,6 @@ open class MetadataDependencyTransformationTask GranularMetadataTransformation( project, kotlinSourceSet, - KotlinDependencyScope.compileScopes, lazy { dependsOnClosureWithInterCompilationDependencies(kotlinSourceSet).map { project.tasks.withType(MetadataDependencyTransformationTask::class.java) diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/SourceSetVisibilityProvider.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/SourceSetVisibilityProvider.kt index dc8f2501da8..e6b99390443 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/SourceSetVisibilityProvider.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/SourceSetVisibilityProvider.kt @@ -49,7 +49,6 @@ internal class SourceSetVisibilityProvider( */ fun getVisibleSourceSets( visibleFrom: KotlinSourceSet, - dependencyScopes: Iterable, resolvedRootMppDependency: ResolvedComponentResult?, resolvedMetadataDependency: ResolvedComponentResult, dependencyProjectStructureMetadata: KotlinProjectStructureMetadata, @@ -65,11 +64,7 @@ internal class SourceSetVisibilityProvider( val visiblePlatformVariantNames: Set = compilations .filter { it.target.platformType != KotlinPlatformType.common } - .flatMapTo(mutableSetOf()) { compilation -> - // To find out which variant the MPP dependency got resolved for each compilation, take the resolvable configurations - // that we have in the compilations: - dependencyScopes.mapNotNull { scope -> project.resolvableConfigurationFromCompilationByScope(compilation, scope) } - } + .map { compilation -> project.configurations.getByName(compilation.compileDependencyConfigurationName) } .mapTo(mutableSetOf()) { configuration -> val resolvedVariant = resolvedVariantsProvider.getResolvedVariantName(mppModuleIdentifier, configuration) ?.let { kotlinVariantNameFromPublishedVariantName(it) } @@ -128,18 +123,3 @@ internal class SourceSetVisibilityProvider( internal fun kotlinVariantNameFromPublishedVariantName(resolvedToVariantName: String): String = originalVariantNameFromPublished(resolvedToVariantName) ?: resolvedToVariantName - -private fun Project.resolvableConfigurationFromCompilationByScope( - compilation: KotlinCompilation<*>, - scope: KotlinDependencyScope -): Configuration? { - val configurationName = when (scope) { - KotlinDependencyScope.API_SCOPE, KotlinDependencyScope.IMPLEMENTATION_SCOPE, KotlinDependencyScope.COMPILE_ONLY_SCOPE -> compilation.compileDependencyConfigurationName - - KotlinDependencyScope.RUNTIME_ONLY_SCOPE -> - (compilation as? KotlinCompilationToRunnableFiles<*>)?.runtimeDependencyConfigurationName - ?: return null - } - - return project.configurations.getByName(configurationName) -} diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/sources/DefaultKotlinSourceSet.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/sources/DefaultKotlinSourceSet.kt index 56233f5d3a3..c427f6d4ffc 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/sources/DefaultKotlinSourceSet.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/sources/DefaultKotlinSourceSet.kt @@ -45,12 +45,18 @@ abstract class DefaultKotlinSourceSet @Inject constructor( override val runtimeOnlyConfigurationName: String get() = disambiguateName(RUNTIME_ONLY) + override val metadataLibrariesConfigurationName: String + get() = disambiguateName(lowerCamelCaseName("compile", METADATA_CONFIGURATION_NAME_SUFFIX)) + + @Deprecated("KT-55312") override val apiMetadataConfigurationName: String get() = lowerCamelCaseName(apiConfigurationName, METADATA_CONFIGURATION_NAME_SUFFIX) + @Deprecated("KT-55312") override val implementationMetadataConfigurationName: String get() = lowerCamelCaseName(implementationConfigurationName, METADATA_CONFIGURATION_NAME_SUFFIX) + @Deprecated("KT-55312") override val compileOnlyMetadataConfigurationName: String get() = lowerCamelCaseName(compileOnlyConfigurationName, METADATA_CONFIGURATION_NAME_SUFFIX) diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/sources/KotlinDependencyScope.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/sources/KotlinDependencyScope.kt index 88c401f18d6..fc32a167bfe 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/sources/KotlinDependencyScope.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/sources/KotlinDependencyScope.kt @@ -51,14 +51,4 @@ internal fun Project.compilationDependencyConfigurationByScope( COMPILE_ONLY_SCOPE -> compilation.compileOnlyConfigurationName RUNTIME_ONLY_SCOPE -> compilation.runtimeOnlyConfigurationName } - ) - -internal fun Project.sourceSetMetadataConfigurationByScope(sourceSet: KotlinSourceSet, scope: KotlinDependencyScope): Configuration? { - val configurationName = when (scope) { - API_SCOPE -> sourceSet.apiMetadataConfigurationName - IMPLEMENTATION_SCOPE -> sourceSet.implementationMetadataConfigurationName - COMPILE_ONLY_SCOPE -> sourceSet.compileOnlyMetadataConfigurationName - RUNTIME_ONLY_SCOPE -> return null // KT-55230: RuntimeOnly scope is not supported for metadata dependency transformation - } - return project.configurations.getByName(configurationName) -} + ) \ No newline at end of file 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 fa899344a0e..54a2271c97b 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 @@ -76,23 +76,24 @@ internal class DefaultKotlinSourceSetFactory( val dependencyConfigurationWithMetadata = with(sourceSet) { listOf( - apiConfigurationName to apiMetadataConfigurationName, - implementationConfigurationName to implementationMetadataConfigurationName, - compileOnlyConfigurationName to compileOnlyMetadataConfigurationName, + listOf(apiConfigurationName, implementationConfigurationName, compileOnlyConfigurationName) to metadataLibrariesConfigurationName, null to intransitiveMetadataConfigurationName ) } - dependencyConfigurationWithMetadata.forEach { (configurationName, metadataName) -> + dependencyConfigurationWithMetadata.forEach { (configurationNames, metadataName) -> project.configurations.maybeCreate(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 + isCanBeResolved = true - if (configurationName != null) { - extendsFrom(project.configurations.maybeCreate(configurationName)) + if (configurationNames != null) { + for (configurationName in configurationNames) { + extendsFrom(project.configurations.maybeCreate(configurationName)) + } } if (project.isKotlinGranularMetadataEnabled) { diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/metadata/KotlinMetadataTargetConfigurator.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/metadata/KotlinMetadataTargetConfigurator.kt index 1187ad38971..dbaca0d33dc 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/metadata/KotlinMetadataTargetConfigurator.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/metadata/KotlinMetadataTargetConfigurator.kt @@ -345,7 +345,7 @@ class KotlinMetadataTargetConfigurator : } compilation.compileDependencyFiles += createMetadataDependencyTransformationClasspath( - project.configurations.getByName(ALL_COMPILE_METADATA_CONFIGURATION_NAME), + project.configurations.getByName(compilation.defaultSourceSet.metadataLibrariesConfigurationName), compilation ) @@ -364,7 +364,6 @@ class KotlinMetadataTargetConfigurator : val granularMetadataTransformation = GranularMetadataTransformation( project = project, kotlinSourceSet = sourceSet, - sourceSetRequestedScopes = dependencyScopesToTransform, parentTransformations = lazy { dependsOnClosureWithInterCompilationDependencies(sourceSet).filterIsInstance() .map { it.compileDependenciesTransformationOrFail } @@ -378,21 +377,28 @@ class KotlinMetadataTargetConfigurator : val sourceSetDependencyConfigurationByScope = project.configurations.sourceSetDependencyConfigurationByScope(sourceSet, scope) if (isSourceSetPublished) { + project.addExtendsFromRelation( + sourceSet.metadataLibrariesConfigurationName, + sourceSetDependencyConfigurationByScope.name + ) + + // we need to include dependencies from sourceSetDependencyConfigurationByScope to + // ALL_COMPILE_METADATA_CONFIGURATION_NAME so then we can resolve consistently with it + // when resolving [sourceSet.metadataLibrariesConfigurationName] project.addExtendsFromRelation( ALL_COMPILE_METADATA_CONFIGURATION_NAME, sourceSetDependencyConfigurationByScope.name ) } - - val sourceSetMetadataConfigurationByScope = project.sourceSetMetadataConfigurationByScope(sourceSet, scope) - if (sourceSetMetadataConfigurationByScope != null) { - granularMetadataTransformation.applyToConfiguration(sourceSetMetadataConfigurationByScope) - project.addExtendsFromRelation( - sourceSetMetadataConfigurationByScope.name, - ALL_COMPILE_METADATA_CONFIGURATION_NAME - ) - } } + + val sourceSetMetadataConfiguration = project.configurations.getByName(sourceSet.metadataLibrariesConfigurationName) + // not necessary: because granularMetadataTransformation already created out of this configuration + // so there is no real logic to do dependency handling there. + // !!!! granularMetadataTransformation.applyToConfiguration(sourceSetMetadataConfiguration) + sourceSetMetadataConfiguration.shouldResolveConsistentlyWith( + project.configurations.getByName(ALL_COMPILE_METADATA_CONFIGURATION_NAME) + ) } /** Ensure that the [configuration] excludes the dependencies that are classified by this [GranularMetadataTransformation] as diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/AddIntransitiveMetadataDependency.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/AddIntransitiveMetadataDependency.kt index 360fcef6c2a..82c07876345 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/AddIntransitiveMetadataDependency.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/AddIntransitiveMetadataDependency.kt @@ -18,6 +18,6 @@ import org.jetbrains.kotlin.gradle.plugin.sources.DefaultKotlinSourceSet internal fun Project.addIntransitiveMetadataDependencyIfPossible(sourceSet: DefaultKotlinSourceSet, dependency: FileCollection) { val dependencyConfigurationName = if (project.isIntransitiveMetadataConfigurationEnabled) sourceSet.intransitiveMetadataConfigurationName - else sourceSet.implementationMetadataConfigurationName + else sourceSet.metadataLibrariesConfigurationName project.dependencies.add(dependencyConfigurationName, dependency) } diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/KotlinNativePlatformDependencies.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/KotlinNativePlatformDependencies.kt index 59c6dc90099..9a22ebe7dfb 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/KotlinNativePlatformDependencies.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/KotlinNativePlatformDependencies.kt @@ -97,7 +97,7 @@ private fun Project.addDependencies( if (isIdeDependency && sourceSet is DefaultKotlinSourceSet) { val metadataConfigurationName = if (project.isIntransitiveMetadataConfigurationEnabled) sourceSet.intransitiveMetadataConfigurationName - else sourceSet.implementationMetadataConfigurationName + else sourceSet.metadataLibrariesConfigurationName dependencies.add(metadataConfigurationName, libraries) } }