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 bd56ea7c25d..f24ad18f265 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 @@ -121,9 +121,7 @@ internal class GranularMetadataTransformation( kotlinSourceSet.internal.resolvableMetadataConfiguration.incoming.dependencies } - internal val configurationToResolve: Configuration by lazy { - kotlinSourceSet.internal.resolvableMetadataConfiguration - } + internal val configurationToResolve: Configuration = kotlinSourceSet.internal.resolvableMetadataConfiguration private fun doTransform(): Iterable { val result = mutableListOf() 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 5f75b0e1d29..e061423901c 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 @@ -5,42 +5,57 @@ package org.jetbrains.kotlin.gradle.plugin.mpp +import org.gradle.api.Project import org.gradle.api.artifacts.Configuration +import org.gradle.api.provider.Provider import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.copyAttributes import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.markResolvable import org.jetbrains.kotlin.gradle.plugin.sources.InternalKotlinSourceSet +import org.jetbrains.kotlin.gradle.plugin.sources.METADATA_CONFIGURATION_NAME_SUFFIX +import org.jetbrains.kotlin.gradle.plugin.sources.disambiguateName import org.jetbrains.kotlin.gradle.plugin.sources.getVisibleSourceSetsFromAssociateCompilations -import org.jetbrains.kotlin.gradle.plugin.sources.withDependsOnClosure import org.jetbrains.kotlin.gradle.targets.metadata.ALL_COMPILE_METADATA_CONFIGURATION_NAME +import org.jetbrains.kotlin.gradle.utils.listProperty +import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName import org.jetbrains.kotlin.tooling.core.extrasLazyProperty +/** + * @see resolvableMetadataConfiguration + */ +internal val InternalKotlinSourceSet.resolvableMetadataConfigurationName: String + get() = disambiguateName(lowerCamelCaseName("resolvable", METADATA_CONFIGURATION_NAME_SUFFIX)) + /** * Represents a 'resolvable' configuration containing all dependencies in compile scope. * These dependencies are set up to resolve Kotlin Metadata (without transformation) and will resolve * consistently across the whole project. - * - * Creating this configuration will resolve dependency scope configurations on the given SourceSet. */ internal val InternalKotlinSourceSet.resolvableMetadataConfiguration: Configuration by extrasLazyProperty( "resolvableMetadataConfiguration" ) { - val configuration = project.configurations.detachedConfiguration() + assert(resolvableMetadataConfigurationName !in project.configurations.names) + val configuration = project.configurations.maybeCreate(resolvableMetadataConfigurationName) configuration.markResolvable() - ((getVisibleSourceSetsFromAssociateCompilations(this) + this).withDependsOnClosure).forEach { visibleSourceSet -> - configuration.dependencies.addAll( - project.configurations.getByName(visibleSourceSet.apiConfigurationName).incoming.dependencies - ) - - configuration.dependencies.addAll( - project.configurations.getByName(visibleSourceSet.implementationConfigurationName).incoming.dependencies - ) - - configuration.dependencies.addAll( - project.configurations.getByName(visibleSourceSet.compileOnlyConfigurationName).incoming.dependencies - ) + withDependsOnClosure.forAll { sourceSet -> + configuration.extendsFrom(project.configurations.getByName(sourceSet.apiConfigurationName)) + configuration.extendsFrom(project.configurations.getByName(sourceSet.implementationConfigurationName)) + configuration.extendsFrom(project.configurations.getByName(sourceSet.compileOnlyConfigurationName)) } + /** + * Adding dependencies from associate compilations using a listProvider, since we would like to defer + * the call to 'getVisibleSourceSetsFromAssociateCompilations' as much as possible (changes to the model might significantly + * change the result of this visible source sets) + */ + configuration.dependencies.addAllLater(project.listProvider { + getVisibleSourceSetsFromAssociateCompilations(this).flatMap { sourceSet -> + project.configurations.getByName(sourceSet.apiConfigurationName).allDependencies + + project.configurations.getByName(sourceSet.implementationConfigurationName).allDependencies + + project.configurations.getByName(sourceSet.compileOnlyConfigurationName).allDependencies + } + }) + val allCompileMetadataConfiguration = project.configurations.getByName(ALL_COMPILE_METADATA_CONFIGURATION_NAME) /* Ensure consistent dependency resolution result within the whole module */ @@ -49,3 +64,9 @@ internal val InternalKotlinSourceSet.resolvableMetadataConfiguration: Configurat configuration } + +private inline fun Project.listProvider(noinline provider: () -> List): Provider> { + return project.objects.listProperty().apply { + set(project.provider(provider)) + } +}