From 9f6fb715dde5af44d0c430538631d6a53a061e54 Mon Sep 17 00:00:00 2001 From: Timofey Solonin Date: Tue, 27 Feb 2024 10:57:04 +0100 Subject: [PATCH] Improve the creation of resolvable resources configuration * Remove type casting for KotlinJsIrTarget * Only create a resolvable configuration when the appropriate strategy is used ^KT-65540 --- .../diagnostics/KotlinToolingDiagnostics.kt | 2 +- ...lationDependencyConfigurationsFactories.kt | 47 ++++++++++++------- .../factory/KotlinCompilationImplFactory.kt | 2 +- .../resources/resolve/resolutionStrategies.kt | 3 +- .../js/ir/KotlinJsIrCompilationFactory.kt | 12 +++++ 5 files changed, 44 insertions(+), 22 deletions(-) diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/diagnostics/KotlinToolingDiagnostics.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/diagnostics/KotlinToolingDiagnostics.kt index fde8b71ef30..83679628163 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/diagnostics/KotlinToolingDiagnostics.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/diagnostics/KotlinToolingDiagnostics.kt @@ -814,7 +814,7 @@ object KotlinToolingDiagnostics { ) } - object MissingConfigurationForWasmTarget : ToolingDiagnosticFactory(ERROR) { + object MissingRuntimeDependencyConfigurationForWasmTarget : ToolingDiagnosticFactory(ERROR) { operator fun invoke(targetName: String) = build( """ Resources will not be resolved for $targetName as it is missing runtimeDependencyConfiguration. 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 2a26b27f723..27137efda0d 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 @@ -5,17 +5,20 @@ package org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.factory +import org.gradle.api.artifacts.Configuration import org.gradle.api.attributes.Bundling import org.gradle.api.attributes.Category import org.gradle.api.attributes.LibraryElements import org.gradle.api.attributes.Usage import org.jetbrains.kotlin.gradle.plugin.* +import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.Companion.kotlinPropertiesProvider import org.jetbrains.kotlin.gradle.plugin.mpp.* import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.DefaultKotlinCompilationConfigurationsContainer import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.KotlinCompilationConfigurationsContainer import org.jetbrains.kotlin.gradle.plugin.mpp.configureResourcesPublicationAttributes import org.jetbrains.kotlin.gradle.plugin.mpp.javaSourceSets import org.jetbrains.kotlin.gradle.plugin.mpp.resources.KotlinTargetResourcesPublicationImpl.Companion.RESOURCES_PATH +import org.jetbrains.kotlin.gradle.plugin.mpp.resources.resolve.KotlinTargetResourcesResolutionStrategy 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.* @@ -23,9 +26,16 @@ import org.jetbrains.kotlin.gradle.utils.* internal sealed class DefaultKotlinCompilationDependencyConfigurationsFactory : KotlinCompilationImplFactory.KotlinCompilationDependencyConfigurationsFactory { - object WithRuntime : DefaultKotlinCompilationDependencyConfigurationsFactory() { + class WithRuntime( + private val withResourcesConfigurationExtending: (runtimeDependencyConfiguration: Configuration?, compileDependencyConfiguration: Configuration) -> (Configuration?) = { _, _ -> null }, + ) : DefaultKotlinCompilationDependencyConfigurationsFactory() { override fun create(target: KotlinTarget, compilationName: String): KotlinCompilationConfigurationsContainer { - return KotlinCompilationDependencyConfigurationsContainer(target, compilationName, withRuntime = true) + return KotlinCompilationDependencyConfigurationsContainer( + target, + compilationName, + withRuntime = true, + withResourcesConfigurationExtending = withResourcesConfigurationExtending, + ) } } @@ -47,7 +57,7 @@ internal object NativeKotlinCompilationDependencyConfigurationsFactory : naming = naming, withRuntime = false, withHostSpecificMetadata = true, - withResources = true, + withResourcesConfigurationExtending = { _, compileDependencyConfiguration -> compileDependencyConfiguration }, compileClasspathConfigurationName = naming.name("compileKlibraries") ) } @@ -87,7 +97,8 @@ private const val compileClasspath = "compileClasspath" private const val runtimeClasspath = "runtimeClasspath" private fun KotlinCompilationDependencyConfigurationsContainer( - target: KotlinTarget, compilationName: String, withRuntime: Boolean, withHostSpecificMetadata: Boolean = false, withResources: Boolean = false, + target: KotlinTarget, compilationName: String, withRuntime: Boolean, withHostSpecificMetadata: Boolean = false, + withResourcesConfigurationExtending: (runtimeDependencyConfiguration: Configuration?, compileDependencyConfiguration: Configuration) -> (Configuration?) = { _, _ -> null }, naming: ConfigurationNaming = ConfigurationNaming.Default(target, compilationName), apiConfigurationName: String = naming.name(compilation, API), implementationConfigurationName: String = naming.name(compilation, IMPLEMENTATION), @@ -204,22 +215,22 @@ private fun KotlinCompilationDependencyConfigurationsContainer( description = "Kotlin compiler plugins for $compilation" } - val resourcesConfiguration = if (withResources || target is KotlinJsIrTarget) { - target.project.configurations.maybeCreateResolvable(resourcesPathConfigurationName).apply { - // Inherit from compile dependency configuration, i.e. from the configuration that consumes apiElements - if (target is KotlinJsIrTarget) { - extendsFrom(runtimeDependencyConfiguration) - } else { - extendsFrom(compileDependencyConfiguration) + val resourcesConfiguration = when (target.project.kotlinPropertiesProvider.mppResourcesResolutionStrategy) { + KotlinTargetResourcesResolutionStrategy.ResourcesConfiguration -> withResourcesConfigurationExtending( + runtimeDependencyConfiguration, + compileDependencyConfiguration, + )?.let { configurationToExtend -> + target.project.configurations.maybeCreateResolvable(resourcesPathConfigurationName).apply { + extendsFrom(configurationToExtend) + isVisible = false + + configureResourcesPublicationAttributes(target) + + description = "Kotlin resources for $compilation" } - - isVisible = false - - configureResourcesPublicationAttributes(target) - - description = "Kotlin resources for $compilation" } - } else null + KotlinTargetResourcesResolutionStrategy.VariantReselection -> null + } return DefaultKotlinCompilationConfigurationsContainer( deprecatedCompileConfiguration = deprecatedCompileConfiguration, diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/compilationImpl/factory/KotlinCompilationImplFactory.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/compilationImpl/factory/KotlinCompilationImplFactory.kt index 7b49af27a79..7ee1aa37619 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/compilationImpl/factory/KotlinCompilationImplFactory.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/compilationImpl/factory/KotlinCompilationImplFactory.kt @@ -19,7 +19,7 @@ internal class KotlinCompilationImplFactory( DefaultKotlinCompilationSourceSetsContainerFactory(), private val compilationDependencyConfigurationsFactory: KotlinCompilationDependencyConfigurationsFactory = - DefaultKotlinCompilationDependencyConfigurationsFactory.WithRuntime, + DefaultKotlinCompilationDependencyConfigurationsFactory.WithRuntime(), private val compilationAssociator: KotlinCompilationAssociator = DefaultKotlinCompilationAssociator, diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/resources/resolve/resolutionStrategies.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/resources/resolve/resolutionStrategies.kt index ee90dbf4aeb..c4bf1fbbd9f 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/resources/resolve/resolutionStrategies.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/resources/resolve/resolutionStrategies.kt @@ -12,7 +12,6 @@ import org.jetbrains.kotlin.gradle.plugin.diagnostics.reportDiagnostic import org.jetbrains.kotlin.gradle.plugin.mpp.configureResourcesPublicationAttributes import org.jetbrains.kotlin.gradle.plugin.mpp.internal import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrTarget -import org.jetbrains.kotlin.gradle.utils.copyAttributesTo enum class KotlinTargetResourcesResolutionStrategy { VariantReselection, @@ -27,7 +26,7 @@ enum class KotlinTargetResourcesResolutionStrategy { compilation.internal.configurations.runtimeDependencyConfiguration ?: return compilation.project.files().also { compilation.project.reportDiagnostic( - KotlinToolingDiagnostics.MissingConfigurationForWasmTarget(compilation.target.name) + KotlinToolingDiagnostics.MissingRuntimeDependencyConfigurationForWasmTarget(compilation.target.name) ) } } else { diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrCompilationFactory.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrCompilationFactory.kt index c5e04e900ff..f99f161ce2b 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrCompilationFactory.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrCompilationFactory.kt @@ -6,6 +6,8 @@ package org.jetbrains.kotlin.gradle.targets.js.ir import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType +import org.jetbrains.kotlin.gradle.plugin.diagnostics.KotlinToolingDiagnostics +import org.jetbrains.kotlin.gradle.plugin.diagnostics.reportDiagnostic import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinCompilationFactory import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.DefaultKotlinCompilationFriendPathsResolver import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.DefaultKotlinCompilationPreConfigure @@ -29,6 +31,16 @@ class KotlinJsIrCompilationFactory internal constructor( target.project.files() } ), + compilationDependencyConfigurationsFactory = DefaultKotlinCompilationDependencyConfigurationsFactory.WithRuntime( + withResourcesConfigurationExtending = { runtimeDependencyConfiguration, _ -> + if (runtimeDependencyConfiguration == null) { + project.reportDiagnostic( + KotlinToolingDiagnostics.MissingRuntimeDependencyConfigurationForWasmTarget(target.name,) + ) + } + runtimeDependencyConfiguration + } + ), preConfigureAction = DefaultKotlinCompilationPreConfigure + { compilation -> if (compilation.platformType == KotlinPlatformType.wasm && compilation.isMain()) { val artifactNameAppendix = (compilation.target as KotlinJsIrTarget).wasmDecamelizedDefaultNameOrNull()