[Gradle, MPP] Register the kotlin source set convention only for Gradle <= 8.1

#KT-52976 Fixed
This commit is contained in:
Alexander.Likhachev
2023-05-08 18:52:54 +02:00
committed by Space Team
parent 4ec48cfb82
commit d9927214e1
21 changed files with 225 additions and 31 deletions
@@ -24,6 +24,7 @@ import org.jetbrains.kotlin.gradle.internal.customizeKotlinDependencies
import org.jetbrains.kotlin.gradle.model.builder.KotlinModelBuilder
import org.jetbrains.kotlin.gradle.plugin.internal.JavaSourceSetsAccessor
import org.jetbrains.kotlin.gradle.plugin.internal.MavenPluginConfigurator
import org.jetbrains.kotlin.gradle.plugin.internal.compatibilityConventionRegistrar
import org.jetbrains.kotlin.gradle.plugin.mpp.*
import org.jetbrains.kotlin.gradle.tasks.InspectClassesForMultiModuleIC
import org.jetbrains.kotlin.gradle.tasks.KotlinTasksProvider
@@ -186,12 +187,10 @@ internal abstract class AbstractKotlinPlugin(
kotlinSourceSet.kotlin.source(javaSourceSet.java)
@Suppress("DEPRECATION")
kotlinCompilation.source(kotlinSourceSet)
@Suppress("DEPRECATION")
javaSourceSet.addConvention(kotlinSourceSetDslName, kotlinSourceSet)
project.compatibilityConventionRegistrar.addConvention(javaSourceSet, kotlinSourceSetDslName, kotlinSourceSet)
javaSourceSet.addExtension(kotlinSourceSetDslName, kotlinSourceSet.kotlin)
} else {
@Suppress("DEPRECATION")
javaSourceSet.addConvention(kotlinSourceSetDslName, kotlinCompilation.defaultSourceSet)
project.compatibilityConventionRegistrar.addConvention(javaSourceSet, kotlinSourceSetDslName, kotlinCompilation.defaultSourceSet)
javaSourceSet.addExtension(kotlinSourceSetDslName, kotlinCompilation.defaultSourceSet.kotlin)
}
}
@@ -178,6 +178,11 @@ abstract class DefaultKotlinBasePlugin : KotlinBasePlugin {
ProjectIsolationStartParameterAccessor.Factory::class,
DefaultProjectIsolationStartParameterAccessorVariantFactory()
)
factories.putIfAbsent(
CompatibilityConventionRegistrar.Factory::class,
DefaultCompatibilityConventionRegistrar.Factory()
)
}
protected fun setupAttributeMatchingStrategy(
@@ -22,22 +22,6 @@ import org.gradle.api.internal.HasConvention
import org.gradle.api.plugins.ExtensionAware
import org.gradle.api.plugins.ExtraPropertiesExtension
@Deprecated("Conventions are deprecated in Gradle")
internal inline fun <reified T : Any> Any.addConvention(name: String, plugin: T) {
// Verifying conventions are still available via reflection,
// so Gradle could remove them in Gradle 8.0 release
val conventionsIsAvailable = try {
Class.forName("org.gradle.api.internal.HasConvention")
true
} catch (_: ClassNotFoundException) {
false
}
if (conventionsIsAvailable) {
(this as HasConvention).convention.plugins[name] = plugin
}
}
internal inline fun <reified T : Any> Any.addExtension(name: String, extension: T) =
(this as ExtensionAware).extensions.add(T::class.java, name, extension)
@@ -0,0 +1,38 @@
/*
* Copyright 2010-2023 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.jetbrains.kotlin.gradle.plugin.VariantImplementationFactories
import org.jetbrains.kotlin.gradle.plugin.variantImplementationFactory
/**
* The concept of conventions in Gradle is outdated and superseded by extensions.
* However, KGP has to maintain a few conventions for compatibility with old versions of AGP and the `kotlin-dsl` plugin.
* This registrar adds conventions for the Gradle versions < 8.2, while for Gradle 8.2+ it does nothing.
*/
internal interface CompatibilityConventionRegistrar {
fun addConvention(subject: Any, name: String, plugin: Any)
interface Factory : VariantImplementationFactories.VariantImplementationFactory {
fun getInstance(): CompatibilityConventionRegistrar
}
}
internal class DefaultCompatibilityConventionRegistrar : CompatibilityConventionRegistrar {
override fun addConvention(subject: Any, name: String, plugin: Any) {
// no-op
}
class Factory : CompatibilityConventionRegistrar.Factory {
override fun getInstance() = DefaultCompatibilityConventionRegistrar()
}
}
internal val Project.compatibilityConventionRegistrar
get() = variantImplementationFactory<CompatibilityConventionRegistrar.Factory>()
.getInstance()
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.gradle.plugin.sources.android.configurator
import com.android.build.gradle.api.AndroidSourceSet
import org.jetbrains.kotlin.gradle.plugin.*
import org.jetbrains.kotlin.gradle.plugin.internal.compatibilityConventionRegistrar
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinAndroidTarget
/*
@@ -16,6 +17,6 @@ from this KotlinSourceSet. This mechanism is deprecated.
@Suppress("DEPRECATION")
internal object GradleConventionAddKotlinSourcesToAndroidSourceSetConfigurator : KotlinAndroidSourceSetConfigurator {
override fun configure(target: KotlinAndroidTarget, kotlinSourceSet: KotlinSourceSet, androidSourceSet: AndroidSourceSet) {
androidSourceSet.addConvention(KOTLIN_DSL_NAME, kotlinSourceSet)
target.project.compatibilityConventionRegistrar.addConvention(androidSourceSet, KOTLIN_DSL_NAME, kotlinSourceSet)
}
}
@@ -161,4 +161,6 @@ private fun Project.registerVariantImplementations() {
ArtifactTypeAttributeAccessorG70.ArtifactTypeAttributeAccessorVariantFactoryG70()
factories[ProjectIsolationStartParameterAccessor.Factory::class] =
ProjectIsolationStartParameterAccessorG70.Factory()
factories[CompatibilityConventionRegistrar.Factory::class] =
CompatibilityConventionRegistrarG70.Factory()
}
@@ -0,0 +1,18 @@
/*
* 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.internal.HasConvention
internal class CompatibilityConventionRegistrarG70 : CompatibilityConventionRegistrar {
override fun addConvention(subject: Any, name: String, plugin: Any) {
(subject as HasConvention).convention.plugins[name] = plugin
}
internal class Factory : CompatibilityConventionRegistrar.Factory {
override fun getInstance(): CompatibilityConventionRegistrar = CompatibilityConventionRegistrarG70()
}
}
@@ -162,4 +162,6 @@ private fun Project.registerVariantImplementations() {
ArtifactTypeAttributeAccessorG71.ArtifactTypeAttributeAccessorVariantFactoryG71()
factories[ProjectIsolationStartParameterAccessor.Factory::class] =
ProjectIsolationStartParameterAccessorG71.Factory()
factories[CompatibilityConventionRegistrar.Factory::class] =
CompatibilityConventionRegistrarG71.Factory()
}
@@ -0,0 +1,20 @@
/*
* 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.
*/
@file:Suppress("DEPRECATION")
package org.jetbrains.kotlin.gradle.plugin.internal
import org.gradle.api.internal.HasConvention
internal class CompatibilityConventionRegistrarG71 : CompatibilityConventionRegistrar {
override fun addConvention(subject: Any, name: String, plugin: Any) {
(subject as HasConvention).convention.plugins[name] = plugin
}
internal class Factory : CompatibilityConventionRegistrar.Factory {
override fun getInstance(): CompatibilityConventionRegistrar = CompatibilityConventionRegistrarG71()
}
}
@@ -151,4 +151,6 @@ private fun Project.registerVariantImplementations() {
MppTestReportHelperG74.MppTestReportHelperVariantFactoryG74()
factories[ProjectIsolationStartParameterAccessor.Factory::class] =
ProjectIsolationStartParameterAccessorG74.Factory()
factories[CompatibilityConventionRegistrar.Factory::class] =
CompatibilityConventionRegistrarG74.Factory()
}
@@ -0,0 +1,20 @@
/*
* 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.
*/
@file:Suppress("DEPRECATION")
package org.jetbrains.kotlin.gradle.plugin.internal
import org.gradle.api.internal.HasConvention
internal class CompatibilityConventionRegistrarG74 : CompatibilityConventionRegistrar {
override fun addConvention(subject: Any, name: String, plugin: Any) {
(subject as HasConvention).convention.plugins[name] = plugin
}
internal class Factory : CompatibilityConventionRegistrar.Factory {
override fun getInstance(): CompatibilityConventionRegistrar = CompatibilityConventionRegistrarG74()
}
}
@@ -12,10 +12,7 @@ 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.MppTestReportHelper
import org.jetbrains.kotlin.gradle.plugin.internal.MppTestReportHelperG75
import org.jetbrains.kotlin.gradle.plugin.internal.ProjectIsolationStartParameterAccessor
import org.jetbrains.kotlin.gradle.plugin.internal.ProjectIsolationStartParameterAccessorG75
import org.jetbrains.kotlin.gradle.plugin.internal.*
import javax.inject.Inject
private const val PLUGIN_VARIANT_NAME = "gradle75"
@@ -154,4 +151,6 @@ private fun Project.registerVariantImplementations() {
MppTestReportHelperG75.MppTestReportHelperVariantFactoryG75()
factories[ProjectIsolationStartParameterAccessor.Factory::class] =
ProjectIsolationStartParameterAccessorG75.Factory()
factories[CompatibilityConventionRegistrar.Factory::class] =
CompatibilityConventionRegistrarG75.Factory()
}
@@ -0,0 +1,20 @@
/*
* 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.
*/
@file:Suppress("DEPRECATION")
package org.jetbrains.kotlin.gradle.plugin.internal
import org.gradle.api.internal.HasConvention
internal class CompatibilityConventionRegistrarG75 : CompatibilityConventionRegistrar {
override fun addConvention(subject: Any, name: String, plugin: Any) {
(subject as HasConvention).convention.plugins[name] = plugin
}
internal class Factory : CompatibilityConventionRegistrar.Factory {
override fun getInstance(): CompatibilityConventionRegistrar = CompatibilityConventionRegistrarG75()
}
}
@@ -12,8 +12,7 @@ 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.ProjectIsolationStartParameterAccessor
import org.jetbrains.kotlin.gradle.plugin.internal.ProjectIsolationStartParameterAccessorG76
import org.jetbrains.kotlin.gradle.plugin.internal.*
import javax.inject.Inject
private const val PLUGIN_VARIANT_NAME = "gradle76"
@@ -151,4 +150,6 @@ private fun Project.registerVariantImplementations() {
val factories = VariantImplementationFactoriesConfigurator.get(gradle)
factories[ProjectIsolationStartParameterAccessor.Factory::class] =
ProjectIsolationStartParameterAccessorG76.Factory()
factories[CompatibilityConventionRegistrar.Factory::class] =
CompatibilityConventionRegistrarG76.Factory()
}
@@ -0,0 +1,20 @@
/*
* 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.
*/
@file:Suppress("DEPRECATION")
package org.jetbrains.kotlin.gradle.plugin.internal
import org.gradle.api.internal.HasConvention
internal class CompatibilityConventionRegistrarG76 : CompatibilityConventionRegistrar {
override fun addConvention(subject: Any, name: String, plugin: Any) {
(subject as HasConvention).convention.plugins[name] = plugin
}
internal class Factory : CompatibilityConventionRegistrar.Factory {
override fun getInstance(): CompatibilityConventionRegistrar = CompatibilityConventionRegistrarG76()
}
}
@@ -12,6 +12,7 @@ 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.*
import javax.inject.Inject
private const val PLUGIN_VARIANT_NAME = "gradle80"
@@ -144,7 +145,8 @@ open class KotlinApiPlugin : KotlinBaseApiPlugin() {
}
}
@Suppress("UnusedReceiverParameter")
private fun Project.registerVariantImplementations() {
val factories = VariantImplementationFactoriesConfigurator.get(gradle)
factories[CompatibilityConventionRegistrar.Factory::class] =
CompatibilityConventionRegistrarG80.Factory()
}
@@ -0,0 +1,20 @@
/*
* 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.
*/
@file:Suppress("DEPRECATION")
package org.jetbrains.kotlin.gradle.plugin.internal
import org.gradle.api.internal.HasConvention
internal class CompatibilityConventionRegistrarG80 : CompatibilityConventionRegistrar {
override fun addConvention(subject: Any, name: String, plugin: Any) {
(subject as HasConvention).convention.plugins[name] = plugin
}
internal class Factory : CompatibilityConventionRegistrar.Factory {
override fun getInstance(): CompatibilityConventionRegistrar = CompatibilityConventionRegistrarG80()
}
}
@@ -145,7 +145,8 @@ open class KotlinApiPlugin : KotlinBaseApiPlugin() {
}
}
@Suppress("UnusedReceiverParameter")
private fun Project.registerVariantImplementations() {
val factories = VariantImplementationFactoriesConfigurator.get(gradle)
factories[CompatibilityConventionRegistrar.Factory::class] =
CompatibilityConventionRegistrarG81.Factory()
}
@@ -0,0 +1,20 @@
/*
* Copyright 2010-2023 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.
*/
@file:Suppress("DEPRECATION")
package org.jetbrains.kotlin.gradle.plugin.internal
import org.gradle.api.internal.HasConvention
internal class CompatibilityConventionRegistrarG81 : CompatibilityConventionRegistrar {
override fun addConvention(subject: Any, name: String, plugin: Any) {
(subject as HasConvention).convention.plugins[name] = plugin
}
internal class Factory : CompatibilityConventionRegistrar.Factory {
override fun getInstance(): CompatibilityConventionRegistrar = CompatibilityConventionRegistrarG81()
}
}
@@ -167,4 +167,6 @@ private fun Project.registerVariantImplementations() {
ArtifactTypeAttributeAccessorG6.ArtifactTypeAttributeAccessorVariantFactoryG6()
factories[ProjectIsolationStartParameterAccessor.Factory::class] =
ProjectIsolationStartParameterAccessorG6.Factory()
factories[CompatibilityConventionRegistrar.Factory::class] =
CompatibilityConventionRegistrarG6.Factory()
}
@@ -0,0 +1,18 @@
/*
* 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.internal.HasConvention
internal class CompatibilityConventionRegistrarG6 : CompatibilityConventionRegistrar {
override fun addConvention(subject: Any, name: String, plugin: Any) {
(subject as HasConvention).convention.plugins[name] = plugin
}
internal class Factory : CompatibilityConventionRegistrar.Factory {
override fun getInstance(): CompatibilityConventionRegistrar = CompatibilityConventionRegistrarG6()
}
}