[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.model.builder.KotlinModelBuilder
import org.jetbrains.kotlin.gradle.plugin.internal.JavaSourceSetsAccessor import org.jetbrains.kotlin.gradle.plugin.internal.JavaSourceSetsAccessor
import org.jetbrains.kotlin.gradle.plugin.internal.MavenPluginConfigurator 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.plugin.mpp.*
import org.jetbrains.kotlin.gradle.tasks.InspectClassesForMultiModuleIC import org.jetbrains.kotlin.gradle.tasks.InspectClassesForMultiModuleIC
import org.jetbrains.kotlin.gradle.tasks.KotlinTasksProvider import org.jetbrains.kotlin.gradle.tasks.KotlinTasksProvider
@@ -186,12 +187,10 @@ internal abstract class AbstractKotlinPlugin(
kotlinSourceSet.kotlin.source(javaSourceSet.java) kotlinSourceSet.kotlin.source(javaSourceSet.java)
@Suppress("DEPRECATION") @Suppress("DEPRECATION")
kotlinCompilation.source(kotlinSourceSet) kotlinCompilation.source(kotlinSourceSet)
@Suppress("DEPRECATION") project.compatibilityConventionRegistrar.addConvention(javaSourceSet, kotlinSourceSetDslName, kotlinSourceSet)
javaSourceSet.addConvention(kotlinSourceSetDslName, kotlinSourceSet)
javaSourceSet.addExtension(kotlinSourceSetDslName, kotlinSourceSet.kotlin) javaSourceSet.addExtension(kotlinSourceSetDslName, kotlinSourceSet.kotlin)
} else { } else {
@Suppress("DEPRECATION") project.compatibilityConventionRegistrar.addConvention(javaSourceSet, kotlinSourceSetDslName, kotlinCompilation.defaultSourceSet)
javaSourceSet.addConvention(kotlinSourceSetDslName, kotlinCompilation.defaultSourceSet)
javaSourceSet.addExtension(kotlinSourceSetDslName, kotlinCompilation.defaultSourceSet.kotlin) javaSourceSet.addExtension(kotlinSourceSetDslName, kotlinCompilation.defaultSourceSet.kotlin)
} }
} }
@@ -178,6 +178,11 @@ abstract class DefaultKotlinBasePlugin : KotlinBasePlugin {
ProjectIsolationStartParameterAccessor.Factory::class, ProjectIsolationStartParameterAccessor.Factory::class,
DefaultProjectIsolationStartParameterAccessorVariantFactory() DefaultProjectIsolationStartParameterAccessorVariantFactory()
) )
factories.putIfAbsent(
CompatibilityConventionRegistrar.Factory::class,
DefaultCompatibilityConventionRegistrar.Factory()
)
} }
protected fun setupAttributeMatchingStrategy( protected fun setupAttributeMatchingStrategy(
@@ -22,22 +22,6 @@ import org.gradle.api.internal.HasConvention
import org.gradle.api.plugins.ExtensionAware import org.gradle.api.plugins.ExtensionAware
import org.gradle.api.plugins.ExtraPropertiesExtension 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) = internal inline fun <reified T : Any> Any.addExtension(name: String, extension: T) =
(this as ExtensionAware).extensions.add(T::class.java, name, extension) (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 com.android.build.gradle.api.AndroidSourceSet
import org.jetbrains.kotlin.gradle.plugin.* import org.jetbrains.kotlin.gradle.plugin.*
import org.jetbrains.kotlin.gradle.plugin.internal.compatibilityConventionRegistrar
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinAndroidTarget import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinAndroidTarget
/* /*
@@ -16,6 +17,6 @@ from this KotlinSourceSet. This mechanism is deprecated.
@Suppress("DEPRECATION") @Suppress("DEPRECATION")
internal object GradleConventionAddKotlinSourcesToAndroidSourceSetConfigurator : KotlinAndroidSourceSetConfigurator { internal object GradleConventionAddKotlinSourcesToAndroidSourceSetConfigurator : KotlinAndroidSourceSetConfigurator {
override fun configure(target: KotlinAndroidTarget, kotlinSourceSet: KotlinSourceSet, androidSourceSet: AndroidSourceSet) { 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() ArtifactTypeAttributeAccessorG70.ArtifactTypeAttributeAccessorVariantFactoryG70()
factories[ProjectIsolationStartParameterAccessor.Factory::class] = factories[ProjectIsolationStartParameterAccessor.Factory::class] =
ProjectIsolationStartParameterAccessorG70.Factory() 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() ArtifactTypeAttributeAccessorG71.ArtifactTypeAttributeAccessorVariantFactoryG71()
factories[ProjectIsolationStartParameterAccessor.Factory::class] = factories[ProjectIsolationStartParameterAccessor.Factory::class] =
ProjectIsolationStartParameterAccessorG71.Factory() 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() MppTestReportHelperG74.MppTestReportHelperVariantFactoryG74()
factories[ProjectIsolationStartParameterAccessor.Factory::class] = factories[ProjectIsolationStartParameterAccessor.Factory::class] =
ProjectIsolationStartParameterAccessorG74.Factory() 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.file.SourceDirectorySet
import org.gradle.api.model.ObjectFactory import org.gradle.api.model.ObjectFactory
import org.gradle.tooling.provider.model.ToolingModelBuilderRegistry import org.gradle.tooling.provider.model.ToolingModelBuilderRegistry
import org.jetbrains.kotlin.gradle.plugin.internal.MppTestReportHelper import org.jetbrains.kotlin.gradle.plugin.internal.*
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 javax.inject.Inject import javax.inject.Inject
private const val PLUGIN_VARIANT_NAME = "gradle75" private const val PLUGIN_VARIANT_NAME = "gradle75"
@@ -154,4 +151,6 @@ private fun Project.registerVariantImplementations() {
MppTestReportHelperG75.MppTestReportHelperVariantFactoryG75() MppTestReportHelperG75.MppTestReportHelperVariantFactoryG75()
factories[ProjectIsolationStartParameterAccessor.Factory::class] = factories[ProjectIsolationStartParameterAccessor.Factory::class] =
ProjectIsolationStartParameterAccessorG75.Factory() 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.file.SourceDirectorySet
import org.gradle.api.model.ObjectFactory import org.gradle.api.model.ObjectFactory
import org.gradle.tooling.provider.model.ToolingModelBuilderRegistry import org.gradle.tooling.provider.model.ToolingModelBuilderRegistry
import org.jetbrains.kotlin.gradle.plugin.internal.ProjectIsolationStartParameterAccessor import org.jetbrains.kotlin.gradle.plugin.internal.*
import org.jetbrains.kotlin.gradle.plugin.internal.ProjectIsolationStartParameterAccessorG76
import javax.inject.Inject import javax.inject.Inject
private const val PLUGIN_VARIANT_NAME = "gradle76" private const val PLUGIN_VARIANT_NAME = "gradle76"
@@ -151,4 +150,6 @@ private fun Project.registerVariantImplementations() {
val factories = VariantImplementationFactoriesConfigurator.get(gradle) val factories = VariantImplementationFactoriesConfigurator.get(gradle)
factories[ProjectIsolationStartParameterAccessor.Factory::class] = factories[ProjectIsolationStartParameterAccessor.Factory::class] =
ProjectIsolationStartParameterAccessorG76.Factory() 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.file.SourceDirectorySet
import org.gradle.api.model.ObjectFactory import org.gradle.api.model.ObjectFactory
import org.gradle.tooling.provider.model.ToolingModelBuilderRegistry import org.gradle.tooling.provider.model.ToolingModelBuilderRegistry
import org.jetbrains.kotlin.gradle.plugin.internal.*
import javax.inject.Inject import javax.inject.Inject
private const val PLUGIN_VARIANT_NAME = "gradle80" private const val PLUGIN_VARIANT_NAME = "gradle80"
@@ -144,7 +145,8 @@ open class KotlinApiPlugin : KotlinBaseApiPlugin() {
} }
} }
@Suppress("UnusedReceiverParameter")
private fun Project.registerVariantImplementations() { 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() { 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() ArtifactTypeAttributeAccessorG6.ArtifactTypeAttributeAccessorVariantFactoryG6()
factories[ProjectIsolationStartParameterAccessor.Factory::class] = factories[ProjectIsolationStartParameterAccessor.Factory::class] =
ProjectIsolationStartParameterAccessorG6.Factory() 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()
}
}