diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinMultiplatformPlugin.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinMultiplatformPlugin.kt index f67273e6f62..838f02f2aff 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinMultiplatformPlugin.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinMultiplatformPlugin.kt @@ -10,8 +10,6 @@ import org.gradle.api.Project import org.gradle.api.plugins.JavaBasePlugin import org.gradle.util.GradleVersion import org.jetbrains.kotlin.gradle.dsl.* -import org.jetbrains.kotlin.gradle.dsl.explicitApiModeAsCompilerArg -import org.jetbrains.kotlin.gradle.dsl.multiplatformExtension import org.jetbrains.kotlin.gradle.internal.customizeKotlinDependencies import org.jetbrains.kotlin.gradle.plugin.* import org.jetbrains.kotlin.gradle.plugin.hierarchy.orNull @@ -62,7 +60,7 @@ class KotlinMultiplatformPlugin : Plugin { configurePublishingWithMavenPublish(project) - kotlinMultiplatformExtension.targets.withType(AbstractKotlinTarget::class.java).all { applyUserDefinedAttributes(it) } + kotlinMultiplatformExtension.targets.withType(InternalKotlinTarget::class.java).all { applyUserDefinedAttributes(it) } // propagate compiler plugin options to the source set language settings setupAdditionalCompilerArguments(project) diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/applyUserDefinedAttributes.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/applyUserDefinedAttributes.kt index ec310122c3e..2c458294e21 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/applyUserDefinedAttributes.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/applyUserDefinedAttributes.kt @@ -6,8 +6,9 @@ package org.jetbrains.kotlin.gradle.plugin.mpp import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation +import org.jetbrains.kotlin.gradle.plugin.KotlinPluginLifecycle.Stage.AfterEvaluateBuildscript +import org.jetbrains.kotlin.gradle.plugin.launchInStage import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.copyAttributes -import org.jetbrains.kotlin.gradle.plugin.whenEvaluated /** @@ -15,37 +16,18 @@ import org.jetbrains.kotlin.gradle.plugin.whenEvaluated * 1. Output configurations of each target need the corresponding compilation's attributes (and, indirectly, the target's attributes) * 2. Resolvable configurations of each compilation need the compilation's attributes */ -internal fun applyUserDefinedAttributes(target: AbstractKotlinTarget) { - val project = target.project - project.whenEvaluated { - // To copy the attributes to the output configurations, find those output configurations and their producing compilations - // based on the target's components: - val outputConfigurationsWithCompilations = target.kotlinComponents.filterIsInstance().flatMap { kotlinVariant -> - kotlinVariant.usages.mapNotNull { usageContext -> - project.configurations.findByName(usageContext.dependencyConfigurationName)?.let { configuration -> - configuration to usageContext.compilation - } - } - }.toMutableList() - - // Add usages of android library when its variants are grouped by flavor - outputConfigurationsWithCompilations += target.kotlinComponents - .filterIsInstance() - .flatMap { variant -> variant.usages } - .mapNotNull { usage -> - val configuration = project.configurations.findByName(usage.dependencyConfigurationName) ?: return@mapNotNull null - configuration to usage.compilation - } - - outputConfigurationsWithCompilations.forEach { (configuration, compilation) -> - copyAttributes(compilation.attributes, configuration.attributes) +internal fun applyUserDefinedAttributes(target: InternalKotlinTarget) { + target.project.launchInStage(AfterEvaluateBuildscript) { + target.kotlinComponents.flatMap { it.internal.usages }.forEach { usage -> + val dependencyConfiguration = target.project.configurations.findByName(usage.dependencyConfigurationName) ?: return@forEach + copyAttributes(usage.compilation.attributes, dependencyConfiguration.attributes) } target.compilations.all { compilation -> val compilationAttributes = compilation.attributes compilation.allOwnedConfigurationsNames - .mapNotNull { configurationName -> target.project.configurations.findByName(configurationName) } + .mapNotNull { configurationName -> project.configurations.findByName(configurationName) } .forEach { configuration -> copyAttributes(compilationAttributes, configuration.attributes) } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/mppDependencyRewritingUtils.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/mppDependencyRewritingUtils.kt index 79a9d2b6673..66f0bf98f28 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/mppDependencyRewritingUtils.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/mppDependencyRewritingUtils.kt @@ -38,7 +38,7 @@ internal class PomDependenciesRewriter( // Get the dependencies mapping according to the component's UsageContexts: private val dependenciesMappingForEachUsageContext by project.provider { - (component as SoftwareComponentInternal).usages.filterIsInstance().mapNotNull { usage -> + component.internal.usages.toList().mapNotNull { usage -> // When maven scope is not set, we can shortcut immediately here, since no dependencies from that usage context // will be present in maven pom, e.g. from sourcesElements val mavenScope = usage.mavenScope ?: return@mapNotNull null @@ -130,7 +130,7 @@ private fun associateDependenciesWithActualModuleDependencies( } else -> when (mavenScope) { MavenScope.COMPILE -> compilation.compileDependencyConfigurationName - MavenScope.RUNTIME -> (compilation as KotlinCompilationToRunnableFiles).runtimeDependencyConfigurationName + MavenScope.RUNTIME -> compilation.runtimeDependencyConfigurationName ?: return emptyMap() } } ) @@ -162,8 +162,8 @@ private fun associateDependenciesWithActualModuleDependencies( val resolvedToConfiguration = resolved.configuration val dependencyTargetComponent: KotlinTargetComponent = run { - dependencyProjectKotlinExtension.targets.withType(AbstractKotlinTarget::class.java).forEach { target -> - target.kotlinComponents.forEach { component -> + dependencyProjectKotlinExtension.targets.forEach { target -> + target.internal.kotlinComponents.forEach { component -> if (component.findUsageContext(resolvedToConfiguration) != null) return@run component }