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
This commit is contained in:
Timofey Solonin
2024-02-27 10:57:04 +01:00
committed by Space Team
parent 848cca03c0
commit 9f6fb715dd
5 changed files with 44 additions and 22 deletions
@@ -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.
@@ -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,
@@ -19,7 +19,7 @@ internal class KotlinCompilationImplFactory(
DefaultKotlinCompilationSourceSetsContainerFactory(),
private val compilationDependencyConfigurationsFactory: KotlinCompilationDependencyConfigurationsFactory =
DefaultKotlinCompilationDependencyConfigurationsFactory.WithRuntime,
DefaultKotlinCompilationDependencyConfigurationsFactory.WithRuntime(),
private val compilationAssociator: KotlinCompilationAssociator =
DefaultKotlinCompilationAssociator,
@@ -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 {
@@ -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()