Remove the out-projection from kotlinSourceSets in kotlin extension

Gradle versions older than 4.10 could not correctly provide access to
the source set via delegation (i.e. `getting`, `creating` etc.) because
of the out-projection.

Remove the out-projection and expose just
`DomainObjectContainer<KotlinSourceSet>`, as under the hood we can still
use the `DefaultKotlinSourceSet` type for the items.
This commit is contained in:
Sergey Igushkin
2018-11-16 19:58:21 +03:00
parent 207bf7cf4a
commit a3b50e33b8
5 changed files with 20 additions and 16 deletions
@@ -37,18 +37,20 @@ class NewMultiplatformIT : BaseGradleIT() {
@Test
fun testLibAndApp() = doTestLibAndApp(
"sample-lib",
"sample-app",
gradleVersion
"sample-app"
)
@Test
fun testLibAndAppWithGradleKotlinDsl() = doTestLibAndApp(
"sample-lib-gradle-kotlin-dsl",
"sample-app-gradle-kotlin-dsl",
GradleVersionRequired.AtLeast("4.10.2") // Using a SNAPSHOT version in the plugins DSL requires 4.10
GradleVersionRequired.AtLeast("4.9") // earlier Gradle versions fail at accessors codegen
)
fun doTestLibAndApp(libProjectName: String, appProjectName: String, gradleVersionRequired: GradleVersionRequired) {
private fun doTestLibAndApp(
libProjectName: String, appProjectName: String,
gradleVersionRequired: GradleVersionRequired = gradleVersion
) {
val libProject = transformProjectWithPluginsDsl(libProjectName, gradleVersionRequired, "new-mpp-lib-and-app")
val appProject = transformProjectWithPluginsDsl(appProjectName, gradleVersionRequired, "new-mpp-lib-and-app")
val oldStyleAppProject = Project("sample-old-style-app", gradleVersionRequired, "new-mpp-lib-and-app")
@@ -234,7 +236,9 @@ class NewMultiplatformIT : BaseGradleIT() {
classesWithoutJava = getFilePathsSet("build/classes")
}
gradleBuildScript().modify { it.replace("presets.jvm", "presets.jvmWithJava") }
gradleBuildScript().modify {
it.replace("presets.jvm", "presets.jvmWithJava").replace("jvm(", "targetFromPreset(presets.jvmWithJava, ")
}
projectDir.resolve("src/main/java").apply {
mkdirs()
@@ -21,11 +21,11 @@ kotlin {
macosX64("macos64")
targets.all {
mavenPublication {
pom.withXml {
mavenPublication(Action<MavenPublication> {
pom.withXml(Action<XmlProvider> {
asNode().appendNode("name", "Sample MPP library")
}
}
})
})
}
sourceSets {
@@ -38,9 +38,9 @@ open class KotlinProjectExtension {
val experimental: ExperimentalExtension
get() = DslObject(this).extensions.getByType(ExperimentalExtension::class.java)
var sourceSets: NamedDomainObjectContainer<out KotlinSourceSet>
var sourceSets: NamedDomainObjectContainer<KotlinSourceSet>
@Suppress("UNCHECKED_CAST")
get() = DslObject(this).extensions.getByName("sourceSets") as NamedDomainObjectContainer<out KotlinSourceSet>
get() = DslObject(this).extensions.getByName("sourceSets") as NamedDomainObjectContainer<KotlinSourceSet>
internal set(value) {
DslObject(this).extensions.add("sourceSets", value)
}
@@ -16,6 +16,7 @@
package org.jetbrains.kotlin.gradle.plugin
import org.gradle.api.NamedDomainObjectFactory
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.api.internal.FeaturePreviews
@@ -28,7 +29,6 @@ import org.jetbrains.kotlin.gradle.dsl.*
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinMultiplatformPlugin
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinUsages
import org.jetbrains.kotlin.gradle.plugin.sources.DefaultKotlinSourceSetFactory
import org.jetbrains.kotlin.gradle.plugin.sources.KotlinSourceSetFactory
import org.jetbrains.kotlin.gradle.tasks.KOTLIN_COMPILER_EMBEDDABLE
import org.jetbrains.kotlin.gradle.tasks.KOTLIN_MODULE_GROUP
import java.io.FileNotFoundException
@@ -44,7 +44,7 @@ abstract class KotlinBasePluginWrapper(
open val projectExtensionClass: KClass<out KotlinProjectExtension> get() = KotlinProjectExtension::class
internal open fun kotlinSourceSetFactory(project: Project): KotlinSourceSetFactory<out KotlinSourceSet> =
internal open fun kotlinSourceSetFactory(project: Project): NamedDomainObjectFactory<KotlinSourceSet> =
DefaultKotlinSourceSetFactory(project, fileResolver)
override fun apply(project: Project) {
@@ -64,8 +64,8 @@ abstract class KotlinBasePluginWrapper(
val kotlinGradleBuildServices = KotlinGradleBuildServices.getInstance(project.gradle)
project.createKotlinExtension(projectExtensionClass).apply {
fun <T : KotlinSourceSet> kotlinSourceSetContainer(factory: KotlinSourceSetFactory<T>) =
project.container(factory.itemClass, factory)
fun kotlinSourceSetContainer(factory: NamedDomainObjectFactory<KotlinSourceSet>) =
project.container(KotlinSourceSet::class.java, factory)
project.kotlinExtension.sourceSets = kotlinSourceSetContainer(kotlinSourceSetFactory(project))
}
@@ -18,7 +18,7 @@ import java.io.File
internal abstract class KotlinSourceSetFactory<T : KotlinSourceSet> internal constructor(
protected val fileResolver: FileResolver,
protected val project: Project
) : NamedDomainObjectFactory<T> {
) : NamedDomainObjectFactory<KotlinSourceSet> {
abstract val itemClass: Class<T>