Add Gradle version specific accessor for BasePlugin configuration

^KT-47047 In Progress
This commit is contained in:
Yahor Berdnikau
2022-06-21 23:23:14 +02:00
parent 7630afd37d
commit 2260893142
11 changed files with 146 additions and 23 deletions
@@ -29,9 +29,9 @@ import org.jetbrains.kotlin.gradle.dsl.*
import org.jetbrains.kotlin.gradle.internal.KOTLIN_COMPILER_EMBEDDABLE
import org.jetbrains.kotlin.gradle.internal.KOTLIN_MODULE_GROUP
import org.jetbrains.kotlin.gradle.logging.kotlinDebug
import org.jetbrains.kotlin.gradle.plugin.internal.*
import org.jetbrains.kotlin.gradle.plugin.internal.BasePluginConfiguration
import org.jetbrains.kotlin.gradle.plugin.internal.DefaultJavaSourceSetsAccessorVariantFactory
import org.jetbrains.kotlin.gradle.plugin.internal.JavaSourceSetsAccessor
import org.jetbrains.kotlin.gradle.plugin.internal.MavenPluginConfigurator
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinMultiplatformPlugin
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinUsages
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KotlinPm20GradlePlugin
@@ -196,6 +196,11 @@ abstract class KotlinBasePluginWrapper : DefaultKotlinBasePlugin() {
JavaSourceSetsAccessor.JavaSourceSetsAccessorVariantFactory::class,
DefaultJavaSourceSetsAccessorVariantFactory()
)
factories.putIfAbsent(
BasePluginConfiguration.BasePluginConfigurationVariantFactory::class,
DefaultBasePluginConfigurationVariantFactory()
)
}
internal open fun createTestRegistry(project: Project) = KotlinTestsRegistry(project)
@@ -0,0 +1,43 @@
/*
* Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.gradle.plugin.internal
import org.gradle.api.Project
import org.gradle.api.file.DirectoryProperty
import org.gradle.api.plugins.BasePluginExtension
import org.gradle.api.provider.Property
import org.jetbrains.kotlin.gradle.plugin.VariantImplementationFactories
import org.jetbrains.kotlin.gradle.utils.getByType
/**
* Accessor for [BasePlugin] configuration.
*
* From Gradle 7.1 [org.gradle.api.plugins.BasePluginConvention] was replaced with [org.gradle.api.plugins.BasePluginExtension].
*/
internal interface BasePluginConfiguration {
val archivesName: Property<String>
val distsDirectory: DirectoryProperty
interface BasePluginConfigurationVariantFactory : VariantImplementationFactories.VariantImplementationFactory {
fun getInstance(project: Project): BasePluginConfiguration
}
}
internal class DefaultBasePluginConfigurationVariantFactory : BasePluginConfiguration.BasePluginConfigurationVariantFactory {
override fun getInstance(project: Project): BasePluginConfiguration {
return DefaultBasePluginConfiguration(project.extensions.getByType())
}
}
internal class DefaultBasePluginConfiguration(
private val basePluginExtension: BasePluginExtension
) : BasePluginConfiguration {
override val archivesName: Property<String>
get() = basePluginExtension.archivesName
override val distsDirectory: DirectoryProperty
get() = basePluginExtension.distsDirectory
}
@@ -153,7 +153,7 @@ open class DefaultCompilationDetails<T : KotlinCommonOptions>(
override val ownModuleName: String
get() {
val baseName = project.archivesName
val baseName = project.archivesName.orNull
?: project.name
val suffix = if (isMainCompilationData()) "" else "_$compilationPurpose"
return filterModuleName("$baseName$suffix")
@@ -46,7 +46,7 @@ class GradleKpmJvmVariantCompilationData(val variant: GradleKpmJvmVariant) : Gra
internal fun GradleKpmVariant.ownModuleName(): String {
val project = containingModule.project
val baseName = project.archivesName
val baseName = project.archivesName.orNull
?: project.name
val suffix = if (containingModule.moduleClassifier == null) "" else "_${containingModule.moduleClassifier}"
return filterModuleName("$baseName$suffix")
@@ -85,7 +85,7 @@ internal abstract class AbstractKotlinFragmentMetadataCompilationData<T : Kotlin
override val moduleName: String
get() { // FIXME deduplicate with ownModuleName
val baseName = project.archivesName
val baseName = project.archivesName.orNull
?: project.name
val suffix = if (module.moduleClassifier == null) "" else "_${module.moduleClassifier}"
return filterModuleName("$baseName$suffix")
@@ -8,10 +8,9 @@ package org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util
import org.gradle.api.Project
import org.gradle.api.artifacts.component.BuildIdentifier
import org.gradle.api.internal.project.ProjectInternal
import org.gradle.api.plugins.BasePluginConvention
import org.gradle.api.plugins.BasePluginExtension
import org.gradle.internal.build.BuildState
import org.jetbrains.kotlin.gradle.utils.isGradleVersionAtLeast
import org.jetbrains.kotlin.gradle.plugin.internal.BasePluginConfiguration
import org.jetbrains.kotlin.gradle.plugin.variantImplementationFactory
import org.jetbrains.kotlin.project.model.KpmModule
import org.jetbrains.kotlin.project.model.KpmLocalModuleIdentifier
@@ -26,19 +25,19 @@ fun Project.currentBuildId(): BuildIdentifier =
/**
* The base name to use for archive files.
*/
val Project.archivesName get() = if (isGradleVersionAtLeast(7, 1)) {
extensions.getByType(BasePluginExtension::class.java).archivesName.orNull
} else {
convention.findPlugin(BasePluginConvention::class.java)?.archivesBaseName
}
val Project.archivesName
get() = gradle
.variantImplementationFactory<BasePluginConfiguration.BasePluginConfigurationVariantFactory>()
.getInstance(this)
.archivesName
/**
* Returns the directory to generate TAR and ZIP archives into.
*
* @return The directory. Never returns null.
*/
val Project.distsDirectory get() = if (isGradleVersionAtLeast(7, 1)) {
extensions.getByType(BasePluginExtension::class.java).distsDirectory
} else {
convention.getPlugin(BasePluginConvention::class.java).distsDirectory
}
val Project.distsDirectory
get() = gradle
.variantImplementationFactory<BasePluginConfiguration.BasePluginConfigurationVariantFactory>()
.getInstance(this)
.distsDirectory
@@ -129,7 +129,7 @@ constructor(
@Nested
val output: KotlinWebpackOutput = KotlinWebpackOutput(
library = project.archivesName,
library = project.archivesName.orNull,
libraryTarget = KotlinWebpackOutput.Target.UMD,
globalObject = "this"
)
@@ -154,7 +154,7 @@ constructor(
}
private val defaultOutputFileName by lazy {
project.archivesName + ".js"
project.archivesName.orNull + ".js"
}
@get:Internal
@@ -12,6 +12,8 @@ import org.gradle.api.Project
import org.gradle.api.file.SourceDirectorySet
import org.gradle.api.model.ObjectFactory
import org.gradle.tooling.provider.model.ToolingModelBuilderRegistry
import org.jetbrains.kotlin.gradle.plugin.internal.BasePluginConfiguration
import org.jetbrains.kotlin.gradle.plugin.internal.BasePluginConfigurationG70
import org.jetbrains.kotlin.gradle.plugin.internal.JavaSourceSetsAccessor
import org.jetbrains.kotlin.gradle.plugin.internal.JavaSourceSetsAccessorG70
import javax.inject.Inject
@@ -138,4 +140,6 @@ private fun Project.registerVariantImplementations() {
val factories = VariantImplementationFactories.get(gradle)
factories[JavaSourceSetsAccessor.JavaSourceSetsAccessorVariantFactory::class] =
JavaSourceSetsAccessorG70.JavaSourceSetAccessorVariantFactoryG70()
factories[BasePluginConfiguration.BasePluginConfigurationVariantFactory::class] =
BasePluginConfigurationG70.BasePluginConfigurationVariantFactoryG70()
}
@@ -0,0 +1,36 @@
/*
* Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.gradle.plugin.internal
import org.gradle.api.Project
import org.gradle.api.file.DirectoryProperty
import org.gradle.api.model.ObjectFactory
import org.gradle.api.plugins.BasePluginConvention
import org.gradle.api.provider.Property
import org.jetbrains.kotlin.gradle.utils.chainedFinalizeValueOnRead
import org.jetbrains.kotlin.gradle.utils.propertyWithConvention
internal class BasePluginConfigurationG70(
private val basePluginConvention: BasePluginConvention,
private val objects: ObjectFactory
) : BasePluginConfiguration {
override val archivesName: Property<String>
get() = objects
.propertyWithConvention(basePluginConvention.archivesBaseName)
.chainedFinalizeValueOnRead()
override val distsDirectory: DirectoryProperty
get() = basePluginConvention.distsDirectory
internal class BasePluginConfigurationVariantFactoryG70 : BasePluginConfiguration.BasePluginConfigurationVariantFactory {
override fun getInstance(project: Project): BasePluginConfiguration {
return BasePluginConfigurationG70(
project.convention.getPlugin(BasePluginConvention::class.java),
project.objects
)
}
}
}
@@ -12,10 +12,8 @@ import org.gradle.api.Project
import org.gradle.api.file.SourceDirectorySet
import org.gradle.api.model.ObjectFactory
import org.gradle.tooling.provider.model.ToolingModelBuilderRegistry
import org.jetbrains.kotlin.gradle.plugin.internal.JavaSourceSetsAccessor
import org.jetbrains.kotlin.gradle.plugin.internal.*
import org.jetbrains.kotlin.gradle.plugin.internal.JavaSourceSetsAccessorG6
import org.jetbrains.kotlin.gradle.plugin.internal.MavenPluginConfigurator
import org.jetbrains.kotlin.gradle.plugin.internal.MavenPluginConfiguratorG6
import javax.inject.Inject
private const val PLUGIN_VARIANT_NAME = "main"
@@ -147,4 +145,6 @@ private fun Project.registerVariantImplementations() {
MavenPluginConfiguratorG6.Gradle6MavenPluginConfiguratorVariantFactory()
factories[JavaSourceSetsAccessor.JavaSourceSetsAccessorVariantFactory::class] =
JavaSourceSetsAccessorG6.JavaSourceSetAccessorVariantFactoryG70()
factories[BasePluginConfiguration.BasePluginConfigurationVariantFactory::class] =
BasePluginConfigurationG6.BasePluginConfigurationVariantFactoryG6()
}
@@ -0,0 +1,36 @@
/*
* Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.gradle.plugin.internal
import org.gradle.api.Project
import org.gradle.api.file.DirectoryProperty
import org.gradle.api.model.ObjectFactory
import org.gradle.api.plugins.BasePluginConvention
import org.gradle.api.provider.Property
import org.jetbrains.kotlin.gradle.utils.chainedFinalizeValueOnRead
import org.jetbrains.kotlin.gradle.utils.propertyWithConvention
internal class BasePluginConfigurationG6(
private val basePluginConvention: BasePluginConvention,
private val objects: ObjectFactory
) : BasePluginConfiguration {
override val archivesName: Property<String>
get() = objects
.propertyWithConvention(basePluginConvention.archivesBaseName)
.chainedFinalizeValueOnRead()
override val distsDirectory: DirectoryProperty
get() = basePluginConvention.distsDirectory
internal class BasePluginConfigurationVariantFactoryG6 : BasePluginConfiguration.BasePluginConfigurationVariantFactory {
override fun getInstance(project: Project): BasePluginConfiguration {
return BasePluginConfigurationG6(
project.convention.getPlugin(BasePluginConvention::class.java),
project.objects
)
}
}
}