[mpp] Hack: Inherit KotlinProjectExtension in KotlinPm20ProjectExtension

Addition of checkers in previous commits lead to CCE when they call
'project.kotlinProjectExtension'. Change in this commit isn't
semantically sound, but allows to repair those tests cheaply
This commit is contained in:
Dmitry Savvinov
2023-04-06 10:08:00 +02:00
committed by Space Team
parent 97f77c2ecf
commit f5c4dffc3e
@@ -15,12 +15,14 @@ import org.gradle.api.publish.PublishingExtension
import org.gradle.api.publish.maven.MavenPublication
import org.gradle.tooling.provider.model.ToolingModelBuilderRegistry
import org.gradle.util.GradleVersion
import org.jetbrains.kotlin.gradle.dsl.KotlinProjectExtension
import org.jetbrains.kotlin.gradle.dsl.KotlinTopLevelExtension
import org.jetbrains.kotlin.gradle.dsl.pm20Extension
import org.jetbrains.kotlin.gradle.internal.customizeKotlinDependencies
import org.jetbrains.kotlin.gradle.kpm.idea.IdeaKpmProjectModelBuilder
import org.jetbrains.kotlin.gradle.kpm.idea.default
import org.jetbrains.kotlin.gradle.kpm.idea.locateOrRegisterIdeaKpmBuildProjectModelTask
import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet
import org.jetbrains.kotlin.gradle.utils.checkGradleCompatibility
import javax.inject.Inject
@@ -90,7 +92,22 @@ abstract class KotlinPm20GradlePlugin @Inject constructor(
fun rootPublicationComponentName(module: GradleKpmModule) =
module.disambiguateName("root")
open class KotlinPm20ProjectExtension(project: Project) : KotlinTopLevelExtension(project) {
// NB: inheriting `KotlinProjectExtension` is a hack, as well as overriding 'sourceSets'
// This is done because 'project.kotlinProjectExtension' casts extension to KotlinProjectExtension,
// resulting in CCE, and some code (like KotlinGradleProjectCheckers) that is launched universally
// in KPM and TCS actually calls this method, breaking KPM tests.
//
// Ideally, respective code should just treat top-level extensions more carefully, but as KPM
// is not in focus for now, we don't want to complicate the new code with those matters.
//
// Inheriting KotlinProjectExtension allows such code to not fail. When KPM work is resumed,
// this inheritance should be removed
open class KotlinPm20ProjectExtension(project: Project) : KotlinProjectExtension(project) {
override var sourceSets: NamedDomainObjectContainer<KotlinSourceSet>
get() = super.sourceSets
set(value) {
super.sourceSets = value
}
internal val kpmModelContainer = GradleKpmDefaultProjectModelContainer.create(project)